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?
¿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.
viejo contador de tiempo
connor lobo
Rvdo
connor lobo
SAM4SD32C
- Las interrupciones del temporizador (TC0_Handler
, etc.) no se borran al ingresar al ISR a menos que lea explícitamenteTC0->TC_SR
. Profundizando más, en este caso, se debe a que la interrupción se activa desde elRC
bit de coincidencia del registro de comparación, y eso no se borra hasta que lee explícitamenteTC_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 .vicatcu
Taniwha