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?