Este artigo tem como objetivo apresentar a aplicação do modo DMA2D através da placa de desenvolvimento STM32H563. O chamado modo DMA 2D significa que o DMA pode ajustar dinamicamente o modo de endereçamento e a capacidade do DMA, definindo antecipadamente o deslocamento de endereçamento intra-bloco e o deslocamento de endereçamento de bloco. Em outras palavras, quando o DMA realiza a transmissão de dados, o endereçamento intra-bloco não é mais fixo para ser armazenado de forma adjacente, mas o intervalo de endereço para acessar os dados durante duas transmissões adjacentes pode ser determinado por programação. Para transferências de blocos repetitivas, não é mais simplesmente reiniciar da mesma posição todas as vezes, mas o endereço inicial da nova transferência pode ser ajustado de acordo com o deslocamento do endereço do bloco.
O princípio da transmissão DMA 2D
Suponha que três transferências sejam iniciadas para a mesma solicitação DMA, correspondendo a três blocos de transferência DMA.

Conforme mostrado na figura acima, 5 dados marcados em vermelho [ou seja, o primeiro bloco] são transmitidos pela primeira vez, e o acesso aos dados é realizado de acordo com a figura. A segunda e a terceira vezes também são semelhantes à primeira vez, e 5 dados verdes [ou seja, o segundo bloco] e 5 dados azuis [ou seja, o terceiro bloco] são transmitidos respectivamente. Obviamente, as regras de acesso aos dados em cada bloco de transmissão são as mesmas, com dois espaços de armazenamento separados por dois. Ao mesmo tempo, quando a segunda transmissão é iniciada após a conclusão da primeira transmissão, ou a terceira transmissão é iniciada após a conclusão da segunda transmissão, o endereço inicial é definido 14 espaços de endereço atrás da posição atual antes do início.
Como usar a função DMA 2D?
Neste exemplo, usamos a placa STM32H563ZI Nucleo. E o USART3 do chip precisa ser conectado ao VCP do STLINK integrado. Use o assistente de depuração da porta serial no lado do PC para distribuir três conjuntos de dados para o MCU em lotes, os conteúdos são 5 caracteres R, 5 caracteres G e 5 caracteres B. Habilite a função DMA 2D recebida pelo USART3.
A propósito, como lembrete, nem todos os canais do GPDMA da série STM32H5 suportam a função de endereçamento DMA 2D. Se o canal DMA suporta a função 2D está claramente indicado na interface de configuração do CubeMx. Se você usar a configuração do CubeMx, poderá escolher as palavras apropriadas. Aqui, escolho o DMA CH6 do GPDMA1, que suporta a função DMA 2D.
A configuração básica para usar o STM32CubeMX é a seguinte:

O foco da nossa configuração é o endereçamento 2D, os detalhes são os seguintes:
Agora é o USART3DMA que está recebendo, obviamente o endereço de origem é fixo, ou seja, o registro de dados de recepção do USART3, portanto, o deslocamento relacionado ao endereço de origem aqui é 0. O endereço de destino do acesso DMA é a memória, que é variável. Cada vez que um dado é armazenado no bloco, ele é deslocado duas posições para a frente, correspondendo ao valor do Deslocamento do Endereço de Destino abaixo. Quando a próxima rodada de transmissão começa após a conclusão de cada transmissão de bloco, o endereço inicial é exatamente 14 posições atrás, correspondendo ao valor do Deslocamento do Endereço de Destino do Bloco a seguir, o retrocesso é negativo e o avanço é positivo. Aqui, um total de 3 transferências de bloco são repetidas, correspondendo ao valor do contador de repetição abaixo.

De fato, após 3 rodadas de transmissão repetida do bloco DMA, os dados recebidos se parecem com o padrão indicado pela seta na figura abaixo.

Use o STM32CubeMx para concluir a configuração, adicione o código do usuário para depurar e verificar. O código do usuário que precisa ser adicionado manualmente é principalmente as duas linhas a seguir:
__HAL_LINKDMA(&huart3, hdmarx, handle_GPDMA1_Channel6);
HAL_UART_Receive_DMA(&huart3,(uint8_t *)aRxBuffer, 5); //Receive 5 data per block
A figura a seguir é o resultado baseado na depuração. Através de três recepções DMA independentes, os dados são armazenados regularmente na ordem RGB.




