Forum: Mikrocontroller und Digitale Elektronik STM32 Taktfrequenz


von Heiko (Gast)


Lesenswert?

Moin,

ich habe einen STM32f103 und stehe gerade etwas auf dem Schlauch, was 
die Taktfrequenz angeht: Ich benutzte die Funktion SystemInit() von 
CMSIS am Anfang und dort ist auch (SYSCLK_FREQ_72MHZ) definiert.
Danach tue ich nichts anderes, als ein Port Bit zu toggeln. Allerdings 
ändert sich der Ausgang mit ziemlich genau 8MHz, obwohl ich dachte, mein 
Takt wäre bei 72MHz.
Fehlt mir bei der Initialisierung noch etwas?

Hier mein Code:
1
  SystemInit(); //CMSIS Funktion (SYSCLK_FREQ_72MHz ist definiert)
2
3
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
4
  GPIO_InitTypeDef GPIO_InitStructure;
5
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_5;
6
  GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_Out_PP;
7
  GPIO_InitStructure.GPIO_Speed   = GPIO_Speed_50MHz;
8
  GPIO_Init(GPIOD, &GPIO_InitStructure);
9
10
11
  while(1)
12
  {
13
    GPIOD->BRR = GPIO_Pin_5;
14
    GPIOD->BSRR = GPIO_Pin_5;
15
    GPIOD->BRR = GPIO_Pin_5;
16
    GPIOD->BSRR = GPIO_Pin_5;
17
    GPIOD->BRR = GPIO_Pin_5;
18
    GPIOD->BSRR = GPIO_Pin_5;
19
  }

Danke und Gruß
Heiko

von pegel (Gast)


Lesenswert?

Auch die Toggle Befehle brauchen Zeit.

Zum prüfen der internen Takte, den MCO benutzen.

von pegel (Gast)


Lesenswert?

Ist für den F4, erklärt aber einiges:

https://jeelabs.org/2018/toggling-io-pins/

von Heiko (Gast)


Lesenswert?

Hi.

Danke für den Tipp mit dem MCO. Allerdings komme ich hier wieder nur auf 
die 8MHz, egal ob ich

RCC_MCOConfig(RCC_MCO_PLLCLK_Div2);

oder auch

RCC_MCOConfig(RCC_MCO_SYSCLK);

anschaue. Ich bleibe bei 8MHz.
Habe auch schon im Debugger geschaut. Bei der Initialisierungsroutine 
läuft der code durch die Funktion SetSysClockTo72() in der 
"system_stm32f10x.c" Datei.

Was könnte ich noch vergessen haben?

Grüße

von Bimbo. (Gast)


Lesenswert?

Du wirst nicht drum herum kommen, dir das Reference Manual 
herunterzuladen zu müssen und den Clock-Tree verstehen zu müssen. Sonst 
bleibt das ein Herumstochern im Dunkeln.

von Mike (Gast)


Lesenswert?

Oder installiere dir das Tool CubeMX, da kannst Du wunderbar mit den 
Clock-Configuration spielen und die kriegst dann die Initialisierung 
raus..

https://www.st.com/en/ecosystems/stm32cube.html#overview

von Jan (Gast)


Lesenswert?

Die Funktionen gehen glaub ich von einem vorhandenen Quarz aus. Ist das 
der Fall? Mit internem RC Oszillator können nämlich nur 64 MHz erreicht 
werden. Dafür muss auch die PLL an sein. Google Mal in die Richtung.
Es gibt auch von CMSIS eine Variable SystemCoreClock, Google danach. 
Dann brauchst du nix mehr togglen.

von Stefan F. (Gast)


Lesenswert?

Der Spannende Teil ist der Inhalt der SystemInit() Funktion. Ich würde 
die gerne mal sehen, bevor ich Scheiße laber.

Normalerweise wird die SystemInit() funktion übrigens vor der main() von 
der Initialisierungsroutine aufgerufen, die in Assembler geschrieben 
wurde. Man ruft sie normalerweise nicht selber auf.

von Häh? (Gast)


Lesenswert?

Wenn "GPIOD->BRR = GPIO_Pin_5"; und "GPIOD->BSRR = GPIO_Pin_5;" jeweils 
4 Takte benötigen, dann passt es doch: 72MHz/(4+4) = 9 MHz.
Wo ist denn denn das Problem?

von Bimbo. (Gast)


Lesenswert?

Häh? schrieb:
> Wenn "GPIOD->BRR = GPIO_Pin_5"; und "GPIOD->BSRR = GPIO_Pin_5;"
> jeweils
> 4 Takte benötigen, dann passt es doch: 72MHz/(4+4) = 9 MHz.
> Wo ist denn denn das Problem?

Daher: toggeln mit einem Hardware Timer! Ohne CubeMX sind das < 10 
Zeilen Code.
1
PINCONFIG(GPIOA, 3, T_ALTERNATE, T_PUSHPULL, T_NOPULL, 0); //Pin konfigurieren
2
RCC->APB2ENR |= RCC_APB2ENR_TIM15EN;                       //Takt Timer aktivieren
3
TIM15->CCMR1 |= (0b011ul << TIM_CCMR1_OC2M_Pos);           //Bei Überlauf toggeln  
4
TIM15->CCER |= TIM_CCER_CC2E;           //OC aktivieren  
5
TIM15->BDTR |= TIM_BDTR_MOE;
6
TIM15->ARR = F_CPU / (FRQ* 2) - 1;                         //Frequenz festlegen. *2, da toggeln
7
TIM15->CCR2 = 0;
8
TIM15->CR1 |= TIM_CR1_CEN;                                 //timer aktivieren

von Jan (Gast)


Lesenswert?

Nochmal, ihr braucht nix togglen. Entweder ihr glaubt der Software, also 
SystemCoreClock oder nehmt den MCO.

von Stefan F. (Gast)


Lesenswert?

Es ist aber schon (zumindest für mich) eine wichtige Erkenntnis, dass 
STM32 ihre I/O Pins per Software verhältnismäßig wesentlich langsamer 
toggeln, als AVR Mikrocontroller.

Ein 8 MHz AVR schafft 4 MHz, weil jeder I/O Zugriff nur einen Takt 
dauert.

von pegel (Gast)


Lesenswert?

Stefanus F. schrieb:
> Ein 8 MHz AVR schafft 4 MHz, weil jeder I/O Zugriff nur einen Takt
> dauert.

Aber nur, wenn du alle Befehle hintereinander im Speicher hältst.
Bei einer Schleife mit Sprung sieht das auch anders aus.

von Heiko (Gast)


Lesenswert?

Häh? schrieb:
> Wenn "GPIOD->BRR = GPIO_Pin_5"; und "GPIOD->BSRR = GPIO_Pin_5;" jeweils
> 4 Takte benötigen, dann passt es doch: 72MHz/(4+4) = 9 MHz.

Ja dann haben wir ja alles gelöst. Danke.
Wo könnte ich denn eine Übersicht über alle Funktionen bekommen, wie 
viele Takte sie jeweils benötigen?

von Stefan F. (Gast)


Lesenswert?

Heiko schrieb:
> Wo könnte ich denn eine Übersicht über alle Funktionen bekommen, wie
> viele Takte sie jeweils benötigen?

http://infocenter.arm.com/help/topic/com.arm.doc.ddi0337h/DDI0337H_cortex_m3_r2p0_trm.pdf 
Kapitel 3.3

Kennst du meine Seite? Da sind alle wichtigen Dokumente verlinkt: 
http://stefanfrings.de/stm32/stm32f1.html

von Bimbo. (Gast)


Lesenswert?

Das macht mein Compiler aus "GPIOA->BSRR = (1<<3)":
1
 80047be:  2390        movs  r3, #144  ; 0x90
2
 80047c0:  05db        lsls  r3, r3, #23
3
 80047c2:  2208        movs  r2, #8
4
 80047c4:  619a        str  r2, [r3, #24]

Beitrag #5814162 wurde von einem Moderator gelöscht.
von Stefan F. (Gast)


Lesenswert?

Wer auf einem ARM Controller Soft-USB entwickelt steht vermutlich auch 
auf Dornenkränze und Schläge mit der Peitsche.

Beitrag #5814171 wurde von einem Moderator gelöscht.
Beitrag #5814185 wurde von einem Moderator gelöscht.
Beitrag #5814194 wurde von einem Moderator gelöscht.
Beitrag #5814199 wurde von einem Moderator gelöscht.
Beitrag #5814205 wurde von einem Moderator gelöscht.
Beitrag #5814215 wurde von einem Moderator gelöscht.
Beitrag #5814224 wurde von einem Moderator gelöscht.
Beitrag #5814229 wurde von einem Moderator gelöscht.
Beitrag #5814235 wurde von einem Moderator gelöscht.
Beitrag #5814237 wurde von einem Moderator gelöscht.
von Hans-Georg L. (h-g-l)


Angehängte Dateien:

Lesenswert?

@heiko
SYSCLK_FREQ_72MHz nützt dir nichts wenn das Clocksystem nicht 
entsprechend  initialisiert ist. Wo wird das in deinem Programm gemacht 
?

Default ist der interne 8Mhz Oszillator als Sysclock eingestellt.
SystemInit() initialisiert kein Clocksystem.
Das ruftst du auch nicht auf, das macht der StartupCode den du dazu 
linken musst.

Nimm cube MX und stelle es wie im Bild ein ... lass dir den Code 
generieren und schau ihn dir an.

von Häh? (Gast)


Lesenswert?

Bimbo. schrieb im Beitrag #5814237:
> Kein Bedarf, denn ich mache keine Pin Wackeldackel, wenn ich das in
> Hardware erledigen kann ;).

Du hättest aber auch keine Wahl: Wenn taktgenau, dann Hardware. Jetzt 
begriffen?

von Hans-Georg L. (h-g-l)


Lesenswert?

Häh? schrieb im Beitrag #5814224:
>> ...taktgenauen (!) CPU-Befehle...
>
> Diese Eigenschaft hat der STM32 nämlich nicht.

Die STM32 sind wie alle anderen MCs synchrone Designs und laufen 
selbstverständlich Taktsynchron und genau.

von Bimbo. (Gast)


Lesenswert?

Häh? schrieb:
> Du hättest aber auch keine Wahl: Wenn taktgenau, dann Hardware. Jetzt
> begriffen?

So macht man das auch Professionell.

von Häh? (Gast)


Lesenswert?

Hans-Georg L. schrieb:
> Häh? schrieb:
>>> ...taktgenauen (!) CPU-Befehle...
>>
>> Diese Eigenschaft hat der STM32 nämlich nicht.
>
> Die STM32 sind wie alle anderen MCs synchrone Designs und laufen
> selbstverständlich Taktsynchron und genau.

Nein!
WaitStates, Prefetch, gleichzeitige Speicherzugriffe (Debugger, DMA, 
USART, ...), ... haben Einfluss. Beim STM32 kann man mit CPU-Befehlen 
keine taktgenauen Abläufe machen. Tut mir leid, ich weiss wovon ich 
schreibe.

Bimbo. schrieb:
> Häh? schrieb:
>> Du hättest aber auch keine Wahl: Wenn taktgenau, dann Hardware. Jetzt
>> begriffen?
>
> So macht man das auch Professionell.

Ja. Das ändert aber nichts an meiner Aussage.

von Bimbo. (Gast)


Lesenswert?

Häh? schrieb:
> WaitStates, Prefetch, gleichzeitige Speicherzugriffe (Debugger, DMA,
> USART, ...), ... haben Einfluss.

Kannst du alles ausschalten. Dann verzichtest du aber auf die 
Möglichkeiten, dein Programm schneller zu machen. Dann ist aber ein Add 
auch 1 Cycle und du bist wieder in der Atmega-Welt.

von Stefan F. (Gast)


Lesenswert?

Bimbo. schrieb:
> Dann ist aber ein Add
> auch 1 Cycle und du bist wieder in der Atmega-Welt.

Wobei dann so ein STM32 letztendlich langsamer wird, als ein AVR mit 20 
oder 32 MHz.

Der Flash von ST kann nämlich nur maximal 24 Mhz und für viele Befehle 
(insbesondere I/O) sind mehr Takzyklen nötig, als bei AVR.

von Bimbo. (Gast)


Lesenswert?

Das ist gut möglich, weiß ich jetzt nicht. Aber wenn man im MHz Bereich 
taktgenau mit Pins wackeln möchte ohne die Hardware zu benutzen - dann 
läuft sowieso etwas gewaltig schief ;)..

Beitrag #5814423 wurde von einem Moderator gelöscht.
von Andreas R. (daybyter)


Lesenswert?

Und wenn man den stm32 übertaktet, sollte es doch bischen schneller 
gehen?

http://amitesh-singh.github.io/stm32/2018/06/17/overclocking-blue-pills.html

Beitrag #5814447 wurde von einem Moderator gelöscht.
von Hans-Georg L. (h-g-l)


Lesenswert?

Bimbo. schrieb:
> Das ist gut möglich, weiß ich jetzt nicht. Aber wenn man im MHz Bereich
> taktgenau mit Pins wackeln möchte ohne die Hardware zu benutzen - dann
> läuft sowieso etwas gewaltig schief ;)..

Die STM haben doch dafür genau die vielen Timer und die interconnect 
matrix.
Die sind doch hauptsächlich für Timing von Motorsteuerungen und 
Schaltregler designt. Damit lassen sich doch viele Probleme ohne 
Cpuzyklen und Port gefummel und sogar ohne CPU komplett in Hardware 
erledigen. Die Hardware ist doch da benutze sie.

Und es gibt ja nicht nur den F103 ;-)

ps. dein Cpu zyklen genau  != taktgenau

Beitrag #5814564 wurde von einem Moderator gelöscht.
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.