Ich erhalte widersprüchliche Informationen darüber, ob ich pegelgetriggerte (im Gegensatz zu flankengetriggerten) Interrupts mit dem STM32F1xx-Mikrocontroller verwenden kann.
In den CMSIS-konformen Standard-Peripheriebibliotheken von ST sind die Triggeroptionen in definiert enum EXTITrigger_TypeDef
, die nur EXTI_Trigger_Rising
, EXTI_Trigger_Falling
und enthält EXTI_Trigger_Rising_Falling
. (keine Erwähnung von levelgetriggerten Interrupts)
Laut den Hilfeforen von ST hier und hier sagt ein bekannter Benutzer, dass ST nur flankengetriggerte Interrupts ausführt.
Außerdem erwähnt das RM0008- Referenzhandbuch von ST keine pegelgetriggerten Interrupts.
Andererseits:
Im PM0056- Programmierhandbuch von ST , Abschnitt 4.3, heißt es:
The NVIC supports (...) Level and pulse detection of interrupt signals
Dasselbe Dokument, Abschnitt 4.3.9, enthält weitere Einzelheiten zu pegelgetriggerten und flankengetriggerten Interrupts.
Und die offizielle ARM-Dokumentation, Abschnitt 4.2.9 sagt:
A Cortex-M3 device can support both level-sensitive and pulse interrupts.
Pulse interrupts are also described as edge-triggered interrupts.
(...) A level-sensitive interrupt is held asserted until the peripheral
deasserts the interrupt signal.
Ich finde jedoch keine Möglichkeit, dies tatsächlich einzurichten. Es macht mir nichts aus, die Standard-Peripheriebibliotheken zu umgehen, aber ich sehe nicht einmal geeignete Register, die ich verwenden könnte ...
Ich bin mein spezieller Fall, ich stelle über SPI eine Schnittstelle zu einem anderen IC her. Es handelt sich um einen komplexen SOC, der einen Ausgangspin ansteuert, um zu signalisieren, dass er Aufmerksamkeit benötigt. Es kommuniziert mit seinem "Treiber", der auf dem STM32 gehostet wird. Der SOC und der Treiber wollen eine Flankentriggerung.
Wie kann ich den STM32F1xx so konfigurieren, dass er durch Pegel ausgelöste Interrupts verwendet?
Mit einem STM32F407 (der einen ähnlichen EXTI-Ansatz zu haben scheint) habe ich in der Vergangenheit ein ähnliches Problem angegriffen, indem ich eine Kombination aus RTOS-Task-Management und flankengetriggerten Interrupts verwendet habe.
Der Kern davon war eine Aufgabe mit hoher Priorität, die mit hoher Priorität ausgeführt wurde, um unerwünschte Kommunikationen vom SoC zu bedienen.
Die Task verbrachte die meiste Zeit blockiert und wartete auf ein Signal, das von einem flankengetriggerten Interrupt erzeugt wurde. Es wurde auch periodisch abgeschaltet, um zu überprüfen, ob es eine Unterbrechungsflanke verpasst hatte, indem es den Pegel der Unterbrechungsleitung überprüfte, und blockierte dann erneut.
Wenn die Unterbrechungsleitung nach einem Durchlauf der Serviceroutine aktiviert bliebe, würde die Ebenenprüfung dies erkennen und die Serviceroutine würde erneut ausgeführt werden.
Markt
bitsmack
Markt
bitsmack