Como algunos de ustedes sabrán, Atmel proporciona un marco de software (principalmente como parte de Atmel Studio) que proporciona controladores y ejemplos y se actualiza de manera más o menos regular.
En una actualización reciente, señalan explícitamente que es importante borrar manualmente el indicador de interrupción de desbordamiento en la función de devolución de llamada de interrupción.
// * \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
De acuerdo con la hoja de datos XMEGAA:
OVFIF se borra automáticamente cuando se ejecuta el vector de interrupción correspondiente. La bandera también se puede borrar escribiendo uno en su ubicación de bit.
¿Hay algún escenario / razón por la cual se requiera borrar manualmente la bandera?
SAM4SD32C
- Las interrupciones del temporizador ( TC0_Handler
, etc.) no se borran al ingresar al ISR a menos que lo lea explícitamente TC0->TC_SR
. Excavando más profundo, en este caso, es porque la interrupción se dispara desde el RC
bit de comparación del registro de comparación, y eso no se borra hasta que haya leído explícitamente TC_SR
. IOW, soy incorrecto acerca de la causa real (no fue el bit ISR directamente), pero el resultado final es el mismo: debe borrar manualmente la causa ISR , si no el indicador ISR .