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

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 forma 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

Según la ficha técnica de XMEGAA:

OVFIF se borra automáticamente cuando se ejecuta el vector de interrupción correspondiente. La bandera también se puede borrar escribiendo un uno en su ubicación de bit.

¿Hay algún escenario/razón en el que sea necesario borrar manualmente la bandera?

Parece que la respuesta es si no interrumpes, entonces debes borrarlo manualmente. esencialmente si / cuando sondeo 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ó. Del mismo modo, intente sondear sin la interrupción habilitada y vea si se establece y si puede borrarlo. validar que la documentación sea o no correcta.
Ese no sería el primer caso que he visto en los productos Atmel donde una interrupción "borrada automáticamente" parece no borrarse cuando el controlador dispara.
@ConnorWolf: ¿En serio? ¿Recuerdas qué controlador e interrupción? Trabajamos mucho en silencio con los controladores Atmel y esto podría ser una trampa potencial.
@Rev1.0 - Un ejemplo con el que estoy trabajando en este momento: SAM4SD32C- Las interrupciones del temporizador ( TC0_Handler, etc.) no se borran al ingresar al ISR a menos que lea explícitamente TC0->TC_SR. Profundizando más, en este caso, se debe a que la interrupción se activa desde el RCbit de coincidencia del registro de comparación, y eso no se borra hasta que lee explícitamente TC_SR. IOW, estoy equivocado 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 .
Tal vez hay una fe de erratas?
si su ISR se retrasa (otros ISR están agotando el tiempo) y la interrupción ocurre nuevamente mientras está reprogramando el temporizador, es posible que se confunda...

Respuestas (2)

¿Hay algún escenario/razón en el que sea necesario borrar manualmente la bandera?

No estoy seguro sobre el ASF, pero hay casos en los que debe cancelar cualquier interrupción pendiente. Por ejemplo, al (re)configurar un temporizador, es posible que desee deshabilitar las interrupciones, modificar el temporizador y cancelar cualquier interrupción del temporizador que pueda haber ocurrido mientras tanto, 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.

En general, siempre borro las banderas de interrupción justo antes de habilitar una interrupción determinada, en caso de que algo haya activado la bandera en el pasado. Parece un seguro barato.

No tengo conocimiento de ningún escenario en el que necesite borrar manualmente el indicador a menos que no esté usando interrupciones, y esté mirando el indicador con una rutina que se ejecuta periódicamente para verificar que el indicador esté configurado.