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 SYSCLK
hay ClksFreq
57,6 MHz, aunque esperaría que fuera 96 Mhz.
¿Qué me estoy perdiendo?
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
, PCLK1
y PCLK2
eran incorrectas (por encima del límite de frecuencia). No les presté mucha atención, ya que traté de averiguar por qué SYSCLK
no se estaban configurando correctamente.
sherrellbc
while(x != y);
es suficiente para un bucle sin lacontinue
declaración. Tiendo a reservar una segunda línea y sangrar el;
.varesa
continue
no es necesario, pero creo que agregarlo hace que sea un poco más fácil de leer cuando hay un "verbo".