Dieser Artikel soll die Anwendung des DMA2D-Modus anhand des STM32H563-Entwicklungsboards vorstellen. Der sogenannte DMA-2D-Modus bedeutet, dass der DMA den Adressierungsmodus und die Kapazität des DMA dynamisch anpassen kann, indem der Intra-Block-Adressierungs-Offset und der Block-Adressierungs-Offset im Voraus festgelegt werden. Mit anderen Worten: Wenn der DMA eine Datenübertragung durchführt, ist die Adressierung innerhalb des Blocks nicht mehr immer fest auf eine benachbarte Speicherung festgelegt, sondern das Adressintervall für den Zugriff auf Daten während zwei benachbarten Übertragungen kann durch Programmierung festgelegt werden. Bei sich wiederholenden Blockübertragungen wird nicht mehr einfach jedes Mal an derselben Position neu gestartet, sondern die Startadresse der neuen Übertragung kann entsprechend dem Offset der Blockadresse angepasst werden.
Das Prinzip der DMA-2D-Übertragung
Angenommen, für dieselbe DMA-Anforderung werden drei Übertragungen initiiert, die drei DMA-Übertragungsblöcken entsprechen.

Wie in der obigen Abbildung dargestellt, werden 5 rot markierte Daten [d. h. der erste Block] zum ersten Mal übertragen, und der Datenzugriff erfolgt gemäß der Abbildung. Das zweite und dritte Mal sind ebenfalls ähnlich wie beim ersten Mal, und es werden jeweils 5 grüne Daten [d. h. der zweite Block] und 5 blaue Daten [d. h. der dritte Block] übertragen. Offensichtlich sind die Datenzugriffsregeln in jedem Übertragungsblock identisch, wobei zwei Speicherplätze durch zwei voneinander getrennt sind. Gleichzeitig wird, wenn die zweite Übertragung nach Abschluss der ersten Übertragung gestartet wird oder die dritte Übertragung nach Abschluss der zweiten Übertragung gestartet wird, die Startadresse vor dem Start um 14 Adressplätze von der aktuellen Position zurückgesetzt.
Wie verwendet man die DMA-2D-Funktion?
In diesem Beispiel verwenden wir das STM32H563ZI Nucleo-Board. Der USART3 des Chips muss mit dem VCP des integrierten STLINK verbunden werden. Verwenden Sie den Debugging-Assistenten für serielle Schnittstellen auf der PC-Seite, um drei Datensätze in Stapeln an die MCU zu verteilen. Der Inhalt besteht aus 5 Zeichen R, 5 Zeichen G und 5 Zeichen B. Aktivieren Sie die von USART3 empfangene DMA-2D-Funktion.
Übrigens: Nicht alle Kanäle des GPDMA der STM32H5-Serie unterstützen die DMA-2D-Adressierungsfunktion. Ob der DMA-Kanal die 2D-Funktion unterstützt, ist in der CubeMx-Konfigurationsschnittstelle klar angegeben. Wenn Sie die CubeMx-Konfiguration verwenden, können Sie die entsprechenden Wörter auswählen. Hier wähle ich DMA CH6 von GPDMA1, das die DMA-2D-Funktion unterstützt.
Die Grundkonfiguration für die Verwendung von STM32CubeMX lautet wie folgt:

Der Schwerpunkt unserer Konfiguration liegt auf der 2D-Adressierung, die Details sind wie folgt:
Jetzt empfängt USART3DMA, wobei die Quelladresse offensichtlich fest ist, d. h. das USART3-Empfangsdatenregister, sodass der Offset in Bezug auf die Quelladresse hier 0 ist. Die Zieladresse des DMA-Zugriffs ist der Speicher, der variabel ist. Jedes Mal, wenn ein Datenelement im Block gespeichert wird, wird es um zwei Positionen nach vorne verschoben, entsprechend dem unten angegebenen Wert für den Zieladress-Offset. Wenn nach Abschluss jeder Blockübertragung die nächste Übertragungsrunde beginnt, liegt die Startadresse genau 14 Positionen zurück, entsprechend dem folgenden Wert für den Blockzieladress-Offset, wobei „zurück“ negativ und „vorwärts“ positiv ist. Hier werden insgesamt 3 Blockübertragungen wiederholt, entsprechend dem unten angegebenen Wert für den Wiederholungszähler.

Tatsächlich sehen die empfangenen Daten nach drei Runden wiederholter DMA-Blockübertragung wie das in der Abbildung unten durch den Pfeil angezeigte Muster aus.

Verwenden Sie STM32CubeMx, um die Konfiguration abzuschließen, fügen Sie Benutzercode zum Debuggen und Überprüfen hinzu. Der Benutzercode, der manuell hinzugefügt werden muss, besteht hauptsächlich aus den folgenden zwei Zeilen:
__HAL_LINKDMA(&huart3, hdmarx, handle_GPDMA1_Channel6);
HAL_UART_Receive_DMA(&huart3,(uint8_t *)aRxBuffer, 5); //Receive 5 data per block
Die folgende Abbildung zeigt das Ergebnis der Fehlerbehebung. Durch drei unabhängige DMA-Empfänge werden die Daten regelmäßig in RGB-Reihenfolge gespeichert.





