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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.