Lampeggio del LED della scheda NucleoF401RE

Blink LED

CC BY-SA 4.0 https://creativecommons.org/licenses/by-sa/4.0/

 

Workspace: Getting-started-with-NUCLEO-F401RE-and-mbedOS
Progetto: stm32nucleof401re_00_blinkled
Materiale: NucleoF401RE - Cavo micro USB

Il primo esempio è un progetto di tipo “Hello world”. Implementando un semplice codice che fa lampeggiare il LED utente montato sulla scheda STM32 NucleoF401RE, avremo modo di provare la prima compilazione e la programmazione della scheda. Utilizziamo la toolchain già vista qui.

Apriamo il progetto con un doppio click

 

Il progetto contiene la cartella con il codice sorgente mbed-os ed il file main.cpp, il nostro file entry-point

 

 

Con un doppio click sul file main.cpp, lo apriamo nell’area centrale della interfaccia grafica di Eclipse, mostrando il codice al suo interno .

I nostri progetti utilizzano mbed-OS, pertanto la prima istruzione servirà ad informare il software della toolchain che dovrà per primo processare il codice, che intendiamo utilizzare altro codice di libreria, ossia già scritto ed accessibile. Lo facciamo con la seguente direttiva che include la libreria mbed.

#include "mbed.h"

In C, come in C++, il software che per primo processerà il codice sorgente, è il pre-processore. Questo analizza tutte le “direttive”, ossia le istruzioni a lui indirizzate e che iniziano con il carattere “#”.

L’utilizzo della mbed-cli nella nostra toolchain, ci semplifica ulteriormente le cose, perché non dovremo specificare il path delle librerie, ma sarà questa ad eseguire una scansione della cartella di progetto per individuare le librerie, prima di invocare il compilatore.

Prima di arrivare all’entry-point del codice, ossia la prima istruzione operativa, troviamo la dichiarazione delle variabili globali, ossia quelle con scope globale, visibili in tutto il codice.

DigitalOut myled(LED1);

Questa istruzione è una particolare dichiarazione di variabile, in quanto non resta confinata nel codice, ma lega una variabile all’hardware, ed in particolare al LED disponibile all’utente.

Da questo momento in poi, qualsiasi variazione della variabile avrà un effetto nel mondo fisico. Questo è il modo in cui leghiamo il software ai sensori ed agli attuatori che collegheremo alla scheda Nucleo per realizzare il sistema basato su micro-controllore e che abbiamo in mente.

 

La variabile myled è di tipo DigitalOut, ed a seguito della sua dichiarazione, viene creata una istanza in memoria ed i suoi metodi (le sue funzionalità) sollecitabili.

mbed-OS fornisce il supporto di librerie per tutte le periferiche hardware del microcontrollore. La documentazione è disponibile qui.

L’entry point  e’ la funzione main

int main() {
    // Led blinking - The led is switched on and off
    while(1) {
        myled = 1; // The LED is ON
        wait(0.2); // Stop the program counter here and wait for 200 ms. In the meanwhile the led is on
        myled = 0; // Switch-off the LED
        wait(1.0); // Stop the program counter here and wait for 1 ms. In the meanwhile the led is off
    }
}

Trattandosi del codice di un microcontrollore, la funzione main non riceve parametri in ingresso.

All’interno della funzione, troviamo un ciclo infinito essendo la condizione sempre verificato.

 while(1)

Il ciclo infinito è fondamentale, non solo perché in questo esempio lo utilizzeremo per ottenere il lampeggio del LED, ma in generale perché in sua assenza, dopo l’ultima istruzione non ci sarebbe nulla da eseguire ed il programma terminerebbe fino al prossimo reset del micro-controllore  da parte dell’utente.

 

Il cuore del lampeggio è all’interno del ciclo infinito, dove alterniamo l’accensione e lo spegnimento del LED.

        myled = 1; // The LED is ON
        wait(0.2); // Stop the program counter here and wait for 200 ms. In the meanwhile the led is on
        myled = 0; // Switch-off the LED
        wait(1.0); // Stop the program counter here and wait for 1 ms. In the meanwhile the led is off

Ponendo la variabile myled ad 1 oppure a 0, otteniamo l’effetto rispettivamente di accendere e spegnere il LED, poiché queste istruzioni porranno ad una tensione di 3.3V ed a 0V rispettivamente, i morsetti del LED. Si può immaginare, non discostandosi molto dalla realtà, di poter controllare dal software la chiusura o l’apertura di un interruttore.

 

L’istruzione wait, riceve in ingresso un tempo espresso in secondi e blocca l’esecuzione del programma per il tempo indicato.

wait(1.0);

A questo punto possiamo passare alla compilazione con un click sull’icona che rappresenta un martello.  

Se tutto è andato a buon fine, otterremo nella console i seguenti messaggi, con indicato il path del file binario ottenuto dalla compilazione

 

 

Per programmare la scheda Nucleo, dopo averla connessa al PC via USB, copiare il file stm32nucleof401re_00_blinkled.bin nel drive NODE_F401RE

 

Al termine della programmazione vedremo il LED lampeggiare, restando accesso per 200ms e spento per 1s.