I am triying to change the stm32f407 systeme core clock to be 100MHz. To do this I need to set the source of the PLL to be HSE, and configure the PLL coefficient so as to get the right value of SYSCLK.
Here a screenshot of the stmcube that chows the right values of pll M, N, P, Q.
Here is my function
void rcc_clk_config() // function to configure the rc clk for running on HSE : sysclk at 100MHZ
{
RCC_PLLConfig(RCC_PLLSource_HSE, 4, 200, 4, 4);//sysclck to 100mhz , systick to 12.5 mhz
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div4);
RCC_PCLK2Config(RCC_HCLK_Div2);
do{
RCC_HSEConfig(RCC_HSE_ON);;
}
while(RCC_GetFlagStatus(RCC_FLAG_HSERDY)!=SET);
do{
RCC_PLLCmd(ENABLE);
}
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)!=SET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
SystemCoreClockUpdate();
}
In the debug session I get SystemCoreClock = 57.600.000.
Edit: it works now, here is the new code
{
RCC_DeInit();
do{
RCC_HSEConfig(RCC_HSE_ON);
}
while (!RCC_WaitForHSEStartUp());
RCC_PLLConfig(RCC_PLLSource_HSE, 4, 200, 4, 4);//100MHZ
do{
RCC_PLLCmd(ENABLE);
}
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)!=SET);
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div4);
RCC_PCLK2Config(RCC_HCLK_Div2);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
SystemCoreClockUpdate();
}
Best Answer
It works now, here is the new code:
With some experimentation and some more time reading the
stm32f4xx_rcc.c
, I discovered there was in fact a function:RCC_WaitForHSEStartUp()
, which role is to wait for the HSE oscillator to start. I used it as follows:to replace in the previous version
I also "had" to start the code by initializing the clock system using the function: