Das ist mein aktueller Versuch, das Problem war, dass standardmäßig PLL
als System Clock verwendet wird und man die PLL-Werte so nicht verändern
kann, dafür muss man die erst deaktivieren. Drauf gebracht hat mich
dieser Artikel:
https://stm32f4-discovery.net/2015/05/library-59-change-pll-settings-while-stm32f4xx-is-running/
Allerdings hab ich nun seltsame Effekte.
1 | void init_clock() {
|
2 | //FLASH->ACR |= FLASH_ACR_LATENCY_1;
|
3 |
|
4 | RCC->CR |= RCC_CR_HSION;
|
5 | while(!(RCC->CR & RCC_CR_HSIRDY))
|
6 | asm volatile ("nop");
|
7 | RCC->CFGR &=~ (RCC_CFGR_SW_0 | RCC_CFGR_SW_1);
|
8 | RCC->CR &=~RCC_CR_PLLON;
|
9 | while(RCC->CR & RCC_CR_PLLRDY)
|
10 | asm volatile ("nop");
|
11 |
|
12 | RCC->CFGR &=~ RCC_CFGR_PLLSRC;
|
13 | RCC->CFGR &=~(RCC_CFGR_PLLMULL_3 | RCC_CFGR_PLLMULL_2 | RCC_CFGR_PLLMULL_1 | RCC_CFGR_PLLMULL_0);
|
14 | RCC->CR |= RCC_CR_PLLON;
|
15 |
|
16 | while(!(RCC->CR & RCC_CR_PLLRDY))
|
17 | asm volatile ("nop");
|
18 |
|
19 | RCC->CFGR |= RCC_CFGR_SW_1;
|
20 |
|
21 | while(!(RCC->CFGR & RCC_CFGR_SW_1))
|
22 | asm volatile ("nop");
|
23 | }
|
Anbei die Registerwerte nach dem Durchlaufen der Funktion.
Nach der Einstellung von PLLMULL ergibt das "PLL input clock x 2", mit
8MHz /2 = 4MHz als Eingangstakt messe ich auch korrekte 8MHz.
Wenn ich nun
1 | RCC->CFGR |= RCC_CFGR_PLLMULL_0;
|
hinzufüge, erhalte ich auch korrekte 12MHz. Sobald ich aber die oben
genannte Zeile auf
1 | RCC->CFGR |= RCC_CFGR_PLLMULL_1;
|
ändere (hier wären 16MHz zu erwarten), erhalte ich bei der Logic
Analyzer Messung ungleiche Taktlängen (siehe Anhang).
Woher kommt das?
Edit:
Sobald ich die WaitStates für den Flash erhöhe
(http://www.st.com/content/ccc/resource/technical/document/reference_manual/59/b9/ba/7f/11/af/43/d5/CD00171190.pdf/files/CD00171190.pdf/jcr:content/translations/en.CD00171190.pdf
S. 57) ergibt:
1 | FLASH->ACR |= FLASH_ACR_LATENCY_1;
|
2 | ...
|
3 | RCC->CFGR |= RCC_CFGR_PLLMULL_1;
|
8MHz und
1 | FLASH->ACR |= FLASH_ACR_LATENCY_1;
|
2 | ...
|
3 | RCC->CFGR |= RCC_CFGR_PLLMULL_1 | RCC_CFGR_PLLMULL_0;
|
ergibt 4MHz (auch wieder mit unsauberen Taktlängen). Wie kann das denn
sein?