configurando stm32f4 SystemCoreClock a 100MHz pero no puedo obtenerlo (solo 57.6MHz)

0

Estoy intentando cambiar el reloj central del sistema stm32f407 a 100MHz. Para hacer esto, necesito configurar la fuente del PLL para que sea HSE y configurar el coeficiente del PLL para obtener el valor correcto de SYSCLK.

Aquí hay una captura de pantalla del stmcube que muestra los valores correctos de pll M, N, P, Q.

Aquí está mi función

    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();

}

En la sesión de depuración obtengo SystemCoreClock = 57.600.000.

Editar: funciona ahora, aquí está el nuevo código

{
    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();
}
    
pregunta werber bang

1 respuesta

1

funciona ahora, aquí está el nuevo código

{
    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();
}

con algo de experimentación y más tiempo leyendo el stm32f4xx_rcc.c, descubrí que había una función de RCC_WaitForHSEStartUp (), cuya función es esperar a que se inicie el oscilador HSE, lo usé de la siguiente manera

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

para reemplazar en la versión anterior

do{
          RCC_HSEConfig(RCC_HSE_ON);;

  }

          while(RCC_GetFlagStatus(RCC_FLAG_HSERDY)!=SET);

También "tuve" para iniciar el código al inicializar el sistema de reloj usando la función

 RCC_DeInit();
    
respondido por el werber bang

Lea otras preguntas en las etiquetas