Hi, da mein Programm Flash Sectoren löscht, ich den WWDG verwende auf einem STM32F407 habe ich das Problem, dass der Watchdog auslöst, da das löschen zu lange braucht. Um das Window zu vergrößern, retriggere ich den Watchdog im EWI Interrupt(hat höchste Prio), der einen Takt bevor der Watchdog zuschlägt, ausgelöst wird. Da die IRQs stallen würden wenn sie im Flash liegen, habe ich den IRQ Handler in den RAM verschoben(prinzipiell funktioniert das und ich springe auch in meinen RAM Handler wenn ich den Watchdog nicht triggere) Aber trotzdem: sobald ich einen Sektor lösche, schlägt der Watchdog zu, da anscheinend dann doch irgendetwas stalled. Ich habe noch andere IRQs die theoretisch währenddessen austreten können und dann stallen würden, da sie im Flash liegen. Ich hätte jetzt erwartet, das mein mit höchster Prio laufender Watchdog IRQ diese anderen stallenden IRQs unterbrechen kann. Aber ist das wirklich so? Kann so ein stallender IRQ unterbrochen werden? Oder muss ich während des Flash löschens ALLE IRQs disabeln welche im Flash liegen? Danke für Hilfe!
dunky schrieb: > Ich hätte jetzt erwartet, das mein mit höchster Prio laufender Watchdog > IRQ diese anderen stallenden IRQs unterbrechen kann. Tut er bestimmt auch. Nur bleibst Du ja nicht für ewig in dem Interrupt, sondern kehrst zurück zum Main.
Achso, ich benutze einen STM32f407, der eine FlashBank hat, was nun zu dem Salat führt. IWDG ist momentan keine Option, da der anderweitig missbraucht wurde Anbei der IRQ Handler. die 0x2... Adressen liegen alle im SRAM und ich sehe momentan nicht, dass ich in diesem Handler aufs Flash zugreife.
Peter D. schrieb: > Tut er bestimmt auch. Nur bleibst Du ja nicht für ewig in dem Interrupt, > sondern kehrst zurück zum Main. ja, aber dann sollte das retriggern des Watchdogs ja funktonieren? Aber tut es nicht, wenn ich das Flash lösche, da ich danach auch sehe, dass der Watchdog ausgelöst hat. Prinzipiell sollte mein verschieben in den RAM aber schon funktioniert haben, da ich da auch in den Handler reinspringe, wenn ich den Watchdog testweise nicht in der Mainloop triggere. Mein Window ist 50ms breit und ich habe es auf ca 12s vergrößert mit meinem triggern im IRQ. Da ich sonst aber nicht alle anderen IRQs disable und diese stallen sollten, da sie im Flash liegen eben die Frage ob mein RAM IRQ diese stallenden IRQs unterbrechen können soll. Ich weiß gar nicht ob das praktisch gehen sollte
dunky schrieb: > Da die IRQs stallen würden wenn sie im Flash liegen, habe ich den IRQ > Handler in den RAM verschoben Hast Du die Vektortabelle auch in den RAM verschoben? Die liegt ansonsten im Flash...
Schreib doch einfach eine Hilfsfunktion in den RAM. Diese disabled alle Interrupts und startet das Flashen. Dann pollt sie in einer Schleife das Readyflag und triggert den Watchdog.
dunky schrieb: > Da ich sonst aber nicht alle anderen IRQs disable und diese stallen > sollten, da sie im Flash liegen eben die Frage ob mein RAM IRQ diese > stallenden IRQs unterbrechen können soll. Ich weiß gar nicht ob das > praktisch gehen sollte praktisch wäre das schon ;) Kannst du nicht einfach alle anderen Interrupts mittels BASEPRI Register blockieren? Der WWDG Interrupt hat doch sowieso die höchste Priorität? (Hatte er bei mir zeitweise nicht, weil ich die prio-Bits nicht korrekt verschoben hatte. Das merkt man normal überhaupt nicht).
Jim M. schrieb: > Hast Du die Vektortabelle auch in den RAM verschoben? Die liegt > ansonsten im Flash... Ja, habe ich kopiert. Und die 0x20000201 wäre der Vector, der dann auf meinen RAM Code zeigt. Soweit ich das beurteilen kann, sollte das passen. Für mich ist das ganze eine Operation am offenen Herzen des uC, deswegen bin ich mir unsicher ob ich nicht ein Detail übersehe weswegen das Konstrukt nicht funktioniert
Peter D. schrieb: > Schreib doch einfach eine Hilfsfunktion in den RAM. > Diese disabled alle Interrupts und startet das Flashen. > Dann pollt sie in einer Schleife das Readyflag und triggert den > Watchdog. Gute Idee! Ich werde das mal probieren!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.

