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_SR
Register und dann das USARTx_DR
Register 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?
quelle
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. =)
quelle