2015-06-10 5 views
5

Ich versuche, mit der UART-Peripherie per DMA sowohl für RX als auch für TX zu kommunizieren. Ich verwende die HAL-Bibliothek, die von ST (generiert mit STCubeMX) geliefert wird.STM32F4 Behandlung von Peripheriefehler während der DMA-Übertragung (RX)

Ich handle mit einem UART-Kanal mit 1,5MBaud - um also keine Daten zu verlieren, habe ich den DMA im direkten Modus mit Ringpuffer konfiguriert und die Halbtransfers Interrupts behandelt, um die Daten zu kümmern und halten Sie den DMA online, um weitere Daten zu erhalten.

Das Problem ist, dass ich manchmal im Status-Register des UART sehen kann, dass das Frame-Fehler-Bit eingeschaltet ist, und manchmal das Überlauffehler-Flag auch eingeschaltet ist.

Ich kann mit verlorenen Bytes umgehen (mit Crc auf den strukturierten Paketen), aber das Problem ist, dass das Peripheriegerät keine Daten mehr empfängt - aber der DMA löst keinen Fehler aus oder stoppt die Übertragung.

Also wenn ich versuche, Daten zu empfangen, und die Flagge ist auf dem System hängt.

Ich sah, dass die HAL bietet eine __weak-Funktion, die UART_Error behandeln sollte, aber es wird nie aufgerufen - und der Status in der HAL-Handle bleibt normal. nur ein Blick auf das Register kann sagen, dass ein Problem vorliegt.

Wie soll ich diese Art von Fehlern erkennen/behandeln?

Dank

Antwort

2

ich die HAL aus Performance-Gründen nicht verwenden, da es sehr ungeschickt ist und - imo bietet auch keine viel Abstraktion dass zu rechtfertigen. Die direkte Handhabung der Hardware ist nicht viel komplizierter; noch mehr, da Sie immer noch sehr gut verstehen müssen, was vor sich geht. Und wie Sie bereits festgestellt haben, unterstützt die HAL nur einen bestimmten Ansatz. Wenn du deinem eigenen Weg folgst, bist du verloren.

Sie haben anscheinend ähnliche Probleme, da das Überlauf-Flag gesetzt ist. Nach einem solchen Fehler müssen Sie den Empfänger nach einem Fehler im Allgemeinen mit dem Sender-Bytestream synchronisieren. Dies würde eine Außerband-Signalisierung unter Verwendung eines Symbols oder einer Leitungsbedingung erfordern, die nicht innerhalb eines Pakets auftritt. Framing-Fehler sind ein guter Indikator, dass es Probleme gibt, mit dem Start eines Symbols (Start-Bit) richtig zu synchronisieren.

Wenn die Leitung sauber ist (keine EMV-Probleme), sollten keine Framing-Fehler oder Datenbeschädigungen auftreten (sofern die Timing-Parameter nicht übereinstimmen).

Bei Verwendung eines einfachen Ping-Pong kann eine Zeitüberschreitung ausreichend sein. Die richtige Lösung hängt jedoch vom Protokoll ab. Ein gutes Protokolldesign berücksichtigt Übertragungsfehler und Überläufe.

Beachten Sie, dass Sie Empfangs-Fehler-Interrupts zusätzlich zu DMA-Übertragungen aktivieren müssen, um informiert zu werden. Wenn Sie jedoch ein Timeout (und ein Ping-Pong-Protokoll) verwenden, können Sie die Flags einfach löschen, da die Daten anscheinend nicht pünktlich eintrafen. Wenn tatsächlich Fehler-Interrupts verwendet werden, sollten auch die Rennbedingungen beachtet werden.