Cette page vise à présenter une première utilisation des interruptions sur un microcontrôleur STM32. À la suite de cette page, un développeur logiciel doit être capable:

  • De trouver les informations nécessaires dans une datasheet pour l’utilisation du protocole UART,
  • De programmer les différents registres,
  • D’envoyer des informations octet par octet vers un ordinateur.
Version des outils Les différentes étapes utilisent la version v1.12.0 du logiciel STM32CubeIDE. Certaines variations au niveau des captures d’écrans peuvent apparaître si vous utilisez des versions différentes. De même, la carte utilisée est la Nucleo-F446RE.

Transmission/Réception UART

Lors de la conception d’un système à base de microcontrôleur, il est souvent utile de pouvoir échanger des informations avec un autre système. Par exemple, c’est le cas lorsque l’on souhaite envoyer des données vers un ordinateur responsable du traitement ou du contrôle. Un protocole de transmission permet alors de mettre en place une interface commune pour l’échange de ces données. Selon les applications, il existe de multiples types de protocoles. Dans le cadre de cet exercice, nous allons nous intéresser au protocole UART.

Protocole UART

Le protocole UART (pour Universal Asynchronous Receiver Transmitter) est un protocol de type asynchrone. Cela signifie qu’il permet d’envoyer des données entre deux systèmes sans signal d’horloge commun. Pour cela, la trame intègre des évènements permettant de détecter une émission. De plus, l’émetteur et le récepteur doivent avoir convenu d’un débit commun au préalable.

Le protocole UART est un protocole réputé pour sa simplicité. Il ne contient que deux signaux, Tx et Rx respectivement dédiés à l’émission et à la réception (donc un en entrée, l’autre en sortie). Ainsi, d’un point de vue matériel, son implémentation peut se résumer à 2 FSMs chargées de mettre en forme/lire les trames. Pour ces raisons, des contrôleurs UART sont présents dans la plupart des microcontrôleurs.

Exemple de trame UART

Une trame UART se décompose en 5 parties:

  • La valeur IDLE qui est la valeur par défaut (1). Tant que le signal reste à cette valeur, cela signifie qu’aucune émission n’est en cours.
  • Le bit de start (0), qui indique le début d’une trame.
  • Les bits de données qui contienne l’information transmise. La taille peut varier de 5 à 9 bits selon les implémentations.
  • Le bit de parité, qui permet d’identifier de potentiel erreurs dans la donnée. Pour un bit de parité paire, cela revient à compter le nombre de bits à 1 dans la donnée.
  • Le bit de stop (1) qui indique la fin d’une trame. Il y a en général entre 0 et 2 bits de stop.

Le débit / baud rate définit le temps alloué à chaque bit. Un baud rate de 9600 signifie que 9600 bits sont transmis par seconde. Parmi les baud rate les plus communs, on a 9600, 19200, 38400, 115200, 230400 etc. Cependant, il est généralement possible de configurer les systèmes pour utiliser n’importe quelle valeur de baud rate. Pour cela, des diviseurs internes permettent alors de modifier l’allure de la trame selon la fréquence du système.

Pour la suite de l’exercice, on considèrera la configuration suivante:

  • U(S)ART 1,
  • Baud rate: 9600,
  • Stop bit: 1,
  • Contrôle de la parité: activé,
  • Type de parité: paire (even).

Envoi d’un octet

Question 1 Tout d’abord, nous allons nous concentrer sur la partie émission. Pour cela, appuyez vous sur le manuel de référence pour configurer l’UART et respecter la configuration ci-dessus. Validez ensuite votre configuration par le biais d’un oscilloscope en validant la trame visuellement.
Documentation

Les informations sur l’USART1 se trouvent page 775 du manuel de référence (Chapitre 25: Universal synchronous receiver transmitter (USART)).

Aide supplémentaire ...

En plus du mode alternatif dans les GPIO nécessaires, la configuration de l’UART concernera ici principalement 3 registres: BRR, CR1 et CR2. L’envoi de données se fait par une écriture dans le registre DR. Ensuite, un registre supplémentaire SR nous donnera les informations sur l’état de l’UART.

Réception d’un octet (STM32)

Question 2 La configuration de la réception est partagée avec celle de l’émission: ainsi, une fois l’UART configuré, il ne reste plus qu’à activer la partie réception et tester si des trames valides ont été reçues. Modifiez votre code pour maintenant lire en scrutatif les octets reçus. Pour tester votre système, connectez-le à une seconde carte Nucleo.
Connexions Chaque carte Nucleo a une sortie Tx et une entrée Rx. Pour que les cartes puissent communiquer, il est nécessaire de croiser les connexions Tx <-> Rx.
Question 3 La réception d’une trame peut être très longue à l’échelle d’un système (des centaines ou milliers de cycles d’horloge selon la fréquence et le baud rate). Ainsi, il peut être pratique d’utiliser les interruptions pour ne traiter les octets reçu que lorsque c’est nécessaire. Pour cela, configurer les interruptions et la routine USART1_IRQHandler(void) pour que dès qu’un octet est reçu, l’état de la LED s’inverse et qu’un nouvel octet soit renvoyé.

Réception d’un octet (Ordinateur)

Question 4 Une communication UART peut également être effectuée par le biais d’un branchement USB. Ainsi, il est tout à fait possible d’envoyer/recevoir des trames exactement de la même manière avec un PC. Utilisez le USART2 pour communiquer avec votre ordinateur via le câble USB. Pour visualiser les trames sous Windows, utilisez un script (e.g. Python) ou autrelogiciel (e.g. IDE Arduino, Putty etc.) de votre choix.