Forum: Mikrocontroller und Digitale Elektronik Taktfrequenz bei STM32F103C8T6 Minimum development board


von Refik H. (refik)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe mir vor einiger Zeit ein STM32F103C8T6 Minimum System 
Development Board Module aus China bestellt. Das Teil ist angekommen und 
ich wollte damit ein bisschen spielen. Ich habe hier auf dem Forum ein 
nettes Tutorial gefunden, http://diller-technologies.de/stm32_wide.html

Ich habe CooCox IDE und den GNU ARM Compiler installiert und "Hello 
World!"  mit der blinkenden LED auf PORTC13 geschrieben, hat alles super 
geklappt.

Ich dachte die Taktfrequenz von dem MCU waere auf 72 MHz gestellt, so 
steht es bei mir in der system_stm32f10x.c Datei. Wenn ich aber den 
Logikanalysator  benutze um das auch zu ueberpruefen, sehe ich aber 
etwas komplet "falsches". Der Ausgang zeigt ein Digitales Signal mit der 
Frequenz von 761.9 KHz. Der Code aus der main.c Datei ist der folgende:
1
#include "stm32f10x_conf.h"
2
3
int main(void)
4
{
5
  GPIO_InitTypeDef GPIO_InitStructure;
6
7
  SystemInit();
8
9
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
10
11
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
12
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
13
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
14
  GPIO_Init(GPIOB, &GPIO_InitStructure);
15
16
  GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_RESET);
17
18
  while(1)
19
  {
20
    GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_SET);
21
    GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_RESET);
22
  }
23
}

Ich habe mit den Taktfrequenzen, in der system_stm32f10x.c Datei, 
rumgespielt und bemmerkt wenn ich eine niedrigere Taktfrequenz waehle, 
wird der Ausgangssignal auch langsamer aber trotzdem nicht so schnell 
wie es erwartet haette.
1
/* #define SYSCLK_FREQ_HSE    HSE_VALUE */
2
/* #define SYSCLK_FREQ_24MHz  24000000 */ 
3
/* #define SYSCLK_FREQ_36MHz  36000000 */
4
 #define SYSCLK_FREQ_48MHz  48000000 
5
/* #define SYSCLK_FREQ_56MHz  56000000 */
6
//#define SYSCLK_FREQ_72MHz  72000000

Ich weiss das der chinesische Logikanalysator nur 24 MSps kann aber ich 
habe ein Experiment mit einer While Schleife versucht, um halt "eine 
Sekunde" Pause zu generieren (auf 72MHz denke ich 72 000 000 Additionen 
entsprechen einer Sekunde ungefaehr) aber es hat sehr lange gedauert, 
viel laenger als 10 Sekunden.
1
int count = 0;
2
while(count < 72000000) {
3
  count++;
4
}

Was verstehe ich hier falsch? Sind die Clock Register falsch 
eingestellt? Im Anhang befindet sich der Debug Output von den Clock und 
GPIOB Registern.

Ich hoffe jemand kann mir helfen und erklaeren was ich falsch mache oder 
was ich falsch verstanden habe.

Vielen Dank

von Meister Propper (Gast)


Lesenswert?

Refik H. schrieb:
>   while(1)
>   {
>     GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_SET);
>     GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_RESET);
>   }
> }
> Ich weiss das der chinesische Logikanalysator nur 24 MSps kann aber ich
> habe ein Experiment mit einer While Schleife versucht, um halt "eine
> Sekunde" Pause zu generieren (auf 72MHz denke ich 72 000 000 Additionen
> entsprechen einer Sekunde ungefaehr) aber es hat sehr lange gedauert,
> viel laenger als 10 Sekunden.
> Ich hoffe jemand kann mir helfen und erklaeren was ich falsch mache oder
> was ich falsch verstanden habe.


Was erwartest Du? Du benutzt die lausige Bibliothek, das wird in etliche 
Maschinenbefehle übersetzt und ist entsprechend grottenlangsam.
Mal abgesehen, daß Du selbst in Assembembler keine 72MHz Toggle Frequenz 
hinbekommst.

Um die Einstellungen zu testen, kannst Du ja einen Timer benutzen und 
dann jede Sekunde einen Pin toggeln. Dann kannst Du messen, ob das 
hinkommt.

von Refik H. (refik)


Lesenswert?

Hallo,

erst mal vielen Dank fuer deine Antwort. Ich habe nicht eine Toggle 
Frequenz von 72 MHz erwartet aber etwas hoeher als die oben gegebenen 
774 KHz haette ich schon erwartet. Ich habe den Beispiel mit dem Timer 
ausprobiert, es togglet den Bit jede 500 ms und es hat alles prima 
funktioniert:
1
#include "stm32f10x_conf.h"
2
3
int main(void)
4
{
5
    GPIO_InitTypeDef GPIO_InitStructure;
6
    TIM_TimeBaseInitTypeDef TIM_TimeBase_InitStructure;
7
    NVIC_InitTypeDef NVIC_InitStructure;
8
9
    SystemInit();
10
11
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
12
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
13
14
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
15
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
16
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
17
    GPIO_Init(GPIOA, &GPIO_InitStructure);
18
19
    TIM_TimeBase_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
20
    TIM_TimeBase_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
21
    TIM_TimeBase_InitStructure.TIM_Period = 1999;
22
    TIM_TimeBase_InitStructure.TIM_Prescaler = 17999;
23
    TIM_TimeBaseInit(TIM2, &TIM_TimeBase_InitStructure);
24
25
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
26
27
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
28
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
29
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
30
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
31
    NVIC_Init(&NVIC_InitStructure);
32
33
    TIM_Cmd(TIM2, ENABLE);
34
35
    while(1);
36
}
37
38
void TIM2_IRQHandler(void){
39
  TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
40
  if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5)){
41
    GPIO_WriteBit(GPIOA, GPIO_Pin_5, RESET);
42
  }else{
43
    GPIO_WriteBit(GPIOA, GPIO_Pin_5, SET);
44
  }
45
}

Das heisst, dass meine Hypothese von Anfang an halt falsch war. Ich habe 
halt erwartet das togglen wird viel schneller sein. Ich dachte die 
Bibliotheken werden nicht so viel die Geschwindigkeit des MCUs 
reduzieren. Gibt es eine Moeglichkeit den SYSCLK auf einen Pin 
auszugeben, dann koennte ich mit dem Oszi festellen ob da wirklich 72 
MHz sind (obwohl das ja uebereinstimmen muss wegen den Teilern und 
Prescalers fuer den Timer)?

Vielen Dank!

von devnull (Gast)


Lesenswert?

Refik H. schrieb:
> ibt es eine Moeglichkeit den SYSCLK auf einen Pin
> auszugeben, dann koennte ich mit dem Oszi festellen ob da wirklich 72
> MHz sind

JA, mit MCO

von Refik H. (refik)


Lesenswert?

Hallo devnull,

vielen Dank fuer deine Antwort. Ich habe ein Beispiel gefunden und es 
hat prima geklappt. Der Ausgangssignal hatte wirklich 72 MHz wie 
gedacht. Vielen Dank an euch beide. Hier ist noch der Beispiel fuer den 
STM32F103.
1
void MCO_Config(void)
2
{
3
    GPIO_InitTypeDef is;
4
5
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
6
7
    is.GPIO_Pin = GPIO_Pin_8;
8
    is.GPIO_Speed = GPIO_Speed_50MHz;
9
    is.GPIO_Mode = GPIO_Mode_AF_PP;
10
    GPIO_Init(GPIOA,&is);
11
12
    RCC_MCOConfig(RCC_MCO_SYSCLK);
13
    return;
14
}

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Refik H. schrieb:
> if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5)){
>     GPIO_WriteBit(GPIOA, GPIO_Pin_5, RESET);
>   }else{
>     GPIO_WriteBit(GPIOA, GPIO_Pin_5, SET);

Das kostet ziemlich viel Zeit - besonders, wenn Du die GPIO-Funktionen 
benutzt. Wenn Du direkt auf die Port-Register zugreifst, bist du um ein 
Vielfaches schneller.

Siehe auch:

  Beitrag "Re: STM32 Pin-Toogle!"

von Refik H. (refik)


Lesenswert?

Hallo Frank,

vielen Dank fuer deinen Beitrag. Das war sehr hilfreich. Da bekomme ich 
ja mehr als die doppelte Frequenz, 1.6 MHz. Super!!!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Refik H. schrieb:
> Da bekomme ich ja mehr als die doppelte Frequenz, 1.6 MHz.

Geht auch noch mind. 4 mal schneller - wenn es denn unbedingt sein muss:

   http://forums.leaflabs.com/topic.php?id=860

Ist aber nur sinnvoll bei einer beschränkten, nicht zu großen Anzahl von 
zu generierenden Pulsen. Eine Endlosschleife kann man nämlich nicht 
"unrollen" ;-)

von Meister Propper (Gast)


Lesenswert?


von Dirk K. (dekoepi)


Lesenswert?

-Os

anstatt
-O2

kostet ebenfalls Zeit. Compiler-Einstellungen dahingehend überprüfen.

von Refik H. (refik)


Lesenswert?

Hallo alle zusammen,

vielen Dank. Die Toggle Frequenz ist mir nicht so wichtig wie die 
Hypothese, ob ich etwas Falsch oder Richtig verstanden habe. Auf jeden 
Fall Danke fuer die Links, habe mehr Stoff zu lesen und verstehen :)

Dirk, das mit der Compiler-Einstellung werde ich mir auch anschauen, 
darueber habe ich ueberhaupt nicht nachgedacht obwohl es ziemlich 
entscheidend ist.

Danke Leute fuer die Hilfreichen Links und Erklaerungen :D

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.