Hallo,
seit kurzem beschäftige ich mich mit der Programmierung von STM32
Controllern. Vorher hab ich mich hauptsächlich mit AVR's
herumgeschlagen.
Nun zu meinem Problem:
Ich verwende für meine Tests ein STM32F746G-Disco mit einer 25MHz Quarz
(als HSE bezeichnet) an Board. Nun würde ich gerne die PLL so
konfigurieren, dass ich einen Systemtakt von 200MHz habe. Zur
Visualisierung des Clocktrees (siehe Bild) hab ich den STM32CubeMX
verwendet, ich verwende jedoch dessen Code nicht.
Wenn ich nun den Code am Controller Debug, funktioniert die PLL. Wenn
ich den Code normal Uploade hängt sich der Controller auf, sobald ich
den PLL als Systemclock setze.
Inzwischen hab ich keine Idee mehr, was ich übersehen haben könnte...
Hatte jemand von euch ein ähnliches Problem?
Hab ich einen groben Fehler gemacht?
Lt. Datenblatt sollte der Eingang in die PLL 1MHz sein (deswegen M=/25),
der Ausgang des VCO max. 432MHz (N=*400) und der Systemclock max. 216MHz
(P=/2; entspricht einem Bitsetting 00).
Hier noch mein Code:
1 | RCC->CFGR &= ~RCC_CFGR_SW_Msk; // activate hsi for main clock source
|
2 | while(RCC->CFGR & 0b11); // wait for hsi clock as main clock source is active
|
3 |
|
4 | RCC->CR &= ~(RCC_CR_PLLON_Msk); // stop pll
|
5 | while(RCC->CR & RCC_CR_PLLRDY); // wait for pll is stopped
|
6 |
|
7 | RCC->CR |= RCC_CR_HSEON; // start hse
|
8 | while(!(RCC->CR & RCC_CR_HSERDY)); // wait for hse get ready
|
9 |
|
10 | RCC->PLLCFGR &= ~((RCC_PLLCFGR_PLLQ_Msk) | (RCC_PLLCFGR_PLLP_Msk) | (RCC_PLLCFGR_PLLN_Msk) | (RCC_PLLCFGR_PLLM_Msk)); // reset parameters
|
11 | RCC->PLLCFGR |= (25<<RCC_PLLCFGR_PLLM_Pos) | (400<<RCC_PLLCFGR_PLLN_Pos) | (1<<RCC_PLLCFGR_PLLSRC_Pos) | (10<<RCC_PLLCFGR_PLLQ_Pos); // /M=25; *N=400; /P=2; HSE as Source
|
12 |
|
13 | RCC->CFGR |= (0b100<<RCC_CFGR_PPRE2_Pos) | (0b101<<RCC_CFGR_PPRE1_Pos); // APB2/2; APB1/4;
|
14 |
|
15 | RCC->CR |= RCC_CR_PLLON; // activate pll
|
16 | while(!(RCC->CR & RCC_CR_PLLRDY)); // wait for pll get ready
|
17 |
|
18 | RCC->CFGR |= RCC_CFGR_SW_PLL; // set pll for main clock source
|
19 |
|
20 | // ab hier wird nichts mehr ausgeführt...
|
21 |
|
22 | //while(!(RCC->CFGR & RCC_CFGR_SWS_PLL)); //wait for pll active
|
lg sebastian