Hallo Leute ich habe hier ein Problem, welches mich fast verzweifeln
lässt.
Wenn ich folgenes Blink Beispiel auf den Chip flashe, funktioniert alles
super. Wenn ich lediglich den Wert in der ersten Delay in 450 oder
größer ändere wird der Code danach nicht mehr ausgeführt. Wenn ich mit
dem Debugger Schaue und beim Rücksetzen des Pins einen Breakepoint
setze, wird dieser auch erreicht. Ein Breakepoint beim Setzen wird nicht
erreicht. Der Chip hängt aber nirgendwo sondern erricht nur immer wieder
den ersten Breakepiont... Wie gesagt mit Delay(400) läuft alles wie
geplant...
Hallo,
also ich kenne zwar den STM32 nicht, aber ich denke mal das ein uint32
nicht mit einem Befehl vom RAM in (ein oder mehrere Reg.?) tranferiert
werden kann?
Wenn dem so ist, dann sind
Ticks = cycles;
while (Ticks>0);
nicht atomar, also könnte dir hier die ISR SysTick_Handler()
dazwischenfunken und einen Teil des uint32 noch beim Beschreiben ändern.
Sascha
Das wars auch nicht... Jetzt wirds immer komischer: ich habe mal ein
anderes Board probiert und es läuft!!! Woran kann das liegen es sind 2
identische Stm32 Discovery Boards......
Pete schrieb:> es sind 2> identische Stm32 Discovery Boards......
Wenn das stimmt, was du schreibst, eher nicht. Kannst du sicherstellen,
dass es immer das selbe Hex-File ist, welches du in beide Boards flasht?
Du könntest ja auch beide Boards auslesen und ein Compare über die
Hexfiles machen.
Sascha Weber schrieb:> also ich kenne zwar den STM32 nicht, aber ich denke mal das ein uint32> nicht mit einem Befehl vom RAM in (ein oder mehrere Reg.?) tranferiert> werden kann?
Falsch; beim ARMv7 sind uint32-Zugriffe per Spezifikation immer atomar
(und werden dank 32bit-Bus auch in einem Zyklus durchgeführt). Siehe S.
101,102 im ARMv7M-Architecture Reference Manual.
Warum das nicht funktioniert weiß ich aber auch nicht ("Ticks" sollte
natürlich volatile sein)... Vielleicht mal überprüfen ob der Controller
aus ominösen Gründen ständig resettet? (Breakpoint auf Reset_Handler)
Genau das!!! Kann das vom watchdog kommen?? Ist der hardwaremäßig
implementiert? Sprich muss ich den expliziet wieder rücksetzen wenn ich
den in nem anderen projekt mal benutzt habe?
Pete schrieb:> Genau das!!! Kann das vom watchdog kommen?? Ist der hardwaremäßig> implementiert?
Dein Prozessor-Datenblatt sollte darüber Auskunft geben.
Aber im Normalfall ist der hardwaremässig implementiert. Muss auch so
sein, denn der Watchdog muss auch dann noch funktionieren, wenn sich
dein Programm bzw. der Prozessor haushoch verfranst hat und nur noch vor
sich hindümpelt.
Dann kommt die möglichst unabhängige Hardware-Einheit "Watchdog" und
resettet den Prozessor in einen gültigen Zustand.
pete schrieb:> Der Chip hängt aber nirgendwo sondern erricht nur immer wieder> den ersten Breakepiont..
Und was sagt der Debugger über den Weg dort hin?
Ein Break Point vor der while-Schleife könnte verraten, ob er dazu über
"Los" geht.
Es war/ist der Watchdog. Wenn ich diesen so verstelle dass der Prescaler
der Reload größer sind, denn blinkt es.. Anscheinend gibt es aber keine
Möglichkeit den IWDG ganz abzustellen, wenn er einmal aktiv ist... Das
Board ist also "hin"
Peter Pan schrieb:> Anscheinend gibt es aber keine Möglichkeit den IWDG ganz abzustellen
Du könntest aber dein Gesamt-Delay in handliche Brocken aufteilen und
zwischendurch das arme Tier ein bisschen streicheln.
Besser wäre natürlich, wenn du die unsäglichen Delays ganz rausschmeißt
und durch eine vernünftige Timersteuerung ersetzt. Spätestens wenn
wesentlich mehr als eine LED blinken soll, brauchst du das sowieso.
Michael schrieb:> Peter Pan schrieb:>> Anscheinend gibt es aber keine Möglichkeit den IWDG ganz abzustellen> Du könntest aber dein Gesamt-Delay in handliche Brocken aufteilen und> zwischendurch das arme Tier ein bisschen streicheln.> Besser wäre natürlich, wenn du die unsäglichen Delays ganz rausschmeißt> und durch eine vernünftige Timersteuerung ersetzt. Spätestens wenn> wesentlich mehr als eine LED blinken soll, brauchst du das sowieso.
Das weiß ich... Das Blinkn ist nur ein Testprogramm um den Bootloader zu
testen, den ich gerade schreibe... Ich wollte halt ein Program, bei dem
ich nach dem flashen gleich sehe obs geht....
Peter Pan schrieb:> Anscheinend gibt es aber keine> Möglichkeit den IWDG ganz abzustellen, wenn er einmal aktiv ist...
Wieso das? Die Option Bytes kann man beliebig umprogrammieren (Seite 71
im RM), wenn du nicht gerade die Lockbits gesetzt hast.