GD32F1 Core. Added enhancements from @victor_pv to disable USB prescaler and re-enable so that the USB prescaler can be changed by the core during startup

This commit is contained in:
Roger Clark 2015-09-06 06:18:56 +10:00
parent d79f346747
commit b96247af1e
4 changed files with 25 additions and 0 deletions

View File

@ -162,3 +162,12 @@ void rcc_set_prescaler(rcc_prescaler prescaler, uint32 divider) {
};
rcc_do_set_prescaler(masks, prescaler, divider);
}
void rcc_clk_disable(rcc_clk_id id) {
static __io uint32* enable_regs[] = {
[APB1] = &RCC_BASE->APB1ENR,
[APB2] = &RCC_BASE->APB2ENR,
[AHB] = &RCC_BASE->AHBENR,
};
rcc_do_clk_disable(enable_regs, id);
}

View File

@ -169,6 +169,12 @@ static inline void rcc_disable_css() {
RCC_BASE->CR &= ~RCC_CR_CSSON;
}
/**
* @brief Turn off the clock line on a peripheral
* @param id Clock ID of the peripheral to turn on.
*/
extern void rcc_clk_disable(rcc_clk_id id);
#ifdef __cplusplus
} // extern "C"
#endif

View File

@ -64,4 +64,11 @@ static inline void rcc_do_set_prescaler(const uint32 *masks,
RCC_BASE->CFGR = cfgr;
}
static inline void rcc_do_clk_disable(__io uint32** enable_regs,
rcc_clk_id id) {
__io uint32 *enable_reg = enable_regs[rcc_dev_clk(id)];
uint8 line_num = rcc_dev_table[id].line_num;
bb_peri_set_bit(enable_reg, line_num, 0);
}
#endif

View File

@ -79,12 +79,15 @@ namespace wirish {
rcc_set_prescaler(RCC_PRESCALER_AHB, RCC_AHB_SYSCLK_DIV_1);
rcc_set_prescaler(RCC_PRESCALER_APB1, RCC_APB1_HCLK_DIV_2);
rcc_set_prescaler(RCC_PRESCALER_APB2, RCC_APB2_HCLK_DIV_1);
rcc_clk_disable(RCC_USB);
#if F_CPU == 120000000
rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_2_5);
#elif F_CPU == 96000000
rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_2);
#elif F_CPU == 72000000
rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5);
#elif F_CPU == 48000000
rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5);
#endif
}