Aplicar a função DMA2D com a placa Nucleo STM32H563

Índice

DMA 2D transfer result

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.

DMA transfer block
DMA transfer block

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:

Basic configuration of STM32CubeMx
Basic configuration of STM32CubeMx

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.

2D addressing configuration
2D addressing configuration

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.

DMA 2D transfer result
DMA 2D transfer result

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.

Result of DMA data transfer
Result of DMA data transfer

Sobre o autor

Picture of Aidan Taylor
Aidan Taylor

I am Aidan Taylor and I have over 10 years of experience in the field of PCB Reverse Engineering, PCB design and IC Unlock.

Compartilhar

Postagem recomendada

Precisa de ajuda?

Rolar para cima

Cotação instantânea

Instant Quote