¿Es realmente necesario borrar manualmente el indicador de interrupción de desbordamiento del temporizador XMEGA?

8

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?

Rev1.0
fuente
Parece que la respuesta es que si no interrumpes, debes borrarlo manualmente. esencialmente si / cuando sondea en lugar de usar interrupciones. simplemente puede leer el registro en la interrupción y mostrarlo de alguna manera para ver si realmente se configuró. Asimismo, intente sondear sin la interrupción habilitada y vea si se configura y si puede borrarla. validar la documentación es o no es correcta.
old_timer
1
Ese no sería el primer caso que he visto en los productos de Atmel donde una interrupción "borrada automáticamente" parece no borrarse realmente cuando se activa el controlador.
Connor Wolf
1
@ConnorWolf: ¿En serio? ¿Recuerdas qué controlador e interrupción? Trabajamos mucho en silencio con los controladores Atmel y esto podría ser un escollo potencial.
Rev1.0
3
@ Rev1.0 - Un ejemplo con el que estoy trabajando ahora: 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 RCbit 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 .
Connor Wolf
1
Tal vez hay una errata?
vicatcu

Respuestas:

1

¿Hay algún escenario / razón por la cual se requiera borrar manualmente la bandera?

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.

JimmyB
fuente
1

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.

usuario103218
fuente