PLL funktioniert nur im Debug - STM32F746G-Disco mit System Worckbench for STM32 als IDE

Gast #6116953
Lesenswert?

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
Angehängte Dateien:
Gast #6116968
Lesenswert?

Ja, an der Stelle wuerde es wohl jeden "einfachen" JTAG-Adapter
hinwegraffen. Ganz einfach weil da der Takt noch "eiert".

Mach dahinter mal ein "Blinky". Das sollte schon blinken.

Oder setze einen Brechpunkt auf eine Codezeile *hinter*:

while(!(RCC->CFGR & RCC_CFGR_SWS_PLL)); //wait for pll active
Gast #6117053
Lesenswert?

Mw E. schrieb:
> Sieht so aus als hätteste die Flash waistates nicht hochgesetzt.

Vielen dank, darauf bin ich auch gerade gekommen! Da kann man echt 
einfach drüber stolpern, wobei es ja eigentlich logisch ist.

Flash wait state auf 6 gesetzt und es läuft.

Sollte mal jemand das gleiche Problem haben, hier die Lösung:
1
FLASH->ACR |= (6<<FLASH_ACR_LATENCY_Pos);

Auszug aus dem Datenblatt im Anhang.
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren