¿Cómo usar la interrupción no enmascarable en SAM4S?

Estoy tratando de usar el NMI en un SAM4S (Cortex M4), pero me resulta difícil hacerlo funcionar. El objetivo principal es saltar al controlador NMI cada vez que la energía esté a punto de fallar, de modo que pueda realizar un apagado limpio, guardando datos que podrían perderse de otra manera.

En este momento, estoy usando un controlador PIO para saltar a una interrupción cuando se detecta una falla de energía. El código es algo como esto:

gpio_configure_pin( POWERFAIL_PORT_IDX,POWERFAIL_PORT_FLAGS);
pio_set_input(PIOA, POWERFAIL_PORT,(PIO_PULLUP|PIO_DEBOUNCE));
pio_set_debounce_filter(PIOA,POWERFAIL_PORT, 100);
pio_handler_set(PIOA, ID_PIOA,POWERFAIL_PORT , PIO_IT_FALL_EDGE, Powerfail_Interrupt_Handle);
pio_enable_interrupt(PIOA, POWERFAIL_PORT);
NVIC_EnableIRQ(PIOA_IRQn);

Me gustaría configurar esta interrupción con la máxima prioridad usando el NMI. De esa forma, esta interrupción estaría activa todo el tiempo, incluso después de llamar a __disable_irq() en algunas partes del código. Hasta ahora, busqué en la hoja de datos de SAM4S y fuentes/ejemplos de ASF, pero no pude encontrar ninguna forma obvia de hacerlo, o simplemente me di cuenta de si es posible.

Respuestas (1)

Las MPU Atmel SAM4S cuentan con un controlador de interrupción NVIC que solo admite interrupciones externas para vincularse con NMI. También puede activarlo manualmente, pero esto no le será de mucha utilidad.

La solución es tener un circuito externo que active el NMI usando una interrupción externa en caso de fallas de energía.

Nota: Si entiendo su solución actual, intenta detectar los bordes que caen en la línea eléctrica. No estoy seguro de que esto sea confiable, o incluso lo suficientemente rápido (ya que tiene un filtro antirrebote en la entrada).