Come alcuni di voi sanno, Atmel fornisce un framework software (principalmente come parte di Atmel Studio) che fornisce driver ed esempi e viene aggiornato su una base più o meno regolare.
In un recente aggiornamento sottolineano esplicitamente che è importante cancellare manualmente il flag di interrupt di overflow nella funzione di callback di interrupt.
// * \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
Secondo la scheda tecnica XMEGAA:
OVFIF viene automaticamente cancellato quando viene eseguito il vettore di interrupt corrispondente. La bandiera può anche essere cancellata scrivendone una nella sua posizione di bit.
Esiste uno scenario / motivo in cui potrebbe essere necessario cancellare manualmente il flag?
SAM4SD32C
- Gli interrupt del timer ( TC0_Handler
, ecc ...) non vengono cancellati quando si entra nell'ISR se non ho letto esplicitamente TC0->TC_SR
. Scavando più a fondo, in questo caso, è perché l'interrupt viene attivato dal RC
bit di corrispondenza del registro di confronto e ciò non viene cancellato fino a quando non si legge esplicitamente TC_SR
. IOW, non sono corretto sulla causa reale (non era direttamente il bit ISR), ma il risultato finale è lo stesso: devi cancellare manualmente la causa ISR , se non il flag ISR .