STM32 - UART DMA - keine Funktion nach Reset von Gegenstelle

Gast #6672439
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
#6672446
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.
Gast #6672458
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
Gast #6673275
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren