Forum: Mikrocontroller und Digitale Elektronik STM32 UART DMA - RX Error führt zu unendlich, sehr schnellen Interrupts


von Bert S. (kautschuck)


Angehängte Dateien:

Lesenswert?

Hi,

Ich kommuniziere über UART zwischen einem STM32 und einem ESP32 uC, 
wobei der STM32 den DMA sowie den End of Line Interrupt verwendet. Wenn 
nun beim Starten ein Fehlerframe kommt (TX des ESP32 geht von Low auf 
High), dann wird mir die HAL_UART_ErrorCallback(); getriggert und von da 
an wird nur noch die UART Interrupt Routine aufgerufen.

Das ganze kann ich unterbinden, wenn ich wie im Anhang den "DMA on RX 
Error" deaktiviere. Nun möchte ich aber den Fehler catchen und den 
Fehler zurücksetzen, jedoch weiss ich nicht wie. Was für ein Flag muss 
ich dafür zurücksetzen?

von Stefan F. (Gast)


Lesenswert?

Du hast vergessen, das konkrete STM32 Modell anzugeben.

von Harry L. (mysth)


Lesenswert?

UART und DMA ist in 99,99999% aller Fälle Bullshit!

Sowas macht man Zeichen für Zeichen mit Interrupts.

von Bert S. (kautschuck)


Lesenswert?


von stm apprentice (Gast)


Lesenswert?

Harry L. schrieb:
> Sowas macht man Zeichen für Zeichen mit Interrupts

Ich zumindest mache das immer so.

von Bert S. (kautschuck)


Lesenswert?

Noch was, der Fehler wird von einem HAL_UART_ERROR_FE (Frame Error) 
ausgelöst und ab und zu auch noch ein HAL_UART_ERROR_ORE, was auch Sinn 
macht, wenn man einfach den TX von LOW auf HIGH toggelt.

: Bearbeitet durch User
von Bert S. (kautschuck)


Lesenswert?

Ok, ich glaube ich konnte es fixen. Im Endeffekt kam es zu einer 
Situation, wo das __HAL_UART_CLEAR_IDLEFLAG zu früh zurückgesetzt wurde.

Nun was mich aber interessiert ist, warum ich überhaupt Framing Fehler 
bekomme bzw. wie ich diese beim Start vermeiden kann. Ist es zu 
empfehlen, RX und TX des UARTs mit einem Pull-Up hochzuziehen? Wenn ich 
nämlich mit dem Computer kommuniziere, bekomme ich nie einen Framing 
Error, mit dem ESP32 beim Flashen immer.

von Jester (Gast)


Lesenswert?

Bert S. schrieb:
> Ist es zu
> empfehlen, RX und TX des UARTs mit einem Pull-Up hochzuziehen?

Irgendwann hatte ich mal wo gelesen, man würde bei "UART"-Schittstellen 
von MARK und SPACE reden.

So ist Z.B. der "idle"-Zustand einer RS232-Schnittstelle gekennzeichnet 
durch eine "größere Anzahl" von MARKs. Das folgende SPACE kennzeichnet 
dann die 'start'-Condition.

Spannend wird es, wenn man mit BREAKs arbeitet, z.B. um den Beginn eines 
Datenblocks anzuzeigen. Ein BREAK wird signalisiert, wenn die 
Datenleitung für "längere Zeit" auf SPACE hängt. Das folgende MARK 
kennzeichnet dann den Start eines Packets (MAB = "Mark After Break").

Also, RX und TX eines UARTs  (UART - Universal Asynchronous Receiver 
Transmitter) unreflektiert "irgendwo hinzuziehen" ist vielleicht nicht 
so prickelnd...

von Stefan F. (Gast)


Lesenswert?

Der Ruhezustand sollte jedenfalls HIGH sein, deswegen finde ich Pull-Ups 
gut.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.