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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.