STM32-Interrupt und Eingang auf demselben Pin

Ziemlich einfache Frage, aber ich konnte keine Anleitung dazu finden. Ich verwende einen STM32G070

Ich stelle eine Schnittstelle mit einem ADS1231 her, der DOUT / ~ DRDY auf demselben Pin verwendet, und ich frage mich, ob es eine Möglichkeit gibt, den Interrupt-Pin auch als Eingang zu verwenden. Was ich im Wesentlichen machen möchte:

  1. Warten Sie auf eine fallende Flanke am DOUT/~DRDY-Pin (derzeit als EXTI konfiguriert)

[Innerhalb des ISR:]

  1. Deaktivieren Sie Interrupts auf dem Pin
  2. Verwenden Sie den Pin als Eingang
  3. Senden Sie die 24-Takt-Signale und lesen Sie den DOUT/~DRDY-Pin nach jeder abfallenden Taktflanke
  4. Verwandeln Sie den Pin wieder in einen Interrupt
  5. Beenden und erneut warten

Ich habe in einem anderen Thread eine interessante Antwort gefunden, die dasselbe Teil verwendet ( https://electronics.stackexchange.com/a/339742/281491 ) .

Ich würde es ganz anders machen.

Stellen Sie den SPI2 MISO-Pin als GPIO-Eingang ein. Setzen Sie den EXTI (fallende Flanke) Interrupt auf diesen Pin

Ändern Sie im EXTI-Interrupt - EXTI deaktivieren diesen Pin auf MISO AF und initiieren Sie eine 3-Byte-DMA-Transaktion (senden Sie 3 Dummy-Bytes, da Sie den Takt für das ADS generieren müssen).

In der DMA-Übertragung vollständiger Interrupt-Wechsel-Pin auf den GPIO-Eingang. Aktivieren Sie EXTI

Die Schritte 2 und 3 werden automatisch bei jeder Konvertierung wiederholt.

Kann jemand näher erläutern, wie ich die fettgedruckten Teile oder andere Lösungen ausführen würde?

Danke

Deine Strategie klingt ok. Es ist eine gängige Technik, Interrupts auf einem GPIO zu aktivieren/deaktivieren. Eine andere Technik besteht darin, nicht abzufragen oder auf den Abschluss des Adc zu warten, sondern einen Timer einzurichten, um die Konvertierung auszulösen, dann beim nächsten Timer-Tick das Ergebnis zu lesen und die nächste Konvertierung zu starten. Normalerweise müssen Sie den ADC nicht mit voller Geschwindigkeit laufen lassen, also stellen Sie den Timer auf einen Wert ein, der größer als die maximale Konvertierungszeit ist.

Antworten (2)

Es gibt so viele Möglichkeiten, dies zu tun, wie die Menschen sich vorstellen können.

Ihr Weg wird gut funktionieren, obwohl er nicht sehr ausgefeilt ist, da die MCU im Interrupt sitzt und darauf wartet, dass die Bytes übertragen werden, bevor sie den Interrupt verlassen. Wenn das alles ist, was benötigt wird, ist es einfach und effektiv.

Die andere Lösung, die Sie gefunden haben, ist eine der komplexesten Lösungen, obwohl Bibliotheken es einfach machen. Es deaktiviert einfach den EXTI-Interrupt und startet eine DMA-gesteuerte Übertragung und wird den Interrupt sofort verlassen, um zurückzukehren und das zu tun, was es getan hat. Die Daten werden im Hintergrund übertragen, und wenn die Bytes beendet sind, wird der Transfer-Complete-Interrupt den EXTI-Interrupt wieder freigeben.

Eine Lösung zwischen diesen beiden würde vielleicht einen Interrupt-gesteuerten SPI-Transfer im EXTI starten und EXTI wieder aktivieren, wenn Bytes übertragen werden.

Es gibt auch viele andere Lösungen, wählen Sie einfach eine aus, die zu Ihrem Programmfluss passt, und erledigen Sie die Arbeit, ohne zu viel Komplexität hinzuzufügen.

Dein Ansatz sollte funktionieren. Der Ansatz im anderen Thread ist meiner Meinung nach fragwürdig. Bei 5 MHz Taktfrequenz ist die Verwendung von DMA sinnlos, wenn man bedenkt, dass die MCU nur 64 MHz hat.

@Justme 4.8 uns, nicht ms! Bei 64 MHz sind es nur 300 MCU-Zyklen. Das Einrichten und Verarbeiten von DMA erfordert mehr, insbesondere wenn HAL verwendet wird
Ich sehe es nicht als fragwürdig an, ich denke, es ist eine extrem ausgeklügelte Idee, es könnte für eine einfache Situation einfach extrem übertrieben sein. Die Übertragung von 24 Bit bei 5 MHz dauert 4,8 Mikrosekunden. Wenn das System also damit umgehen kann, kann der Interrupt während der Übertragung blockieren, dann ist das in Ordnung. Aus irgendeinem Grund möchten Sie das vielleicht nicht, und das DMA-Setup ist viel schneller als 300 MCU-Zyklen. SPI über Interrupts oder DMA könnte also plötzlich Sinn machen. Es hängt alles davon ab, was das System sonst noch tun muss, wie lang die Antwortzeit ist und ob asynchrone ereignisbasierte Operationen besser geeignet sind.