STM32: Umsetzung der UART im DMA-Modus
Bin ich versucht zu implementieren UART im DMA-Modus zu übertragen-eine einfache Zeichenfolge jedes mal, wenn ein Taster gedrückt wird.
So, das ich verwendet habe CubeMX um den code zu generieren und ich habe so konfiguriert UART2 TX DMA in den normalen (nicht kreisförmig) Modus und auch kein FIFO-und nicht platzen.
Immer wenn ich den code im debug-Modus sehe ich das erste mal, dass ich Versuch zum senden der Zeichenfolge, es funktioniert ok und sendet die Zeichenfolge, sondern innerhalb der DMA-IRQ-handler ruft es TxHalfCpltCallback und nicht TxCpltCallback und auch UART gState bleiben im BESCHÄFTIGT-Modus, so kann ich es nicht verwenden, zu übertragen, nicht mehr string.
Meine Frage ist, warum ruft er TxHalfCpltCallback und nicht TxCpltCallback? und wie sollte ich damit umgehen (wegen HAL-Referenz sagt, es wartet für die Zusendung der zweiten Hälfte des Puffers! was?)
Und auch, würde das senden der nächsten Hälfte der Daten relase die gState der UART?
Ich würde Sie gerne Fragen, wie jemand zu geben uns ein Beispiel der Konfiguration der UART in einem Projekt.
InformationsquelleAutor Nixmd | 2017-04-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie den DMA-dann haben Sie zwei interrupts: wenn die Hälfte von dem Puffer übertragen wird und ein weiteres, wenn die zweite Hälfte übertragen wird (insgesamt).
Beide gefeuert werden sollte wenn alles OK ist. Der Grund dafür ist, dass beim senden einer großen Menge von Daten, können Sie beginnen laden von neuen Daten in der ersten Hälfte des Puffers in die
TxHalfCpltCallback
während der zweiten Hälfte des Puffers übertragen wird, die von der DMA. Und, können Sie wieder laden Sie die neuen Daten in der zweiten Hälfte des Puffers in dieTxCpltCallback
während die erste Hälfte übertragen wird.Der Vorteil ist, dass Sie brauchen nicht zu warten, für die gesamte übertragung abgeschlossen ist, bevor Sie kopieren das nächste Stück von Daten in den Puffer, aber du kannst schon starten, laden Sie es, während die übertragung noch im Gange ist.
Hier ein Beispiel:
In diesem Beispiel 2000 bytes, die übertragen werden mit DMA, Übermitteln Hälfte Komplett und Übermitteln Komplette unterbricht die Erreichung der besten Leistung.
Der ersten Hälfte der sende-buffer ist voll mit neuen Daten von der CPU in den Übermitteln Hälfte Komplett interrupt callback, während der zweiten Hälfte des Puffers übertragen wird, durch den DMA im hintergrund.
Dann, in der Übermitteln Komplette der zweiten Hälfte der sende-Puffer geladen wird, indem die neuen Daten von der CPU, während der ersten Hälfte des (bereits aktualisiert) übertragen wird, durch den DMA im hintergrund.
Beispiel wurde geschrieben für ein STM32F4 Discovery-board (STM32F407VG). Die entsprechenden DMA-Instanz, UART-DMA-Kanal, GPIO-und alternate-Funktion Einstellungen geändert werden sollen, nach der STM32-mikrocontroller im Einsatz.
Gut
HAL_UART_TxHalfCpltCallback
feuert, eigentlich, wenn die Hälfte der Puffer gesendet wird undHAL_UART_TxCpltCallback
wenn der ganze Puffer gesendet.Ich nehme an, dass ist nicht unbedingt das, wenn die Daten aus dem Puffer ist tatsächlich "auf der Leitung"? Ich habe mein board angeschlossen an einem Logik-Analysator und erhalten Sie einen trace-ähnlich wie in visualgdb.com/w/wp-content/uploads/2017/09/21-dma.png, wo die tx Hälfte komplett und tx complete interrupts ausgelöst werden, bevor der halbe Weg / das Ende der übertragung.
Ps. Sorry für die n00b Fragen 🙂
Nun ja, es gibt auch einige Fehler der Messung Hinzugefügt werden, indem Sie die GPIO-Umschaltung und die gesendeten Daten ist nicht so sehr als gut. Mit 1-2 tausend bytes, es wäre mehr zentriert, denke ich. Aber ja, es ist nicht so, dass genau. 🙂
InformationsquelleAutor Bence Kaulics
Dein problem ähnlich Aussehen wie https://community.st.com/thread/40080-dma-uart-with-hal-remain-busy-bug
Aktivieren Sie HAL_UART_IRQHandler()
d.h.
innerhalb von "main".c"(oder wo auch immer Sie initialisieren Ihre hardware) hinzufügen:
innen "stm32f4xx_it.c":
InformationsquelleAutor Jonas Kibildis
Wenn Sie die Funktion
in der
CubeMX
Bibliothek, die es ermöglichen, werden alle DMA-interrupts. Sie können deaktivieren Sie die Hälfte die übertragung unterbrechen, die von den clearing-HTIE-bit in derDMA_SxCR
registrieren.InformationsquelleAutor Jackson
Für mich, ich war immer eine sende-Fehler bei der Verwendung von DMA. Das Problem wurde gelöst, indem die TXE-interrupt:
InformationsquelleAutor user3575270
Ist es viel einfacher, code DMA-übertragung (und bekommen natürlich), wenn Sie die nackten register Ansatz, anstelle der Moloch HAL-monster.
Beispiel STM32F446 (vorausgesetzt, reset-Werte in den Registern)
ganz einfach - oder doch nicht?
InformationsquelleAutor P__J__