DMA auf Cortex M4 für kontinuierliche UART-Übertragung

Ich habe noch nie einen DMA verwendet und lese gerade das Datenblatt für den Atmel SAM 4E . Diese Frage muss sich nicht unbedingt auf dieses Gerät beziehen, sie kann sich auf jedes Gerät beziehen, das DMA unterstützt, wenn sie im Wesentlichen alle gleich funktionieren.

Aber wie viele Daten kann ich übertragen?

Wenn der Sender und der Empfänger einen 4 tiefen FIFO haben, dann kann ich 4 Bytes sicher übertragen, ohne mir allzu viele Gedanken über verlorene Daten machen zu müssen. Ich müsste dann warten, bis ich einen Hinweis darauf bekomme, dass das Fifo klar und bereit ist, weitere Daten zu akzeptieren.

Dies bringt mich dann zur Verwendung von flussgesteuertem UART.

Wenn ich sowohl die Sendeseite als auch die Empfangsseite so einrichte, dass sie die Flusskontrolle unterstützen, wird der Sender dann die Übertragung unterbrechen, wenn er sieht, dass CTS nicht vom Empfänger eingestellt ist, und wieder aufgenommen, wenn CTS eingestellt ist?

Wenn dies zutrifft, würde ich davon ausgehen, dass es möglich ist, so viele Daten zu senden, wie ich möchte, ohne die UART-Empfangsregister direkt lesen und so viele Daten senden zu müssen, wie ich möchte.

Antworten (1)

Im Allgemeinen sind DMA und FIFO zwei unabhängige Lösungen, um dasselbe Problem anzugehen - behandeln Sie asynchron übertragene Daten (speichern Sie sie in einem Speicher), bis die CPU Zeit hat, sie zu verarbeiten. FIFO ist durch seine Größe begrenzt. Wenn also einige Daten darauf geschrieben werden, obwohl nicht genügend Speicherplatz vorhanden ist, würde etwas verloren gehen. Auf der anderen Seite ist DMA in der Lage, mit Streams umzugehen, die nur durch seine Zählergröße (und natürlich die Quell-/Zielspeichergröße) begrenzt sind. Die DMA-Übertragung für UART (und allgemein) kann so konfiguriert werden, dass sie durch bestimmte Interrupts ausgelöst wird. Zum Beispiel, wenn der FIFO-Zähler einen bestimmten Pegel erreicht. Ihre zweite Frage bezieht sich nicht direkt auf die DMA/FIFO-Sache. Die Kontrollflusssignale wirken sich nur auf den Sender selbst aus. Wenn es so konfiguriert ist, dass es auf CTS wartet, bevor es irgendetwas sendet, wird es warten. Auch wenn mit DMA konfiguriert,

Dann findet also eine Art "Kommunikation" zwischen dem UART und dem DMA statt, um beispielsweise eine erfolgreiche Übertragung anzuzeigen, und nur wenn er dies empfängt, wird er den Sendepuffer wieder auffüllen. Ist das eine richtige Aussage?
Ja, wie ich bereits erwähnt habe, kann die DMA-Übertragung für einzelne Bytes so konfiguriert werden, dass sie von UARTs Interrupts ausgelöst wird.
Auf diesem speziellen Chip gibt es ein dediziertes "DMA Hardware Handshaking Interface", das sich damit befasst. Aber es ist implementierungsspezifisch und hat nichts mit dem Cortex-M4-Kern zu tun.
Ich versuche zum ersten Mal, UART, DMA für seinen FIFO-Puffer und FreeRTOS gleichzeitig zu verwenden. Es ist sehr verwirrend...