Forum: Mikrocontroller und Digitale Elektronik STM32 interrupt stalled Interrupt


von dunky (Gast)


Lesenswert?

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!

von Peter D. (peda)


Lesenswert?

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.

von dunky (Gast)


Angehängte Dateien:

Lesenswert?

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.

von dunky (Gast)


Lesenswert?

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

von Jim M. (turboj)


Lesenswert?

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...

von Peter D. (peda)


Lesenswert?

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.

von Bauform B. (bauformb)


Lesenswert?

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).

von dunky (Gast)


Angehängte Dateien:

Lesenswert?

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

von dunky (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.