Ich habe eine STM32F427-MCU mit einem 8-MHz-HSE-Quarz. Ich stelle die Uhr wie folgt ein:
#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 ist auf 8000000 definiert
Mein Debugger zeigt, dass SYSCLK
in ClksFreq
57,6 MHz ist, obwohl ich erwarten würde, dass es 96 MHz sind.
Was vermisse ich?
Ich habe es geschafft, mein Problem zu beheben, indem ich am Anfang Folgendes hinzugefügt habe:
RCC_HSEConfig(RCC_HSE_ON);
Ich hatte die HSE nicht gestartet, also wurde der größte Teil der Konfiguration wahrscheinlich einfach ignoriert, da der Kern noch funktionierte.
Als Nebenbemerkung waren auch die Teilungen HCLK
, PCLK1
und PCLK2
falsch (über der Frequenzgrenze). Ich hatte ihnen nicht so viel Aufmerksamkeit geschenkt, als ich versuchte herauszufinden, warum sie SYSCLK
nicht richtig eingestellt wurden.
sherrelbc
while(x != y);
reicht aber für eine Schleife ohne diecontinue
Anweisung. Ich neige dazu, eine zweite Zeile zu reservieren und die einzurücken;
.varesa
continue
nicht notwendig ist, aber ich denke, das Hinzufügen macht es ein bisschen einfacher zu lesen, wenn es ein "Verb" gibt.