Wie einige von Ihnen vielleicht wissen, bietet Atmel ein Software-Framework (hauptsächlich als Teil von Atmel Studio), das Treiber und Beispiele bereitstellt und mehr oder weniger regelmäßig aktualisiert wird.
In einem kürzlich durchgeführten Update wird ausdrücklich darauf hingewiesen, dass es wichtig ist , das Überlauf-Interrupt-Flag in der Interrupt-Rückruffunktion manuell zu löschen.
// * \subsection xmega_tc_qs_ovf_setup_code Example code
// *
// * Add a callback function that will be executed when the overflow interrupt
// * trigger.
// * \code
static void my_callback(void)
{
// User code to execute when the overflow occurs here
// THIS WAS ADDED IN LAST UPDATE
// Important to clear Interrupt Flag
tc_clear_overflow(&TCC0);
// THIS WAS ADDED IN LAST UPDATE
}
//\endcode
Laut XMEGAA-Datenblatt:
OVFIF wird automatisch gelöscht, wenn der entsprechende Interruptvektor ausgeführt wird. Das Flag kann auch gelöscht werden, indem eine Eins in die Bitposition geschrieben wird.
Gibt es ein Szenario / einen Grund, in dem das manuelle Löschen der Flagge erforderlich sein kann?
c
atmel-studio
xmega
Rev1.0
quelle
quelle
SAM4SD32C
- Die Timer-Interrupts (TC0_Handler
usw.) werden beim Eingeben des ISR nicht gelöscht, es sei denn, ich lese ausdrücklichTC0->TC_SR
. Graben tiefer, in diesem Fall ist es , weil die Unterbrechung von der ausgelöst wird ,RC
vergleichen Register Übereinstimmungsbitarraywert, und das wird nicht gelöscht , bis Sie explizit lesenTC_SR
. IOW, ich bin falsch in Bezug auf die tatsächliche Ursache (es war nicht das ISR-Bit direkt), aber das Endergebnis ist das gleiche: Sie müssen die ISR- Ursache manuell löschen , wenn nicht das ISR- Flag .Antworten:
Sie sind sich über die ASF nicht sicher, aber es gibt Fälle, in denen Sie ausstehende Interrupts abbrechen müssen. Wenn Sie beispielsweise einen Timer (neu) konfigurieren, möchten Sie möglicherweise Interrupts deaktivieren, den Timer ändern und alle Timer-Interrupts abbrechen, die in der Zwischenzeit aufgetreten sind, bevor Sie Interrupts wieder aktivieren.
Wenn Sie nicht einmal einen Überlauf-ISR haben, können Sie das OVIF trotzdem abfragen, um einen Überlauf zu erkennen, und das Flag zurücksetzen, um es für den nächsten Überlauf zu aktivieren.
quelle
Im Allgemeinen lösche ich Interrupt-Flags immer kurz vor dem Aktivieren eines bestimmten Interrupts, falls etwas das Flag in der Vergangenheit gesetzt hat. Scheint wie eine billige Versicherung.
Mir ist kein Szenario bekannt, in dem Sie das Flag manuell löschen müssen, es sei denn, Sie verwenden keine Interrupts, und Sie betrachten das Flag mit einer Routine, die regelmäßig ausgeführt wird, um zu überprüfen, ob das Flag gesetzt ist.
quelle