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:
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
intcount=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
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.
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:
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!
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
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.
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!"
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" ;-)
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