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?
c
atmel-studio
xmega
Rev1.0
fuente
fuente
SAM4SD32C
- Las interrupciones del temporizador (TC0_Handler
, etc.) no se borran al ingresar al ISR a menos que lo lea explícitamenteTC0->TC_SR
. Excavando más profundo, en este caso, es porque la interrupción se dispara desde elRC
bit de comparación del registro de comparación, y eso no se borra hasta que haya leído explícitamenteTC_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 .Respuestas:
No estoy seguro sobre el ASF, pero hay casos en los que necesita cancelar cualquier interrupción pendiente. Por ejemplo, cuando (re) configure un temporizador, puede deshabilitar las interrupciones, modificar el temporizador y cancelar cualquier interrupción del temporizador que pueda haber ocurrido en el tiempo medio, antes de volver a habilitar las interrupciones.
Si ni siquiera tiene un ISR de desbordamiento, aún puede sondear el OVIF para detectar el desbordamiento y restablecer la bandera para armarlo para el próximo desbordamiento.
fuente
En general, siempre borro las banderas de interrupción justo antes de habilitar una interrupción dada, en caso de que algo establezca la bandera en el pasado. Parece un seguro barato.
No conozco ningún escenario en el que necesite borrar manualmente la bandera a menos que no esté usando interrupciones, y esté mirando la bandera con una rutina que se ejecuta periódicamente para verificar si la bandera se está configurando.
fuente