Comment tester ma première application sur Nucléo ?

Notion obligatoire pour la suite

Objectifs

  • Reconnaître les différents connecteurs de la carte
  • Compiler et téléverser un programme sur la carte
  • Tester sa première application

Pré-requis

N.B. Ce tutoriel peut être complété par la page suivante, Découvrir les microcontrôleurs des cartes Nucléo, qui fournit des compléments d’information sur les microcontrôleurs, leur structure, la structure d’un programme embarqué et les différences avec la programmation en C standard.

La carte de prototypage Nucléo

La carte de développement que nous allons utiliser est une carte Nucléo-L476RG, conçue par ST MicroElectronics (société franco-italienne – ex Thomson Semiconducteurs).

Caractéristiques principales

Elle possède les éléments suivants :

  • Processeur : STM32L476RGT6 / ARM®32-bit Cortex®-M4 CPU
  • Fréquence maximale : 80 MHz
  • Alimentation : 3.3 V
  • Mémoire programme : 1 MB Flash
  • Mémoire données :128 KB SRAM
  • Ressources :
    • Entrées/Sorties Numériques : 51, dont 1 LED présente sur la carte (sortie D13 ou PA_5) et un bouton-poussoir (entrée PC_13)
    • ADC 12 bits / 5 MHz (x 3)
    • DAC 12 bits / 2 canaux
    • Timers
    • Interruptions externes
  • Communications :
    • SPI / I2C
    • USART / UART / CAN
    • USB OTG Full Speed

Broches du microcontroleur et connecteurs

Pour accéder aux broches de la carte, il existe deux types de connecteurs différents :

  • Connecteurs compatibles Arduino Uno
  • Connecteurs ST Morpho (specifiques)

L’ensemble des broches peuvent être configurées indépendamment en entrée ou en sortie numérique.
Ces broches sont regroupées en ports d’entrées/sorties nommés Px (où x est une lettre de A à G – par exemple le port A se nomme PA). Chacune des broches d’un port sont ensuite désignées par un nombre de 0 à 15 (par exemple, la broche 3 du port B s’appelle PB_3).

Broches spécifiques des cartes Nucléo

La broche PA_5 par exemple est reliée à une LED nommée LED1. On peut alors utiliser l’une ou l’autre des dénominations pour accéder à cette ressource.

La broche PC_13 est reliée à un bouton-poussoir nommé USER_BUTTON.

N.B. Ces deux broches permettent de tester rapidement toute la chaîne de développement (IDE, programmation…) sans avoir à cabler quoi que ce soit d’autre que le cable USB reliant l’ordinateur à la carte Nucléo.

Les broches PA_2 et PA_3 sont respectivement les broches USBTX et USBRX permettant de transmettre selon le protocole RS232 (voir tutoriel xxx) des informations de la carte vers le PC (et inversement). Ce sont ces deux canaux qu’utilisent également la console série pour le débogage (voir tutoriel Déboguer son application).

Carte Nucléo L476RG / ST Microelectronics

Accès aux brochages de la carte en cliquant sur l’image précédente.

Connecteurs Arduino

Ces connecteurs sont compatibles avec les cartes d’extensions Arduino Uno (ou shields). Les noms des entrées/sorties sont équivalentes à celles d’Arduino.
Par exemple, D13 est une broche numérique qui pourra être configurée en entrée ou en sortie.

D’autres fonctionnalités de ces broches sont listées également à côté de leurs noms sur l’image précédente.
Par exemple, la broche D11 (numérotation Arduino) correspond à la broche physique PA_7 du composant, qui peut être configurée comme : une sortie PWM, la sortie MOSI de la liaison SPI1, une entrée analogique…

Sur la zone de gauche, il est également possible d’accéder à des entrées analogiques, numérotées de A0 à A5, et à une zone d’alimentation : GND (masse), 5V, 3.3V.

Connecteurs Morpho

Les connecteurs Morpho sont conçus par STMicroelectronics et permettent d’accéder à l’ensemble des broches du composants (et de ses périphériques).

Comment se programme une carte Nucléo ?

Ecriture du code source

Tout comme les processeurs généralistes (qui équipent la plupart des ordinateurs), les microcontrôleurs ne comprennent que du langage de bas niveau, encore appelé assembleur. Cependant, ces langages étant difficiles à comprendre et à appréhender pour un être humain, il existe des programmes qui permettent de transformer des langages dits de haut niveau (type langage Python, C, C++) vers ces langages machines. Ce sont les compilateurs.

Compilation

Dans le cas du compilateur MBED Compiler utilisé pour coder les applications sur les cartes Nucleo, le langage de haut niveau utilisé est du C/C++. Ce compilateur en ligne est associé à une série de bibliothèques de fonctions permettant de gérer ou/et de communiquer avec des composants externes (écrans LCD, accéléromètres, modules BT…).

La compilation sous MBED se fait par le bouton suivant :

Une fenêtre de progression de la compilation apparaît alors :

A la fin du processus de compilation, le site vous propose de sauvegarder un fichier binaire (extension *.bin) sur votre disque dur. Choisissez l’emplacement où vous souhaitez le stocker et cliquez sur Sauvegarder :

Téléversement

La dernière étape est de transférer le fichier binaire fourni par l’étape précédente sur le microcontroleur.

Dans le cas des cartes Nucléo, le programmateur, appelé ST-Link, est présent sur une partie de la carte. Il permet en plus à la carte Nucléo d’être reconnue comme une “simple” clef USB. Un simple câble USB suffit alors à faire le lien entre l’ordinateur qui a permis de compiler le programme et le microcontroleur présent sur la deuxième partie de la carte Nucléo.

Schéma de principe de la carte Nucléo

Le téléversement se fait alors par simple copier-coller vers la “fausse” clef USB. Les cartes Nucléo sont souvent reconnues par les systèmes d’exploitation par leur nom : NODE xxxx.

Premier programme

Blinky LED : Le “Hello World” de l’embarqué

Le programme auquel nous allons nous intéresser ici est le template nommé : “Blinky LED…” (programme d’exemple qui fait clignoter la LED présente sur la carte Nucléo). Ce programme est l’équivalent du “Hello World !” en C standard.

L’utilisation d’un programme d’exemple permet d’avoir une structure de base du programme. Celui-ci ressemble à cela :

#include "mbed.h"

DigitalOut  myled(LED1);

int main(){
    while(1){
        myled = 1;   // LED is ON
        wait(0.2);   // 200 ms
        myled = 0;   // LED is OFF
        wait(1.0);   // 1 s
    }
}

Un peu de “décorations” pour s’y retrouver…

Très rapidement, afin d’éviter de vous y perdre dans toutes les zones possibles de ce code, vous serez amenés à commenter votre code. Un exemple complet de code commenté, délimitant les diverses zones est donné ici :

/* 
 *   Programme de test
 *  	Auteur : J. VILLEMEJANE / Sept 2017 / IOGS
 *  	From : MBED Example / Blinky LED
 */

/* Déclaration des ressources externes */
#include "mbed.h"

/* Déclaration des variables globales */

/* Déclaration des entrées/sorties */
DigitalOut  myled(LED1);

/* Fonction principale */
int main(){
    /* Zone d'initialisation */

    /* Boucle infinie */
    while(1){
        myled = 1;   // LED is ON
        wait(0.2);   // 200 ms
        myled = 0;   // LED is OFF
        wait(1.0);   // 1 s
    }
}

Tutoriel lié

MInE Prototyper Prototyper avec Nucleo et MBED

Nucleo – Tester ma première application