Setting stm32f4 SystemCoreClock to 100MHz but can’t get it (only get 57.6MHz)

armcmsisstm32stm32cubemxstm32f4

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.
stmcube clock

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:

{
    RCC_DeInit();//a must
    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();
}

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:

do{
           RCC_HSEConfig(RCC_HSE_ON);
  }
         while (!RCC_WaitForHSEStartUp());

to replace in the previous version

do{
          RCC_HSEConfig(RCC_HSE_ON);;

  }

          while(RCC_GetFlagStatus(RCC_FLAG_HSERDY)!=SET);

I also "had" to start the code by initializing the clock system using the function:

 RCC_DeInit();