Forum: Mikrocontroller und Digitale Elektronik STM32 RCC PLL locked nicht


von STMer (Gast)


Lesenswert?

Moin,

mein Problem ist, dass meine PLL nicht mit meinem HSE einrasten möchte. 
Mein Code ist der folgende auf einem STM32F070CBT6:
1
/*##### RCC #####*/
2
  FLASH->ACR = 1;              //1 Waitstates
3
  RCC->CR |= RCC_CR_HSEON;        //Extenen Quarz an
4
  while(!(RCC->CR & RCC_CR_HSERDY));    //Auf Quarz warten
5
  //RCC->CFGR |= RCC_CFGR_PPRE_DIV4;
6
  RCC->CFGR2 = RCC_CFGR2_PREDIV_DIV2;    //Predivider = 2
7
  RCC->CFGR |= RCC_CFGR_PLLMUL12;      //PLL multiplizierer * 12 = 48MHz bei 8MHZ Eingang
8
  RCC->CFGR |= RCC_CFGR_PLLSRC;      //HSE als Source für PLL
9
  RCC->CR |= RCC_CR_PLLON;        //PLL an
10
  while(!(RCC->CR & RCC_CR_PLLRDY));    //Auf PLL warten
11
  RCC->CFGR |= RCC_CFGR_SW_PLL;      //PLL auswählen
12
  while(!(RCC->CFGR & RCC_CFGR_SWS_PLL));  //Auf PLL warten
13
  RCC->CR &= ~(RCC_CR_HSION);        //HSI aus

Wenn ich mit "RCC_CFGR_PLLSRC" auf HSE als taktquelle für die PLL 
umschalte bleibt die PLL bei "RCC_CR_PLLRDY" in einer Endlosschleife 
hängen. Verwende ich den internen Oszillator, indem ich 
"RCC_CFGR_PLLSRC" auskommentiere, locked die PLL (beides 8MHz).

In beiden Fällen kann ich mit dem Oszilloskop sehen, dass der externe 
Quarz bei 8MHz schwingt. Ebenso kann ich den HSE statt PLL als 
Taktquelle auswählen.

Was übersehe ich? PLL mit 8MHz HSi geht, mit 8MHz HSE (schwingt!) geht 
nicht.

Danke!

Ich habe 18pF Kondensatoren wie laut Quarz Datenblatt.

von STMer (Gast)


Lesenswert?

PS: Alle systeminit von Atollic habe ich rausgeschmissen, RCC->PLLCFGR 
ist "0" beim Start.

von Andreas S. (igel1)


Lesenswert?

Ich meine mich dumpf zu erinnern, dass da beim Umschalten noch etwas zu 
beachten war.

Schau Dir mal die entsprechenden Routinen in der StdPeriphLib an - dort 
war alles beachtet worden ...

Viele Grüße

Igel1

von Nico W. (nico_w)


Lesenswert?

Bei meinem F4 schalte ich den PLL explizit aus bevor ich ihn 
konfiguriere und einschalte.

Hth.

von STMer (Gast)


Lesenswert?

Nico W. schrieb:
> Bei meinem F4 schalte ich den PLL explizit aus bevor ich ihn
> konfiguriere und einschalte.

Die PLL ist beim Start nicht angeschaltet, ich habe die systeminit von 
Atollic deaktiviert.

von Nop (Gast)


Lesenswert?

STMer schrieb:

>   RCC->CFGR |= RCC_CFGR_PLLSRC;      //HSE als Source für PLL

> Was übersehe ich? PLL mit 8MHz HSi geht, mit 8MHz HSE (schwingt!) geht
> nicht.

Also wenn die mit HSI geht, dann wird wohl HSI als Quelle für die PLL 
eingetragen sein. Wenn dem so ist, dann mußt Du bei der Quellen-Auswahl 
oben wohl nicht nur das Bit für HSE einschalten, sondern auch dafür 
sorgen, daß das für HSI ausgeschaltet ist.

von STMer (Gast)


Lesenswert?

Nop schrieb:
> Also wenn die mit HSI geht, dann wird wohl HSI als Quelle für die PLL
> eingetragen sein. Wenn dem so ist, dann mußt Du bei der Quellen-Auswahl
> oben wohl nicht nur das Bit für HSE einschalten, sondern auch dafür
> sorgen, daß das für HSI ausgeschaltet ist.

Wenn ich "RCC_CFGR_PLLSRC" nicht setze, ist HSI ausgewählt.

0 = HSI, 1 = HSE.

von STM32-Experte (Gast)


Lesenswert?

Dies ist mein Code für den STM32F070, externer Quarz 8 MHz, PLL 48MHz.
Funktioniert immer einwandfrei.
1
  //==== Starte externen Oszillator ====
2
  RCC->CR |= RCC_CR_HSEON;
3
  while(!(RCC->CR & RCC_CR_HSERDY));
4
5
  //==== PLL konfigurieren ====
6
  RCC->CFGR &= ~(RCC_CFGR_PLLMUL | RCC_CFGR_PLLSRC);
7
  RCC->CFGR |= (uint32_t)(RCC_PLLSource_HSE | RCC_PLLMul_6);
8
  
9
  //==== Enable PLL ====
10
  RCC->CR |= RCC_CR_PLLON;
11
  while(!(RCC->CR & RCC_CR_PLLRDY));
12
13
  //==== Configure Flash =====
14
  FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;
15
16
  //==== Select PLL as system clock source ====
17
  RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
18
  RCC->CFGR |= RCC_SYSCLKSource_PLLCLK;
19
  while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL);

von Nop (Gast)


Lesenswert?

STMer schrieb:

> Wenn ich "RCC_CFGR_PLLSRC" nicht setze, ist HSI ausgewählt.

Ja richtig. Hast Du schon geschaut, ob die defines wirklich das 
enthalten, was ihr Name nahelegt?

von STMer (Gast)


Lesenswert?

Nop schrieb:
> Ja richtig. Hast Du schon geschaut, ob die defines wirklich das
> enthalten, was ihr Name nahelegt?

Tatsache. Hiermir gehts:

RCC->CFGR |= (1<<16);

RCC_CFGR_PLLSRC hingegen ist definiert als (0x3U << (15U))"

Auch geht "RCC_CFGR_PLLSRC_HSE_PREDIV" was das selbe wie (1<<16) ist.

Danke für den Tip.

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.