Borrar o no borrar ARM Cortex-M NVIC interrupción pendiente

¿Necesito borrar el estado pendiente de una interrupción en la rutina de servicio de interrupción de una MCU ARM Cortex-M0?

No se pudo encontrar información sobre esto en la web.

No puedo responder por este procesador específico, pero en general, sí, debe borrar la interrupción pendiente en el ISR. Si no lo hace, la interrupción permanecerá activa y tan pronto como salga de la ISR, se activará nuevamente.

Respuestas (3)

No, no necesita borrar el estado pendiente en el NVIC, eso se hace automáticamente cuando se atiende la interrupción (consulte Joseph Yiu, The Definitive Guide to ARM Cortex-M3 and Cortex-M4 Processors, 3rd Edition, page 247) .

Sin embargo, es posible que deba borrar la condición que provocó la interrupción en el periférico específico.

"Es posible que deba borrar la condición que causa la interrupción en el periférico específico". ¿Podría explicar esta oración un poco más? ¿Cuándo necesito hacer eso? ¿Qué periféricos?
Algunos periféricos establecen un indicador para la interrupción que debe restablecerse en la rutina de interrupción. Por ejemplo, el SCT en LPC8xx tiene el registro EVFLAG, donde un evento puede causar una interrupción configurando su bit correspondiente. Si no se borra, la interrupción se disparará de nuevo inmediatamente.
Me parece increíble que información tan importante no esté en el manual de usuario de la pieza. ¡Has comprado un libro para averiguarlo! En mi opinión, este es uno de los mayores desafíos al aprender programación ARM. La información que necesita se distribuye en manuales, hojas de datos, libros, sitios web, ejemplos de código y tiene el trabajo de extraerla de lugares que incluso puede imaginar.
En realidad, debería estar en uno de los documentos ARM, pero no pude encontrarlo allí. Creo que es un descuido, ya que el ARM ARM DDI0403 es muy detallado (mucho pseudocódigo). Debe hacerse en SCS_UpdateStatusRegs(), que lamentablemente no se proporciona.

EN PIO uno solo tiene que leer el estado PIO_ISR dentro del procedimiento de interrupción. En otro caso, hace que la interrupción quede pendiente directamente después de la salida de la interrupción. Actualmente no estoy seguro, pero creo que el controlador Atmel ASF lo está haciendo automáticamente, pero al pasar a un nivel inferior, uno no tiene que olvidarse de hacerlo por sí mismo.

Gracias abc por la pista. Me tomó semanas descubrirlo, ya que el controlador ASF NO lo hace automáticamente. Dado que solo tengo un pin activo para la interrupción, no necesito leer ese registro para localizar el pin. Ahora, siempre leyendo ese registro, todo funciona bien.

Sugerencia: En la interfaz de usuario de PIO de la hoja de datos de SAM E70 (mi procesador), bajo la descripción del registro PIO_ISR, se encuentra la siguiente oración: „1: Se detectó al menos un cambio de entrada en la línea de E/S desde que se leyó por última vez PIO_ISR. o desde el reinicio”. Creo que eso es muy difícil de encontrar.