¿Por qué `RCC_GetClocksFreq` devuelve resultados diferentes a los esperados?

Tengo un MCU STM32F427 con un cristal HSE de 8MHz. Estoy configurando el reloj de la siguiente manera:

#include <stm32f4xx.h>
#include <stm32f4xx_rcc.h>

void initClocks(void);

void initClocks(void) {
    /*
    HSE: 8 MHz
    PLL: HSE / 8 * 192 => 192 MHz
    SysCLK:  PLL / 2 => 96 MHz
    PrphCLK: PLL / 4 => 48 MHz
    */
    RCC_PLLConfig(RCC_PLLSource_HSE, 8, 192, 2, 4);
    RCC_PLLCmd(ENABLE);

    // Wait
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) continue;

    // Use PLL
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    while (RCC_GetSYSCLKSource() != 0x08) continue;

    RCC_HCLKConfig(RCC_SYSCLK_Div1);
    RCC_PCLK2Config(RCC_SYSCLK_Div1);
    RCC_PCLK1Config(RCC_SYSCLK_Div1);
}

int main(void) {
    RCC_ClocksTypeDef ClksFreq;

    initClocks();
    SystemCoreClockUpdate();

    RCC_GetClocksFreq(&ClksFreq);

    while(1) {}
}

HSE_VALUE está definido en 8000000

Mi depurador muestra que SYSCLKhay ClksFreq57,6 MHz, aunque esperaría que fuera 96 ​​Mhz.

¿Qué me estoy perdiendo?

Fuera de tema, pero while(x != y);es suficiente para un bucle sin la continuedeclaración. Tiendo a reservar una segunda línea y sangrar el ;.
@sherrellbc Sí, sé que continueno es necesario, pero creo que agregarlo hace que sea un poco más fácil de leer cuando hay un "verbo".

Respuestas (1)

Logré solucionar mi problema agregando lo siguiente cerca del principio:

RCC_HSEConfig(RCC_HSE_ON);

No había iniciado el HSE, por lo que la mayor parte de la configuración probablemente se ignoró ya que el núcleo aún funcionaba.

Como nota al margen, también las divisiones HCLK, PCLK1y PCLK2eran incorrectas (por encima del límite de frecuencia). No les presté mucha atención, ya que traté de averiguar por qué SYSCLKno se estaban configurando correctamente.

@bitsmack Trato de mantener mis preguntas "actualizadas", cuando recuerdo. A veces encuentro preguntas de hace años que no tienen una respuesta marcada cuando reviso mi perfil :)