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

Inscreva-se

Inscreva-se na nossa lista de assinantes para receber atualizações mensais do blog, notícias sobre tecnologia e estudos de caso. Nunca enviaremos spam e você pode cancelar a assinatura a qualquer momento.

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.

Precisa de ajuda?

Rolar para cima

Instant Quote