Forum: Mikrocontroller und Digitale Elektronik STM32 - UART DMA - keine Funktion nach Reset von Gegenstelle


von RS020 (Gast)


Lesenswert?

Hallo zusammen,

ich habe ein kleines Problem mit meinem STM32 und dem Empfang der Daten 
über UART_DMA.

Ich (re)starte meinen Nucleo Board, ich sende Daten via RS232 zur 
Gegenstelle (mit Oszi gemessen) und bekomme auch antworten (ebenfalls 
mit Oszi gemessen). Die Daten haben eine variable Länge, allerdings 
kenne ich die immer vorher und kann diese Info beim Aufruf von 
"HAL_UART_Receive_DMA(&huart2, bBuf, bLen)" mitgeben.
--> passt. Funktioniert beliebig oft mit variabler Datenlänge.

Jetzt lege ich die Gegenstelle schlafen, warte 20s und wecke sie mit 
einer WAKEUP/INIT Funktion auf. Gegenstelle wacht auf und initialisiert 
sich und signalisiert via LED "bereit". Alle Anfragen danach werden ganz 
normal verarbeitet und ich bekomme Antworten.

Wenn ich die Gegenstelle schlafen lege, dann eine beliebige Funktion 
(nicht die WAKEUP/INIT) schicke, bleibt die Gegenstelle im Sleep Mode 
(so soll es auch sein). Wenn ich danach die Wakeup/Init schicke, wachte 
die Gegenstelle auf, allerdings bekomme ich die Antwort ("Init 
erfolgreich") der Gegenstelle nicht mit, obwohl ich sie am Oszi sehe. 
Mir scheint das die HAL_UART_Receive_DMA(...) irgendwie blockiert ist, 
da die eine normale Funktion den Empfang blockiert.

Ich bin jetzt schon mit dem Debugger durch gesprungen, aber ich bekomme 
keinen Error oder Hänger, er spingt brav durch die Funktionen, so wie er 
es auch macht die Sache funktioniert, nur der Empfangsbuffer bleibt halt 
leider leer.

Gibt es da einen Trick, wie man den UART Empfang per DMA neu starten 
kann?
Ich würde ja HAL_UART_Receive_DMA(...) nehmen, dafür müsste ich ja die 
wissen welche Anfrage an die Gegenstelle ich zu erst schicke, da ich die 
Länge hinterlegen muss.

Viele Grüße

von Walt N. (belayason)


Lesenswert?

Hatte erst letzte Woche das gleiche Problem. Habe den Usart DMA mit LL 
Treiber initialisiert und mich durch dieses Tutorial gehangelt.

https://stm32f4-discovery.net/2017/07/stm32-tutorial-efficiently-receive-uart-data-using-dma/

Der DMA läuft im Circular mode und schreibt den Buffer immer wieder 
erneut voll. In der Funktion usart_rx_check schaut er wie lange die neu 
eingetroffene Nachricht im DMA buffer ist und kann diese dann weiter 
verarbeiten. Als interrupt habe ich nur die Idle Line benutzt. Dieser 
löst aus, sobald auf der RX Leitung nichts mehr übertragen wird.

von Walt N. (belayason)


Lesenswert?

Hier findest du den Beispiel code zu diesem Tutorial:
https://github.com/MaJerle/stm32-usart-uart-dma-rx-tx

von RS020 (Gast)


Lesenswert?

Danke für die schnelle Antwort!

Dann müsste ich den DMA Mode zu "circular" ändern, davon hatte ich auch 
schon gelesen. Im Prinzip weiß ich ja aber immer wann meine Datenblöcke 
zu Ende sind, ist der "circular mode" da nicht mit Kannonen auf Spatzen?
Ich dachte an so eine Art "UART/DMA ReInit" Geschichte, bloß nicht ganz 
so banal :D.

VG

von Walt N. (belayason)


Lesenswert?

RS020 schrieb:
> ist der "circular mode" da nicht mit Kannonen auf Spatzen?

Naja wenn es deine Problem löst, wüsste ich nicht warum man es nicht so 
machen sollte. Du kannst jede Nachricht unterschiedlicher länge 
verarbeiten.

RS020 schrieb:
> nur der Empfangsbuffer bleibt halt
> leider leer.

Ist er wirklich leer oder nur voll und wird nicht neu befüllt?

von RS020 (Gast)


Lesenswert?

Walt N. schrieb:
> Ist er wirklich leer oder nur voll und wird nicht neu befüllt?

Er wird immer bevor ich die Funktion HAL_UART_Receive_DMA(...) aufrufe 
geleert, die Daten kommen auch an (am Oszi sichtbar) nur werden sie halt 
nicht in meinen Buffer geschrieben.

Ich versuch grad das Tutorial durchzuackern, welches du verlinkt hast. 
Danke nochmal dafür!

VG

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.