Da ich noch ein ziemlicher Anfänger mit dem STM32F4 Discovery bin,
probiere ich im Moment eine Delay Funktion aus, die solange in einer
Schleife nichts tut, bis ein counter unter 0 ist. Dieser wird im
SysTickHandler() runtergezählt.
folgendes Problem: Diese Schleife wird irgendwie endlos ausgefürt,
jedenfalls gehen die LED's nich wieder an.
Hier der Quellcode:
Ich wäre euch sehr dankbar, wenn ihr eine Lösung für dieses Problem
hättet.
PS: OS ist Ubuntu 13.10 mit arm-none-eabi und st-link
Beide Programme sind in der Kommandozeile zuhause, also sthet mir
keine IDE zur Verfügung.
>Ich wäre euch sehr dankbar, wenn ihr eine Lösung für dieses Problem>hättet.
Ein Counter der negativ wird ist Quatsch. Es reicht ihn auf
Null zu zählen.
Einen Nachteil hat die Geschichte allerdings.
Wenn der Systick Interrupt kurz bevor steht
und man ein delay(1); macht wird das delay
keine ganze Millisekunde dauern. Das Teil kann auch sofort
zurückkommen;)
Vielen Dank. Jetzt funktioniert das ganze prima.
holger schrieb:> Einen Nachteil hat die Geschichte allerdings.> Wenn der Systick Interrupt kurz bevor steht> und man ein delay(1); macht wird das delay> keine ganze Millisekunde dauern. Das Teil kann auch sofort> zurückkommen;)
Das dürfte doch kein Problem mehr sein, wenn ich die SysTickClock auf
1
SysTick_Config(SystemCoreClock/1000-1);
seze, oder?
(nicht mehr) ratloser_stm_user
PS: was macht volatile eigentlich genau?? Ich weiß nur, dass auf die
Varablen anders zugegriffen wird, um sie aktuell zu halten.
Und vor allem warum und was optimieren die Funktionen?
ratloser_stm_user schrieb:> PS: was macht volatile eigentlich genau?? Ich weiß nur, dass auf die> Varablen anders zugegriffen wird, um sie aktuell zu halten.> Und vor allem warum und was optimieren die Funktionen?
Kann mir hierauf jmd einen Link oder eine Antwort geben?
ratloser_stm_user schrieb:> Dr. Sommer schrieb:>> __WFI ();>> Was ist das denn??
Wait For Interrupt. Legt den Core schlafen bis ein Interrupt - wie der
SysTick Interrupt - kommt. So muss er nicht mit 168 MHz nichts tun.
Reduziert den Stromverbrauch um Größenordnungen...
Siehe S. 683 im ARM v7-M Architecture Reference Manual.
N.G. schrieb:> Schau ins FAQ hier
Jo vielen Dank, jetz hab ichs verstanden.
Dr. Sommer schrieb:> Wait For Interrupt. Legt den Core schlafen bis ein Interrupt
also im rinzip nicts anderes als wenn ichs net hinschreibe, nur dass der
Prozessor schläft(also nichts verbraucht).
1.)Aber wenn er den Prozessor nur zu irgendeinem Interrupt hochfährt,
kann das doch irgendein X-beliebiger sein, oder?
2.)Wenn der Prozessor aus dem Interrupt rausgeht, wird im Ablauf normal
fortgefahren?
ratloser_stm_user schrieb:> also im rinzip nicts anderes als wenn ichs net hinschreibe, nur dass der> Prozessor schläft(also nichts verbraucht).
Ja.
> 1.)Aber wenn er den Prozessor nur zu irgendeinem Interrupt hochfährt,> kann das doch irgendein X-beliebiger sein, oder?
Ja, er wacht bei allen Interrupts auf. Wenn kein Interrupt-Handler
definiert ist wird er wie ohne Verwendung von __WFI() auch abstürzen
(einer der Error-Handler wird aufgerufen).
> 2.)Wenn der Prozessor aus dem Interrupt rausgeht, wird im Ablauf normal> fortgefahren?
Wenn alle Interrupts abgehandelt sind kehrt __WFI() zurück; in diesem
Fall wird es direkt wieder aufgerufen wegen der Schleife bzw.
Dr. Sommer schrieb:> ratloser_stm_user schrieb:>> also im rinzip nicts anderes als wenn ichs net hinschreibe, nur dass der>> Prozessor schläft(also nichts verbraucht).> Ja.>> 1.)Aber wenn er den Prozessor nur zu irgendeinem Interrupt hochfährt,>> kann das doch irgendein X-beliebiger sein, oder?> Ja, er wacht bei allen Interrupts auf. Wenn kein Interrupt-Handler> definiert ist wird er wie ohne Verwendung von __WFI() auch abstürzen> (einer der Error-Handler wird aufgerufen).>> 2.)Wenn der Prozessor aus dem Interrupt rausgeht, wird im Ablauf normal>> fortgefahren?> Wenn alle Interrupts abgehandelt sind kehrt __WFI() zurück; in diesem> Fall wird es direkt wieder aufgerufen wegen der Schleife bzw.
Das heißt, dass ich ihn lieber nicht benutze, nur um ein paar mA zu
sparen...
Nicht dass ich dann beim nächsten Interrupt hier die nächste Frage
stelle.
ratloser_stm_user schrieb:>>> 2.)Wenn der Prozessor aus dem Interrupt rausgeht, wird im Ablauf normal>>> fortgefahren?>> Wenn alle Interrupts abgehandelt sind kehrt __WFI() zurück; in diesem>> Fall wird es direkt wieder aufgerufen wegen der Schleife bzw.>> Das heißt, dass ich ihn lieber nicht benutze, nur um ein paar mA zu> sparen...
Was warum nicht?! Es ist funktional kein Unterschied zu ohne Nutzung
von __WFI() da, es braucht nur weniger Strom und vermeidet das sehr
intensive Tun von nichts.
> Nicht dass ich dann beim nächsten Interrupt hier die nächste Frage> stelle.
Wieso das? Du verwendest alle Interrupts einfach ganz normal wie immer.