El objetivo de este artículo es presentar la aplicación del modo DMA2D a través de la placa de desarrollo STM32H563. El denominado modo DMA 2D significa que el DMA puede ajustar dinámicamente el modo de direccionamiento y la capacidad del DMA configurando previamente el desplazamiento de direccionamiento intra-bloque y el desplazamiento de direccionamiento de bloque. En otras palabras, cuando el DMA realiza la transmisión de datos, el direccionamiento intra-bloque ya no está siempre fijado para almacenarse de forma adyacente, sino que el intervalo de direcciones para acceder a los datos durante dos transmisiones adyacentes puede determinarse mediante programación. En el caso de las transferencias de bloques repetitivas, ya no se reinicia simplemente desde la misma posición cada vez, sino que la dirección de inicio de la nueva transferencia puede ajustarse según el desplazamiento de la dirección del bloque.
El principio de la transmisión DMA 2D
Supongamos que se inician tres transferencias para la misma solicitud DMA, correspondientes a tres bloques de transferencia DMA.

Como se muestra en la figura anterior, se transmiten por primera vez 5 datos marcados en rojo [es decir, el primer bloque] y se realiza el acceso a los datos según la figura. La segunda y tercera veces también son similares a la primera, y se transmiten respectivamente 5 datos verdes [es decir, el segundo bloque] y 5 datos azules [es decir, el tercer bloque]. Obviamente, las reglas de acceso a los datos en cada bloque de transmisión son las mismas, con dos espacios de almacenamiento separados por dos. Al mismo tiempo, cuando se inicia la segunda transmisión después de que se haya completado la primera, o se inicia la tercera transmisión después de que se haya completado la segunda, la dirección de inicio se retrocede 14 espacios de dirección desde la posición actual antes de comenzar.
¿Cómo se utiliza la función DMA 2D?
En este ejemplo, utilizamos la placa Nucleo STM32H563ZI. Y el USART3 del chip debe conectarse con el VCP del STLINK integrado. Utilice el asistente de depuración del puerto serie del PC para distribuir tres conjuntos de datos al MCU por lotes, cuyo contenido es 5 caracteres R, 5 caracteres G y 5 caracteres B. Habilite la función DMA 2D recibida por USART3.
Por cierto, como recordatorio, no todos los canales del GPDMA de la serie STM32H5 admiten la función de direccionamiento DMA 2D. Si el canal DMA admite la función 2D se indica claramente en la interfaz de configuración de CubeMx. Si utiliza la configuración de CubeMx, puede elegir las palabras adecuadas. Aquí elijo DMA CH6 de GPDMA1, que admite la función DMA 2D.
La configuración básica para utilizar STM32CubeMX es la siguiente:

El enfoque de nuestra configuración es el direccionamiento 2D, los detalles son los siguientes:
Ahora es USART3DMA el que recibe, obviamente la dirección de origen es fija, es decir, el registro de datos de recepción USART3, por lo que el desplazamiento relacionado con la dirección de origen aquí es 0. La dirección de destino del acceso DMA es la memoria, que es variable. Cada vez que se almacena un dato en el bloque, se desplaza dos posiciones hacia adelante, lo que corresponde al valor de desplazamiento de la dirección de destino que se indica a continuación. Cuando comienza la siguiente ronda de transmisión después de que se completa la transmisión de cada bloque, la dirección de inicio se encuentra exactamente 14 posiciones atrás, lo que corresponde al siguiente valor de desplazamiento de la dirección de destino del bloque; atrás es negativo y adelante es positivo. Aquí se repiten un total de 3 transferencias de bloques, lo que corresponde al valor del contador de repeticiones que se indica a continuación.

De hecho, tras tres rondas de transmisión repetida del bloque DMA, los datos recibidos se asemejan al patrón indicado por la flecha en la siguiente figura.

Utilice STM32CubeMx para completar la configuración, añada el código de usuario para depurar y verificar. El código de usuario que debe añadirse manualmente es principalmente las dos líneas siguientes:
__HAL_LINKDMA(&huart3, hdmarx, handle_GPDMA1_Channel6);
HAL_UART_Receive_DMA(&huart3,(uint8_t *)aRxBuffer, 5); //Receive 5 data per block
La siguiente figura muestra el resultado basado en la depuración. A través de tres recepciones DMA independientes, los datos se almacenan regularmente en orden RGB.





