STM32 Taktfrequenz

Gast #5813981
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
Gast #5813989
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
Gast #5814086
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
Beitrag #5814162 wurde von einem Moderator gelöscht.
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.
#5814238
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.
Angehängte Dateien:
Gast #5814354
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.
Beitrag #5814423 wurde von einem Moderator gelöscht.
Beitrag #5814447 wurde von einem Moderator gelöscht.
#5814505
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren