Programmation de microcontrôleurs STM32: UART
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.
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.

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 à
1dans 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
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)
Tx et une entrée Rx.
Pour que les cartes puissent communiquer, il est nécessaire de croiser les connexions Tx <-> Rx.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é.