ARM Cortex-M NVIC-Interrupt anstehend löschen oder nicht löschen

Muss ich den ausstehenden Status eines Interrupts in der Interrupt-Service-Routine einer ARM Cortex-M0-MCU löschen?

Konnte dazu keine Informationen im Web finden.

Ich kann nicht für diesen speziellen Prozessor antworten, aber im Allgemeinen müssen Sie den anstehenden Interrupt in der ISR löschen. Wenn Sie dies nicht tun, bleibt der Interrupt aktiviert und sobald Sie die ISR verlassen, wird er erneut ausgelöst.

Antworten (3)

Nein, Sie müssen den ausstehenden Status im NVIC nicht löschen, das geschieht automatisch, wenn der Interrupt bedient wird (siehe Joseph Yiu, The Definitive Guide to ARM Cortex-M3 and Cortex-M4 Processors, 3rd Edition, page 247) .

Möglicherweise müssen Sie jedoch die Bedingung löschen, die den Interrupt auf dem bestimmten Peripheriegerät verursacht hat.

"Möglicherweise müssen Sie die Bedingung löschen, die den Interrupt auf dem bestimmten Peripheriegerät verursacht hat" - könnten Sie diesen Satz bitte etwas näher erläutern? Wann muss ich das tun? Welche Peripherie?
Einige Peripheriegeräte setzen ein Flag für den Interrupt, der in der Interrupt-Routine zurückgesetzt werden muss. Zum Beispiel hat das SCT auf LPC8xx das EVFLAG-Register, wo ein Ereignis einen Interrupt verursachen kann, indem es sein entsprechendes Bit setzt. Wenn es nicht gelöscht wird, wird der Interrupt sofort erneut ausgelöst.
Ich finde unglaublich, dass solch wichtige Informationen nicht in der Bedienungsanleitung des Teils stehen. Sie müssen tatsächlich ein Buch kaufen, um es herauszufinden! Dies ist meiner Meinung nach eine der größten Herausforderungen beim Erlernen der ARM-Programmierung. Die Informationen, die Sie benötigen, sind in Handbüchern, Datenblättern, Büchern, Websites und Codebeispielen verbreitet, und Sie haben die Aufgabe, sie an Orten abzubauen, die Sie sich überhaupt vorstellen können!
Eigentlich sollte es in einem der ARM-Dokumente stehen, aber ich konnte es dort nicht finden. Ich denke, es ist ein Versehen, da der ARM ARM DDI0403 ansonsten sehr detailliert ist (viel Pseudocode). Dies sollte in SCS_UpdateStatusRegs() erfolgen, was leider nicht vorgesehen ist.

IN PIO muss man nur den PIO_ISR-Status innerhalb der Interrupt-Prozedur lesen. Im anderen Fall macht es den Interrut direkt nach dem Interrupt-Exit anhängig. Ich bin mir derzeit nicht sicher, aber ich denke, der Atmel ASF-Handler macht es automatisch, aber wenn man in die niedrigere Ebene geht, darf man nicht vergessen, es selbst zu machen.

Danke ABC für den Hinweis. Ich habe Wochen gebraucht, um das herauszufinden, da der ASF-Handler dies NICHT automatisch macht. Da ich nur einen Pin für den Interrupt aktiv habe, muss ich dieses Register für die Pin-Lokalisierung nicht lesen. Wenn ich jetzt immer dieses Register auslese, funktioniert alles einwandfrei.

Hinweis: Im Datenblatt der PIO-Benutzeroberfläche des SAM E70 (mein Prozessor) unter der PIO_ISR-Registerbeschreibung steht folgender Satz: „1: Mindestens eine Eingangsänderung wurde auf der I/O-Leitung erkannt, seit PIO_ISR zuletzt gelesen wurde oder seit Reset.“ Ich denke, das ist wirklich schwer zu finden.