bsp.board_stm32f407g_disc1: Switch to external oscillator (more precise).

This commit is contained in:
William D. Jones 2019-01-11 13:47:44 -05:00
parent e73e016a8c
commit 0f9fa5956f
3 changed files with 37 additions and 18 deletions

View File

@ -1,4 +1,5 @@
CFLAGS = \ CFLAGS = \
-DHSE_VALUE=8000000 \
-DCFG_TUSB_MCU=OPT_MCU_STM32F4 \ -DCFG_TUSB_MCU=OPT_MCU_STM32F4 \
-DSTM32F407xx \ -DSTM32F407xx \
-mthumb \ -mthumb \

View File

@ -49,38 +49,52 @@
void board_init(void) void board_init(void)
{ {
// Systick init
#if CFG_TUSB_OS == OPT_OS_NONE
// Tick init, samd SystemCoreClock may not correct
SysTick_Config(SystemCoreClock / 1000);
#endif
// Init the LED on PD14 // Init the LED on PD14
RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN;
GPIOD->MODER |= GPIO_MODER_MODE14_0; GPIOD->MODER |= GPIO_MODER_MODE14_0;
// USB Clock init // USB Clock init
// PLL input- 16 MHz (HSI clock) // PLL input- 8 MHz (External oscillator clock; HSI clock tolerance isn't
// VCO input- 1 to 2 MHz (2 MHz, M = 8) // tight enough- 1%, need 0.25%)
// VCO input- 1 to 2 MHz (2 MHz, M = 4)
// VCO output- 100 to 432 MHz (144 MHz, N = 72) // VCO output- 100 to 432 MHz (144 MHz, N = 72)
// Main PLL out- <= 180 MHz (18 MHz, P = 8, not used; HSI used as system clk.) // Main PLL out- <= 180 MHz (18 MHz, P = 3- divides by 8)
// USB PLL out- 48 MHz (Q = 3) // USB PLL out- 48 MHz (Q = 3)
RCC->PLLCFGR = (3 << RCC_PLLCFGR_PLLQ_Pos) | (8 << RCC_PLLCFGR_PLLP_Pos) \ RCC->PLLCFGR = RCC_PLLCFGR_PLLSRC_HSE | (3 << RCC_PLLCFGR_PLLQ_Pos) | \
| (72 << RCC_PLLCFGR_PLLN_Pos) | (8 << RCC_PLLCFGR_PLLM_Pos); (3 << RCC_PLLCFGR_PLLP_Pos) | (72 << RCC_PLLCFGR_PLLN_Pos) | \
(4 << RCC_PLLCFGR_PLLM_Pos);
// Wait for external clock to become ready
RCC->CR |= RCC_CR_HSEON;
while(!(RCC->CR & RCC_CR_HSERDY_Msk));
// Wait for PLL to become ready
RCC->CR |= RCC_CR_PLLON; RCC->CR |= RCC_CR_PLLON;
while(!(RCC->CR & RCC_CR_PLLRDY_Msk));
// Switch clocks!
RCC->CFGR |= RCC_CFGR_SW_1;
// Notify runtime of frequency change.
SystemCoreClockUpdate();
// Systick init
#if CFG_TUSB_OS == OPT_OS_NONE
SysTick_Config(SystemCoreClock / 1000);
#endif
RCC->AHB2ENR |= RCC_AHB2ENR_OTGFSEN; RCC->AHB2ENR |= RCC_AHB2ENR_OTGFSEN;
// USB Pin Init // USB Pin Init
// PA10- ID, PA11- DM, PA12- DP // PA10- ID, PA11- DM, PA12- DP
// PC0- Power on // PC0- Power on
GPIOD->MODER |= GPIO_MODER_MODE10_1 | GPIO_MODER_MODE11_1 | GPIO_MODER_MODE12_1; RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
GPIOA->AFR[1] |= (10 << GPIO_AFRH_AFSEL10_Pos) | (10 << GPIO_AFRH_AFSEL11_Pos) | (10 << GPIO_AFRH_AFSEL12_Pos); GPIOD->MODER |= GPIO_MODER_MODE10_1 | GPIO_MODER_MODE11_1 | \
GPIO_MODER_MODE12_1;
GPIOA->AFR[1] |= (10 << GPIO_AFRH_AFSEL10_Pos) | \
(10 << GPIO_AFRH_AFSEL11_Pos) | (10 << GPIO_AFRH_AFSEL12_Pos);
} }
void board_led_control(bool state) void board_led_control(bool state)
{ {
if (!state) { if (!state) {

View File

@ -71,17 +71,21 @@ bool dcd_init (uint8_t rhport)
void dcd_int_enable (uint8_t rhport) void dcd_int_enable (uint8_t rhport)
{ {
(void) rhport;
NVIC_EnableIRQ(OTG_FS_IRQn);
} }
void dcd_int_disable (uint8_t rhport) void dcd_int_disable (uint8_t rhport)
{ {
(void) rhport;
NVIC_DisableIRQ(OTG_FS_IRQn);
} }
void dcd_connect (uint8_t rhport) void dcd_connect (uint8_t rhport)
{ {
} }
void dcd_disconnect (uint8_t rhport) void dcd_disconnect (uint8_t rhport)
{ {