Wie verwende ich den nicht maskierbaren Interrupt auf SAM4S?

Ich versuche, das NMI auf einem SAM4S (Cortex M4) zu verwenden, aber es fällt mir schwer, es zum Laufen zu bringen. Das Hauptziel besteht darin, immer dann zum NMI-Handler zu springen, wenn der Strom ausfällt, damit ich ein sauberes Herunterfahren durchführen und Daten speichern kann, die andernfalls verloren gehen könnten.

Im Moment verwende ich einen PIO-Controller, um zu einem Interrupt zu springen, wenn ein Stromausfall erkannt wird. Der Code ist in etwa so:

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);

Diese Unterbrechung möchte ich über das NMI mit maximaler Priorität setzen. Auf diese Weise wäre diese Unterbrechung die ganze Zeit aktiv, auch nach dem Aufruf von __disable_irq() in einigen Teilen des Codes. Bis jetzt habe ich das SAM4S-Datenblatt und die ASF-Quellen/Beispiele durchsucht, aber ich konnte keinen offensichtlichen Weg finden, dies zu tun, oder einfach erkennen, ob es möglich ist.

Antworten (1)

Atmel SAM4S MPUs verfügen über einen NVIC-Interrupt-Controller, der nur externe Interrupts unterstützt , die mit NMI verknüpft werden sollen. Sie können es auch manuell auslösen, aber das wird Ihnen nicht viel nützen.

Die Lösung besteht darin, eine externe Schaltung zu haben, die das NMI bei Stromausfällen mit einem externen Interrupt auslöst.

Hinweis: Wenn ich Ihre aktuelle Lösung verstehe, versuchen Sie, fallende Flanken an der Stromleitung zu erkennen. Ich bin mir nicht sicher, ob dies zuverlässig oder sogar schnell genug ist (da Sie einen Entprellfilter am Eingang haben).