mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32 Probleme mit dem Takt


Autor: Benni Nori (benninori)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich muss schon wieder nerven. Nachdem ich jetzt mein Progrämmchen auf 
die Lib von ST umgestellt hab, hab ich irgendwie Probleme mit meiner 
Clock. irgendwas hab ich da im RCC vergeigt und mach jetzt schon wieder 
den halben Tag dran rum und finde den Fehler nicht. Wäre super wenn 
einer von euch Profis mal kurz auf meinen Code schauen könnte:
void ClockInit()
{
  //Clock control register
  RCC->CR  = RCC_CR_HSEON ;       //HSE on

  // Wait for HSE
  while (!(RCC->CR & RCC_CR_HSERDY))
  {
  }

  //Clock configuration register
  RCC->CFGR      = RCC_CFGR_PPRE1_DIV1;     //APB1 nicht teilen
  RCC->CFGR     |= RCC_CFGR_PLLSRC;         //HSE als PLL-Eingangssignal
  RCC->CFGR     |= RCC_CFGR_PLLMULL6;       //PLL=HSE*6

  RCC->CR       |= RCC_CR_PLLON;            //PLL einschalten 
   
  //Wait for PLL
  while (!(RCC->CR & RCC_CR_PLLRDY))
  {
  }
  
  RCC->CFGR     |= RCC_CFGR_SW_PLL;          //PLL als Systemtakt
  
  //Wait for SYSCLK
  while (!(RCC->CFGR & RCC_CFGR_SWS_PLL))
  {
  }
  
  RCC->CFGR    |= RCC_CFGR_OTGFSPRE;        //48MHz für USB
  
  //Takte für die Peripherie einschalten
  RCC->AHBENR   = RCC_AHBENR_SRAMEN;
  RCC->AHBENR  |= RCC_AHBENR_CRCEN;
  RCC->AHBENR  |= RCC_AHBENR_OTGFSEN;
  RCC->APB2ENR  = RCC_APB2ENR_AFIOEN;
  RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
  RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
  RCC->APB1ENR |= RCC_APB1ENR_USART2EN;
  RCC->APB1ENR |= RCC_APB1ENR_CAN1EN;
  RCC->APB1ENR |= RCC_APB1ENR_PWREN;
}

Der Knackpunkt an der Sache scheint die Umschaltung auf die PLL als 
SYSCLK zu sein. Da bricht das Programm jedes mal ab. Was mach ich 
falsch?

Da hab ich doch bestimmt wieder was blödes übersehen.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ben _ schrieb:

>   RCC->CFGR      = RCC_CFGR_PPRE1_DIV1;     //APB1 nicht teilen

APB1 <= 36MHz.

Autor: Benni Nori (benninori)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ahh, mein liebster freund und helfer. willst du mir damit sagen, dass 
APB1 maximal 36MHz haben darf?

habe jetzt durch 2 geteilt sprich 36MHz. Leider hab ich immernoch das 
gleiche Problem

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ben _ schrieb:

> ahh, mein liebster freund und helfer. willst du mir damit sagen, dass
> APB1 maximal 36MHz haben darf?

Genau dies.

Autor: Benni Nori (benninori)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sonst fällt dir nichts auf?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was für ein STM32 ist das eigentlich genau? Das "OTG" Dings erinnert 
mich eher an 105/107.

Autor: Benni Nori (benninori)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso, wenn ich die 72MHz durch 1,5 teile komme ich doch auf 48MHz. Was 
hab ich da jetzt schon wieder falsch verstanden?


OK, ich habe meinen Knackpunkt gefunden. Verstehe ihn aber nicht.Ich 
benutze einen 12MHz Quarz und wenn ich die PLL auf *4 statt auf *6 
stelle dann funktionierts. Was ist falsch an 72MHz als Systemtakt?

Autor: Benni Nori (benninori)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, es ist der 105er.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ganz sicher, dass im Startup nicht schon irgendwo auf einen anderen Takt 
als HSI geschaltet wird? Denn die PLL live umzuschalten ist ziemlich 
ungünstig. Nummer sicher: Erst auf HSI schalten.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ben __ schrieb:

> Wieso, wenn ich die 72MHz durch 1,5 teile komme ich doch auf 48MHz. Was
> hab ich da jetzt schon wieder falsch verstanden?

Yep, aber ich war beim 103er, und der teilt bei 0, teilt nicht bei 1.

Autor: Benni Nori (benninori)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Laut reference manual schaltet es während des Bootvorgangs einfach auf 
HSI.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kenne grad den Startup deiner Entwicklungsumgebung nicht, was da 
alles noch drin verbuddelt ist. Vielleicht ist da eine andere ClockInit 
Funktion schneller.

Ggf. verfolgen oder vorher nachsehen was im RCC drinsteht.

Autor: Benni Nori (benninori)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich probiers jetzt mal so aus, dass ich erstmal auf den HSI umschalt und 
schau, ob das dann besser läuft. Ansonsten komm ich auch mit den 48MHz 
klar. Hauptsache es tut.

Danke soweit für deine Hilfe.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vorher 2 Flash-Waits einstellen. Sonst säuft er natürlich ab.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kannte bisher nur die Taktung der 101er und 103er, der 105 sieht
etwas anders aus.

PLLVCO ist offenbar PLLCLK*2 auch wenn das nirgends ausdrücklich steht,
nur ein bischen indirekt im Datasheet. Bei 72MHz Sysclock ist das also
144MHz, bei dir /2 gibt 72MHz.

Da du oben davon ausgehst, dass der USB Takt durch 1,5 geteilt wird,
frage ich mich, in welchem Teil vom Manual zum RCC du nachgesehen hast,
unter Kapitel 6 (low/medium/high density devices 101-103), oder unter
Kapitel 7 (connectivity line 105-107). Denn der 105er teilt bei USB
durch 2 oder 3, aber nie durch 1,5.

>  //Clock configuration register
>  RCC->CFGR      = RCC_CFGR_PPRE1_DIV1;     //APB1 nicht teilen
>  RCC->CFGR     |= RCC_CFGR_PLLSRC;         //HSE als PLL-Eingangssignal
>  RCC->CFGR     |= RCC_CFGR_PLLMULL6;       //PLL=HSE*6

Dieser Teil ist etwas irritierend, denn er suggeriert, dass diese 3 
Zeilen die PLL definieren. Die beiden letzten tun das auch, aber der 
PPRE1-Teiler für APB1 hat damit nichts zu tun. PLLXTPRE_PREDIV1 würde an 
dieser Stelle besser passen.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:

> PLLVCO ist offenbar PLLCLK*2 auch wenn das nirgends ausdrücklich steht,
> nur ein bischen indirekt im Datasheet. Bei 72MHz Sysclock ist das also
> 144MHz, bei dir /2 gibt 72MHz.

PS: Damit wollte ich sagen, dass dein USB bei 72MHz Systemtakt mit 72MHz 
läuft. Denn obwohl der 105er anders dokumentiert ist kommt 
freundlicherweise das gleiche dabei raus.

Autor: Benni Nori (benninori)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
>PLLVCO ist offenbar PLLCLK*2 auch wenn das nirgends ausdrücklich steht,
>nur ein bischen indirekt im Datasheet. Bei 72MHz Sysclock ist das also
>144MHz, bei dir /2 gibt 72MHz.

Was meinst du damit? Ich finde gerade nicht die Stelle von der du 
redest.

> Da du oben davon ausgehst, dass der USB Takt durch 1,5 geteilt wird,
> frage ich mich, in welchem Teil vom Manual zum RCC du nachgesehen hast,
> unter Kapitel 6 (low/medium/high density devices 101-103), oder unter
> Kapitel 7 (connectivity line 105-107). Denn der 105er teilt bei USB
> durch 2 oder 3, aber nie durch 1,5.

Das mit den 1,5 steht im reference manual unter 6.3.2 Clock 
configuration register (RCC_CFGR). Da steht beim USB_PRE:

Set and cleared by software to generate 48 MHz USB clock. This bit must 
be valid before
enabling the USB clock in the RCC_APB1ENR register. This bit can’t be 
reset if the USB
clock is enabled.
0: PLL clock is divided by 1.5
1: PLL clock is not divided

>>  //Clock configuration register
>>  RCC->CFGR      = RCC_CFGR_PPRE1_DIV1;     //APB1 nicht teilen
>>  RCC->CFGR     |= RCC_CFGR_PLLSRC;         //HSE als PLL-Eingangssignal
>>  RCC->CFGR     |= RCC_CFGR_PLLMULL6;       //PLL=HSE*6
>
> Dieser Teil ist etwas irritierend, denn er suggeriert, dass diese 3
> Zeilen die PLL definieren. Die beiden letzten tun das auch, aber der
> PPRE1-Teiler für APB1 hat damit nichts zu tun. PLLXTPRE_PREDIV1 würde an
> dieser Stelle besser passen.

Ok, vielleicht ein bisschen doof zusammengestellt. Da hast du recht. 
aber PLLXTPRE_PREDIV1  ist doch, wenn ich APB1 als PLL-Eingang nutze. 
Das mach ich ja garnicht.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ben __ schrieb:

> Was meinst du damit? Ich finde gerade nicht die Stelle von der du
> redest.

Wenn du stets an der falschen Stelle suchst, wirst du sie nie finden.

> Das mit den 1,5 steht im reference manual unter 6.3.2 Clock
> configuration register (RCC_CFGR). Da steht beim USB_PRE:

Genau das dachte ich mir ja: Du sitzt im falschen Zug. Beim 105er gibt 
es kein USB_PRE, nicht einmal ein Kapitel 6 ;-). Soll heissen, es ist 
nicht auf die 105/107er anwendbar, für die gilt Kapitel 7. Steht in dem 
stets wiederkehrenden Sermon über die low/mid/high/conn Typen vorneweg, 
den man der steten Wiederholung wegen automatisch überspringt.

Immerhin heisst der Bit bei dir im Programm anders, das hätte dir 
eigentlich zu denken geben sollen.

> aber PLLXTPRE_PREDIV1  ist doch, wenn ich APB1 als PLL-Eingang nutze.
> Das mach ich ja garnicht.

APB1 wird vom Ausgang der PLL abgeleitet, hat nichts mit deren Eingang 
zu tun. Da ist allerdings auch ein Prescaler, der dummerweise auch noch 
ähnlich heisst, aber nichts mit den APBs zu tun hat.

Autor: Benni Nori (benninori)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> Genau das dachte ich mir ja: Du sitzt im falschen Zug. Beim 105er gibt
> es kein USB_PRE, nicht einmal ein Kapitel 6 ;-). Soll heissen, es ist
> nicht auf die 105/107er anwendbar, für die gilt Kapitel 7. Steht in dem
> stets wiederkehrenden Sermon über die low/mid/high/conn Typen vorneweg,
> den man der steten Wiederholung wegen automatisch überspringt.
>
> Immerhin heisst der Bit bei dir im Programm anders, das hätte dir
> eigentlich zu denken geben sollen.

OH, jetzt blick ichs. Steht ja eigentlich auch groß in der Überschrift. 
Das Kapitel 7 ist mir irgendwie noch nie groß aufgefallen, da ich in 6 
ja alles gefunden hab was ich brauche. Danke, da war ich ein kleines 
bisschen blind.

> APB1 wird vom Ausgang der PLL abgeleitet, hat nichts mit deren Eingang
> zu tun. Da ist allerdings auch ein Prescaler, der dummerweise auch noch
> ähnlich heisst, aber nichts mit den APBs zu tun hat.

OK.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.