Wie verwende ich Level-getriggerte Interrupts mit STM32F1xx?

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_Fallingund 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?

Kannst du etwas mehr Kontext liefern? Welche Interrupt-Quelle möchten Sie verwenden?
@markt Fertig, danke. Ich habe am Ende der Frage Informationen hinzugefügt.
Wenn es (das SoC) also immer noch Aufmerksamkeit will, nachdem der Interrupt bedient wurde, lässt es die Interrupt-Leitung aktiviert?
@markt Ja, das stimmt. Der Fahrer möchte innerhalb seines ISR bleiben, ohne auszusteigen und wieder einzusteigen.

Antworten (1)

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.

Danke Markt, das könnte ein guter Workaround für mich sein. Ich warte immer noch darauf, die durch Level ausgelösten Interrupts des Cortex M3 tatsächlich zu verwenden :)
@bitsmack Ich denke, Level-Triggered Interrupts sind eine Option, die ARM anbietet, also nicht unbedingt etwas, das in jedem M3/4 implementiert werden muss . Vielleicht schnüffeln Sie in anderen Cortex-M-Angeboten herum, um eines zu finden, das die Option explizit implementiert.