Forum: Mikrocontroller und Digitale Elektronik PLL funktioniert nur im Debug - STM32F746G-Disco mit System Worckbench for STM32 als IDE


von Sebastian (Gast)


Angehängte Dateien:

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

von Dummbeutel (Gast)


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

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Sieht so aus als hätteste die Flash waistates nicht hochgesetzt.

von Stefan S. (chiefeinherjar)


Lesenswert?

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

Genau das wäre auch mein Tipp. Ich hatte nämlich genau das gleiche 
Problem - bis ich dann auf diesen Trichter gekommen bin!

von Sebastian (Gast)


Angehängte Dateien:

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.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Ansonsten jetzt noch den ART und Prefetch des Flash einschalten, wenn 
nicht schon der L1 Cache der CPU aktiv ist.
Sonst verpufft der hohe CPU Takt durch die WS ;)

von Sebastian (Gast)


Lesenswert?

Mw E. schrieb:
> Ansonsten jetzt noch den ART und Prefetch des Flash einschalten,
> wenn
> nicht schon der L1 Cache der CPU aktiv ist.
> Sonst verpufft der hohe CPU Takt durch die WS ;)

Vielen dank für diese wertvollen Informationen, werd ich mir gleich 
ansehen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.