

La mise en oeuvre d'une liaison série asynchrone de type UART/USART peut se faire de deux manières: par polling (boucle d'attente sur les bits de status) ou interruptions. Afin de vous faciliter de vous permettre la mise en oeuvre rapide de l'UART des microcontrôleurs AVR, nous mettons à votre disposition une librairie mettant en oeuvre les deux méthodes (choix entre les deux méthodes dans la fonction d'initialisation de la librairie).
Afin de rendre la méthode par interruptions encore plus souple, notre librairie met en place un mécanisme de FIFO (First In First Out). Lorsqu'une donnée est reçue, celle-ci est ajoutée à la fin de la FIFO (sorte de tableau circulaire) et le pointeur d'adresse d'écriture dans la FIFO est incrémenté. En lecture, les données sont lues dans la FIFO dans leur ordre d'arrivée et le pointeur d'adresse de lecture est incrémenté après chaque lecture. Bien entendu, la taille de la FIFO n'est pas infini, la librairie gère donc des flags indiquant si des données sont disponibles en lecture ou si une émission est en cours. Aucune gestion d'arrêt de réception en cas de FIFO pleine n'est implémenté. Si jamais la FIFO venait à faire un tour complet, les données sont écrasées.
Nous avons mis à votre disposition la librairie ainsi que deux exemples montrons la mise en oeuvre de la librairie avec les deux méthodes disponibles.
N'hésitez pas à nous poser des questions sur la mise en oeuvre de cette librairie sur le forum.
La librairie est compilable avec gcc (fournit avec Winavr).
Header (.h)
Source (.c)
* Clic droit -> Enregistrer la cible du lien sous
Bien que le code soit clairement commenté, nous souhaitions rajouter quelques précisions sur son utilisation.
Entre les différents microcontrôleurs le gamme AVR, il arrive que le nom des registres permettant de gérer l'UART changent. Les microcontrôleurs de la famille ATmegax8 (ATmega48/88/168/328) et le microcontrôleur ATmega8 en sont un bon exemple. Ces deux "familles" étant les plus répandus dans notre gamme de produit, nous avons rendu notre librairie compatible des deux par simples directives de préprocesseur C.
Exemple :
Vous pouvez donc vous inspirer de la gestion de ces deux possibilités pour modifier le code de la librairie si jamais vous utilisez un microcontrôleur dont les noms de registres sont différents.
Comme la librairie gère deux méthodes de gestion de la communication UART, et ce par simples paramètres dans la fonction d'initialisation, il faut savoir que le tableau servant pour la FIFO reste présent même si vous n'utilisez pas ce mode. Il prend donc de la place en mémoire.
Si jamais vous n'aviez vraiment pas besoin du mode IT avec FIFO, éditez le fichier header de la librairie et mettez les deux éléments qui suivent à 0. Le tableau ne sera alors plus créé et le code sera plus léger.
Le séquencement de notre librairie est assez simple, vous devez tout d'abord initialiser l'UART à l'aide de la fonction MYAVRUSART_init qui permet de régler le débit, la parité, le nombre de bits de stop, le nombre de bits de données et le choix entre la méthode polling et IT avec FIFO.
Si vous utilisez le mode polling, il vous suffit ensuite d'utiliser les fonctions MYAVRUSART_envoyer et MYAVRUSART_recevoir pour gérer l'émission et la réception des données. Les paramètres de ces fonctions sont assez explicites. ATTENTION: vous ne sortez de ces fonctions qu'une fois l'émission ou la réception complêtement terminée.
En mode IT avec FIFO, le principe est différent, vous n'avez qu'à surveiller de temps en temps si la FIFO contient des données, ou est encore en train d'émettre, à l'aide des fonctions MYAVRUSART_statusEmission et MYAVRUSART_statusReception. La récupération des données reçues ou la préparation des données à émettre se fait à l'aide des fonctions de réception et émission citées plus haut qui, dans cette configuration, retourne une erreur en cas de FIFO vide (lecture) ou FIFO pleine (écriture) au lieu d'être bloquante.
L'arrêt complet de la librairie UART se fait en utilisant la fonction MYAVRUSART_arret.


