Comment déboguer son programme ?
Comment utiliser l’affichage Série ?

NIVEAU 1

Objectifs

  • Utiliser une sortie numérique pour déboguer un code source
  • Utiliser la console série pour connaitre l’état d’une variable

Pré-requis

Débogage

Lorsqu’on développe une application “standard” sur un ordinateur, il est facile de rajouter des lignes supplémentaires pour afficher des informations de débogage : soit sur une console, soit dans une partie de l’interface graphique développée.

En programmation embarquée, le microcontroleur n’a pas accès à un écran pour pouvoir communiquer facilement ce type d’informations. Il est donc plus difficile de connaître l’état de progression d’exécution du programme ou la valeur d’une variable à un moment donné du programme.

Nous allons voir ici deux techniques permettant de répondre à cette attente :

  • à l’aide d’une sortie externe et d’un oscilloscope (et/ou d’une LED)
  • à l’aide d’une liaison série entre la carte et l’ordinateur et d’un logiciel pour communiquer sur ce type de liaison

Oscilloscope

Une première méthode pour connaître l’état d’avancement de l’exécution d’un programme (ou l’évaluation du temps de calcul de celui-ci) est d’utiliser une (ou plusieurs) sortie(s) externe(s) supplémentaire(s) que l’on fera passer successivement de l’état 0 à l’état 1 (et inversement).Par le suivi de l’évolution de cette sortie, on sera capable de déterminer si le programme entre dans telle ou telle condition (en fonction de l’état de certaines entrées par exemple) ou dans une fonction.

Elle est très simple à mettre en place mais nécessite que vous ayez un oscilloscope sous la main (en particulier si l’exécution de votre boucle est rapide). On peut également se contenter parfois d’une LED (voir tutoriel Piloter une LED).

La technique est de configurer une sortie sur un port du microcontroleur. Ensuite, vous allez visualiser l’état de cette sortie avec un oscilloscope. Cette sortie sera modifiée à l’entrée et à la sortie du bloc que vous souhaitez tester.

#include "mbed.h"
DigitalOut mytest(PA_4,0); // LED Utilisée par le programme

int main()
{
    // Initialisation

    // Boucle infinie
    while(1) {
        // BLOC D'INSTRUCTION 1

        mytest = 1;

        // BLOC D'INSTRUCTION A TESTER

        mytest = 0;

        // BLOC D'INSTRUCTION 2
    }
}

Ainsi, une fois ce code compilé et téléversé sur la carte Nucleo L476RG, il suffit de regarder à l’oscilloscope le port PA_4.

Console Série

La première méthode proposée ne permet pas de connaître la valeur d’une variable à un instant donné dans le programme. Le microcontroleur n’étant pas équipé d’un écran pour afficher les valeurs des variables, il faut trouver une autre astuce pour récupérer ces informations. La seconde méthode proposée ici associe au microcontroleur un ordinateur et un logiciel de type terminal par l’intermédiaire d’une liaison série de type RS232. Par ce biais, on peut faire transiter (par l’intermédiaire du câble USB qui permet également le téléversement du programme) des informations de l’un vers l’autre et ainsi connaitre la valeur des variables internes au microcontroleur.

N.B. On verra également dans un autre tutoriel que l’on peut faire communiquer deux systèmes différents sur ce principe.

Initialiser la liaison série sur la carte Nucléo

La liaison série de type RS232 peut être utilisée pour transmettre des informations depuis la carte vers l’ordinateur ou inversement. On peut par exemple l’utiliser pour envoyer des messages de débogage depuis la carte vers l’ordinateur.

Afin de faire fonctionner cette liaison série, il faut l’initialiser à l’aide du code suivant :

include "mbed.h"

Serial pc(USBTX, USBRX);

Serial‘ est la classe qui permet de gérer la liaison série de la carte Nucléo. Il est nécessaire de lui passer en paramètres deux broches du microcontroleur : une pour la transmission de la carte vers l’ordinateur (ici USBTX) et une pour la transmission dans l’autre sens (ici USBRX).

Sans autre paramétrage, la liaison série est configurée à une vitesse de 9600 bauds.

Configurer le terminal sur l’ordinateur / TeraTerm

Les ordinateurs sont eux-mêmes capables de gérer les échanges sur des liaisons série de ce type. Par contre, ils sont incapables naturellement de déchiffrer les valeurs qui transitent sur les câbles. Pour cela, nous allons utiliser un autre logiciel de type terminal : TeraTerm

N.B. Sous Linux (distributions Debian et dérivées), on pourra utiliser GTKTerm.

Ce logiciel est gratuit et disponible en suivant ce lien.

Par la suite, il faut configurer TeraTerm pour qu’il affiche les informations envoyées par la liaison série. Pour cela, il faut ouvrir TeraTerm et suivre la procédure de configuration suivante :

  1. Lancez le logiciel TeraTerm
  2. Dans la fenêtre “TeraTerm: New connection” qui s’ouvre, sélectionnez le mode “Serial” et sélectionnez le port correspondant à la carte Nucléo (ooooo). Si cette fenêtre ne s’ouvre pas, vous pouvez aussi aller dans le menu File / New connection…

La console apparaît alors.

Par défaut, les paramètres utilisés sont une transmission à 9600 bauds, à 8 bits, sans gestion de la parité et 1 bit de stop. Pour changer ces paramètres, il faut aller dans le menu Setup > Serial Port.

Il est également possible de modifier les paramètres d’affichage de la console. Pour cela, il suffit d’aller dans le menu Setup > Terminal.

Il est en particulier intéressant de cocher l’option “Local echo” pour ce que vous taperez plus tard dans la console apparaisse également dans cette dernière.

Envoyer un message simple

Pour envoyer un message depuis la carte Nucléo vers le PC, il n’y a rien de plus simple. Il faut utiliser la commande suivante :

pc.printf("Hello World !\n");

Cette instruction envoie un texte formaté (cf fonction printf en C) sur la liaison série, nommée pc, initialisée précédemment. Sur la console de TerraTerm, côté ordinateur, le message “Hello World !” sera alors affiché.

Envoyer la valeur d’une variable

Il est également possible par ce biais de renvoyer la valeur d’une variable sur la console de l’ordinateur.

Pour cela, il suffit d’ajouter dans la fonction printf le type de la variable à transmettre (%d : entier, %c : caractère, %s : chaine de caractères, %f : réel – flottant) et sa valeur en paramètres.

char c = 300;
pc.printf("C vaut %d \n", c);

Tutoriel lié

Autres tutoriels

MInE Prototyper Prototyper avec Nucleo et MBED

Nucleo – Déboguer son programme et utiliser l’affichage Série