Mise en œuvre de l’USART avec le DMA

Mise en oeuvre de l'USART avec le DMA

objectif de la manip :

Une chaine de caractère est envoyée automatiquement par l'USART du microcontrôleur. L'envoi est piloté par le contrôleur DMA sans intervention du coeur du microcontrôleur (il déclenche seulement l'envoi et c'est le DMA qui gère le reste).

Matériel requis

  • un ordinateur avec un terminal (putty, termite,...)
  • une carte nucleo-L073RZ ou F446RE ou autre...
  • un câble USB pour programmer et émuler la liaison série.

Configuration de l'USART

USART_Config_Sans_NVIC_params.png
Pas obligé d'activer les interruptions USART en mode circular buffer.

A noter que si on se met en Mode Circular et Increment Address coché pour Memory, il suffit de faire une seule fois l'appel à la fonction HAL_UART_Transmit_DMA(&huart2, testMessage, sizeof(testMessage)) pour que l'envoi se répète inlassablement.

    // Appel de ces deux fonctions dans cet ordre la et pas l'inverse sinon cela ne fonctionne pas
    MX_DMA_Init();
    MX_USART2_UART_Init();
  uint8_t testMessage[]="Message envoye automatiquement grace au controleur DMA\r\n";

    HAL_UART_Transmit_DMA(&huart2, testMessage, sizeof(testMessage));
    while(1)
    {
        //on ne fait rien
    }

En mode normal, cela donne :

Attention, il faut activer les interruptions USART !

while (1)
{
    HAL_UART_Transmit_DMA(&huart2, testMessage, sizeof(testMessage));
    HAL_Delay(1000);
}

Tests

Ouvrir un terminal (putty) et le configurer en 115200 bauds, 8 bits, pas de parité. 1 bit de stop.
Programmer la carte.
Le message doit s'afficher toutes les secondes à l'écran du terminal.

Problèmes fréquents

La fonction d'initialisation du DMA MX_DMA_Init() est appelée avant celle de l'USART MX_USART_init();
Et c'est le drame. Rien ne fonctionne. Bienvenue en STM32zarbie.

  MX_GPIO_Init();
  MX_USART2_UART_Init();
  MX_DMA_Init();