USART (UART) Interrupt-Flags in einem STM32 löschen?

8

Ich verwende einen STM32F105, um mit einem Linx GPS-Chip über einen UART zu kommunizieren.

Wenn ich keine Interrupts verwende (wenn ich nur das RX-Flag abfrage), funktioniert es einwandfrei. Aber ich bekomme unerwartete Ergebnisse, wenn ich versuche, Interrupts zu verwenden.

Wenn ich beispielsweise nur den RXNE-Interrupt ("RX not empty") mit aktiviere USART_ITConfig(USARTx, USART_IT_RXNE), sollte der Code nur für dieses eine bestimmte Ereignis an den ISR weitergeleitet werden. Der Interrupt wird aber auch für einen Overrun-Zustand ausgelöst.

Was das Löschen der Flags angeht, scheint die Methode vom Flag abzuhängen. Um das Overrun-Flag ( USART_IT_ORE) zu löschen , wird im Benutzerhandbuch erklärt, dass ich zuerst das USARTx_SRRegister und dann das USARTx_DRRegister lesen sollte . Das funktioniert; Die Flagge wird gelöscht.

Es gibt auch eine USART_ClearITPendingBit()Funktion, die jedoch nur eine kleine Teilmenge von Flags akzeptiert.

Es gibt acht verschiedene Interruptquellen, die selektiv aktiviert werden können, und zehn verschiedene Flags. Gibt es irgendwo eine Zusammenfassung, wie all diese Flags verwaltet werden?

Bitsmack
quelle

Antworten:

16

Im Allgemeinen müssen Sie nur die Interrupt-Flags verarbeiten, mit denen Sie speziell aktiviert haben USART_ITConfig().

Wenn Sie jedoch den RXNE-Interrupt ( USART_ITConfig(USARTx, USART_IT_RXNE)) aktivieren, wird auch der Overrun-Interrupt aktiviert ! Sie müssen also mit beiden umgehen.

intmap

Die USART-Flags können verwirrend sein. Es gibt separate Statusflags und Interrupt-Flags, die ähnliche Namen haben. Zum Beispiel: USART_IT_RXNEund USART_FLAG_RXNE.

Darüber hinaus gibt es verschiedene Methoden, um diese Flags zu löschen. Beispielsweise USART_ClearITPendingBit()funktioniert die Funktion nur für vier (von zehn) möglichen Flags.

Hier finden Sie eine Zusammenfassung der Interrupt-Flags und deren Verwendung. Diese sind spezifisch für den STM32F105, aber repräsentativ:


USART_IT_TXE - "Datenregister übertragen leer"

  • Es wird beim Anruf automatisch gelöscht USART_SendData()

USART_IT_RXNE - "Empfangsdatenregister nicht leer"

  • Es wird beim Anruf automatisch gelöscht USART_ReceiveData(USARTx)

  • Es kann manuell durch Aufrufen gelöscht werden USART_ClearITPendingBit(USARTx, USART_IT_RXNE)


USART_IT_TC - "Übertragung abgeschlossen"

  • Es wird automatisch gelöscht durch:

    • USART_GetITStatus(USARTx, USART_IT_TC) gefolgt von
    • USART_SendData()
  • Es kann auch manuell durch Aufrufen gelöscht werden USART_ClearITPendingBit(USARTx, USART_IT_TC)


USART_IT_CTS - "CTS-Änderung"

  • Durch Anruf gelöscht USART_ClearITPendingBit(USARTx, USART_IT_CTS)

USART_IT_LBD - "LIN- Unterbrechung erkannt"

  • Durch Anruf gelöscht USART_ClearITPendingBit(USARTx, USART_IT_LBD)

USART_IT_PE - "Paritätsfehler"

  • Gelöscht von:
    • USART_GetITStatus(USARTx, USART_IT_PE) gefolgt von
    • USART_ReceiveData(USARTx)

USART_IT_NE - " Rauschfehler "

  • Gelöscht von:
    • USART_GetITStatus(USARTx, USART_IT_NE) gefolgt von
    • USART_ReceiveData(USARTx)

USART_IT_ORE - " Überlauffehler "

  • Gelöscht von:
    • USART_GetITStatus(USARTx, USART_IT_ORE) gefolgt von
    • USART_ReceiveData(USARTx)()

USART_IT_IDLE - "Leerlaufleitung erkannt"

  • Gelöscht von:
    • USART_GetITStatus(USARTx, USART_IT_IDLE) gefolgt von
    • USART_ReceiveData(USARTx)()
Bitsmack
quelle
Ja, ich habe meine eigene Frage beantwortet :) Wenn ich früher eine solche Liste gefunden hätte, hätte ich viel Zeit gespart. Ich hoffe es hilft jemandem!
Bitsmack
2
Diese Antwort ist Gold; Sehr klarer Hinweis, wie jeder dieser Interrupts gelöscht werden kann.
jjmilburn
2

Um nur einige meiner Erfahrungen mit diesem Problem hinzuzufügen, folge ich den Anweisungen:

USART_IT_ORE - "Überlauffehler"

Gelöscht von: USART_GetITStatus (USARTx, USART_IT_ORE) gefolgt von USART_ReceiveData (USARTx) ()

Es scheint nicht zu funktionieren, und der folgende Befehl funktioniert stattdessen für mich:

USART_GetFlagStatus (USARTx, USART_IT_ORE) gefolgt von USART_ReceiveData (USARTx)

Wenn Sie sich die Funktionen ansehen:

USART_GetFlagStatus () und USART_ReceiveData ()

Sie werden finden, was genau Bitsmack zuvor geschrieben hat ... "Lesen Sie zuerst das USARTx_SR-Register und dann das USARTx_DR-Register."

Hoffentlich funktioniert es für Sie und spart viel mehr Zeit bei diesem Problem. =)

LostInCoding
quelle
Vielen Dank für Ihre Informationen! Ich erkenne USART_GetFlat () nicht. Kannst du mir sagen, woher es kommt?
Bitsmack
Es tut mir leid, dass ich den Befehl falsch eingegeben habe. Es sollte USART_GetFlagStatus () gefolgt von USART_ReceiveData () sein. Der ursprüngliche Beitrag wurde korrigiert. Danke Bitsmack.
LostInCoding
Großartig, vielen Dank! Es sieht so aus, als hätten sich die Funktionsnamen geändert. Verwenden Sie eine Standard-Peripheriebibliothek oder eine der STMCube-HALs? Für welche Familie von Mikrocontrollern?
Bitsmack