Forum: Mikrocontroller und Digitale Elektronik STM32F030F4 HSI Clock mit PLL


von Markus (Gast)


Angehängte Dateien:

Lesenswert?

Ich versuche gerade mit dem oben genannten Controller ein wenig warm zu 
werden. Meine ersten Testprogramme die LED's blinken lassen oder per 
Interrupt auf die USART Schnittstelle zu greifen habe ich alle mit der 
HSI Taktquelle und 8MHz realisiert.

Nun wollte ich mich im nächsten Schritt darum kümmern, den Controller 
auf die maximale Frequenz von 48MHz zu takten. Und genau in diesem 
Themengebiet sehe ich den Wald vor lauter Bäumen nicht mehr.

Mit dem folgenden Codeschnippsel bekomme ich den Controller erfolgreich 
auf 24 MHz getaktet.
1
  RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_6);
2
  RCC_PLLCmd(ENABLE);
3
  while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {}
4
  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

Nach viel lesen und Suchen glaube ich verstanden zu haben, dass man 
nicht einfach den Multiplikator auf 12 stellen kann. Erst müsste die 
Flash Latency gesetzt werden, damit diese mit Taktfrequenzen größer 24 
MHz zurecht kommt. Das habe ich auch mit dem folgenden Code versucht.
1
  FLASH->ACR |= FLASH_ACR_PRFTBE;
2
        FLASH->ACR |= FLASH_ACR_LATENCY;
3
  RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_12);
4
  RCC_PLLCmd(ENABLE);
5
  while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {}
6
  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

Die beiden Codeschnipsel stehen jeweils am Anfang der main Routine.
Wenn ich den zweiten Code ausprobiere scheint der Controller nicht 
richtig anzulaufen, er bleibt einfach tot. Füge ich die Codezeile
1
GPIO_SetBits(GPIOA,GPIO_Pin_2);
 vor die while schleife an, Läuft der Kontroller auch mit dem zweiten 
Codeschnipsel an, liefert aber nach einiger weile Mist per UART aus. 
Verschiedene Bautraten habe ich ausprobiert aber ohne Erfolg, und es 
kann ja auch nicht Ziel sein vorher einen Ausgang mit LED zu schalten 
damit alles läuft.

Verwenden tue ich die Coocox CoIDE 1.7.6.
Gibt es irgendwo ein venüftiges Tutorial oder Auflistung wie man mit der 
internen Taktquelle zuverlässig auf 48MHz kommt? Mein bisheriges 
Querlesen vom Datenblatt und dem Reference Manual führten nicht zum 
Erfolg.

Gruß,
Markus

von ./. (Gast)


Lesenswert?

Die Reihenfolge ist doch klar.

Erst bei einem 8 MHz HSI-Clock am Flash drehen:

  FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;

Dann umschalten:

  RCC->CFGR = RCC_CFGR_HPRE_DIV1 | RCC_CFGR_PPRE_DIV1 | 
RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL6;
  RCC->CR = RCC_CR_PLLON | RCC_CR_HSEBYP | RCC_CR_HSEON | RCC_CR_HSION;
  while(! (RCC->CR & RCC_CR_HSERDY));
  while(! (RCC->CR & RCC_CR_PLLRDY));
  RCC->CFGR &= ~RCC_CFGR_SWS;
  RCC->CFGR |= RCC_CFGR_SW_PLL;

Ob die Konstanten fuer Deinen F030 passen musst Du ueberpruefen...

von 7856ujtzuitzu (Gast)


Lesenswert?

nutzt du die systemclock für deine UART ?

ich habe mal ähnliches problem gehabt

habe dann die Clock für die UART umgestellt
man kann den HSI direkt als quelle für UART nutzen.

ist auch ganz schick wenn man UART DMA betreibt und den Kern schonmal 
schlafen legen kann

von Markus (Gast)


Lesenswert?

Habe ich das nicht so gemacht. Da wäre ich jetzt von Ausgegangen. Es 
werden doch zuerst die beiden Anweisungen:
1
FLASH->ACR |= FLASH_ACR_PRFTBE;
2
FLASH->ACR |= FLASH_ACR_LATENCY;
ausgeführt und dann die Clock geändert mit den vier Zeilen.
1
RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_12);
2
RCC_PLLCmd(ENABLE);
3
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {}
4
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

Wie gesagt mit dem Multiplikator 6 geht es mit 12 läuft der Controller 
nicht an. Der Müll der über den UART kommt, konnte ich einem Fehler in 
der Routine SendInteger zuordnen.

Nach wie vor ist das ganze Thema noch nicht wirklich durchsichtig für 
mich :o(

von Markus (Gast)


Lesenswert?

7856ujtzuitzu schrieb:
> habe dann die Clock für die UART umgestellt
> man kann den HSI direkt als quelle für UART nutzen.


Ja habe ich mittlerweile auch probiert mittels dem Code:
1
// Setting Clock for USART
2
RCC_USARTCLKConfig(RCC_USART1CLK_HSI);

Aber auch dann läuft der Controller nicht an.

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.