Scriviamo in un file su SDcard con la scheda NucleoF401RE

Scriviamo in un file su SDcard

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

Workspace: Getting-started-with-NUCLEO-F401RE-and-mbedOS
Progetto: stm32nucleof401re_04_sdcard
Materiale: Scheda NucleoF401RE - Cavo micro USB - Lettore SD card - SD card - cavi dupont

In questo progetto di esempio, vedremo come creare e scrivere in un file in una SDcard.

Utilizziamo la toolchain già vista qui. Apriamo il progetto con un doppio click.

Il progetto contiene la cartella con il codice sorgente mbed-os, il file main.cpp, il nostro file entry-point, ed una libreria aggiuntiva, SDBlockDevice per il supporto della scrittura e lettura dei dispositivi di memoria a blocchi.

 

Oltre ad includere la libreria mbed

#include "mbed.h"

dobbiamo includere altre librerie.

#include "SDBlockDevice.h"

Questa libreria gestisce le memorie a blocchi, si tratta dunque di un driver di basso livello.

Infine includiamo la libreria per il supporto del file system. Questa libreria appoggiandosi a quella di gestione dei dispositivi a blocchi, ci astrae da questi e ci fa gestire la SD attraverso un file system.

#include "FATFileSystem.h"

La libreria è contenuta nella cartella mbed-os, ma non viene inclusa da mbed.h e dunque va fatto in maniera esplicita.

A questo punto possiamo creare una istanza degli oggetti con scope globale.

Oltre a creare una istanza della seriale, che può essere utile per inviare messaggi sulla seriale (vedi esempio http://www.perlatecnica.it/tech/comunicazione-seriale-via-porta-usb/)

Serial pc(USBTX, USBRX);

creiamo una istanza di driver per la gestione dei dispositivi a blocchi

SDBlockDevice sd(D11, D12, D13, D10); //MOSI MISO SCK CS

Il lettore SD utilizza per la comunicazione il protocollo SPI, dobbiamo quindi passare, come parametri al costruttore, le etichette che puntano ai PIN sui quali andremo a connettere fisicamente il lettore. I quattro PIN che servono a questo tipo di connessione sono individuabili dalla serigrafia sulla scheda Nucleo, ma sono anche recuperabili a questo link

Infine ci serve il supporto per la gestione del file system. Creiamo quindi una istanza della classe FATFileSystem

FATFileSystem fs("fs");

Nella funzione entry-point main, come prima operazione “montiamo” la scheda SD.

fs.mount(&sd);

In questo modo stiamo sostanzialmente chiedendo al file system di appoggiarsi ad un dispositivo a blocchi instanziato. Lo facciamo passando come parametro del metodo mount offerto dalla classe FATFileSystem, il puntatore all’oggetto sd.

Creiamo un file dal nome “mbed.txt” con condizioni di accesso di scrittura “w” (write)

FILE *fd = fopen("/fs/mbed.txt", "w");

Controlliamo che la funzione fopen sia stata in grado di creare il file. Se tutto è andato a buon fine la funzione ci restituirà un puntatore non nullo, in caso contrario stampiamo un messaggio di errore sulla seriale

if(fd==NULL) {
    	// Something was wrong
  	pc.printf("Error occurs writing the SD!\r\n");
}
else {
        fprintf(fd, "Welcome SD!!\r\n");
        fclose(fd);
        pc.printf("It works!\r\n");
 }

Se il puntatore al file creato non è nullo, siamo quindi nel ‘else’, per scrivere il file, utilizziamo la funzione fprintf alla quale passiamo il puntatore al file ed il contenuto sotto forma di stringa che vogliamo scrivere nel file. Poi chiudiamo il file che avevamo aperto ed inviamo un messaggio di successo sulla seriale.

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

Se tutto è andato a buon fine, tra i messaggi nella console sarà 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_04_sdcard.bin, nel drive NODE_F401RE.

Per verificare il corretto funzionamento del programma, abbiamo bisogno di un client, ossia un software che eseguito sul PC sia in ascolto sulla seriale e mostri i messaggi ricevuti come visto nell’esempio sull’uso della seriale e di un lettore di SDcard che dovremo collegare alla scheda Nucleo, utilizzando i cavi dupont.

Sul lettore potremmo trovare la doppia piedinatura come in figura, ed entrambe potranno essere utilizzate indifferentemente.

Di tutti i PIN dovremo connettere il il pin di alimentazione (+5) con il pin 5V della Nucleo, ed il pin ground (GND) con il pin GND della scheda.

Fatto questo dovremo connettere i pin MOSI, MISO, SCK e CS con i rispettivi pin sulla scheda Nucleo, con la seguente corrispondenza:

  • CS – D10;
  • MOSI – D11;
  • MISO – D12;
  • SCK – D13

Una volta completato il collegamento, ed inserito una SDcard nel lettore, se abbiamo già programmato la scheda Nucleo, dovremo resettare la scheda premendo il pulsante nero.

A questo punto se tutto e’ andato a buon fine possiamo verificare la corretta creazione e scrittura del file nella SDcard, rimuovendola ed andando a leggere il contenuto della SD con un PC.

Ogni volta che resetteremo la Nucleo, premendo il pulsante nero, verrà creato il file mbed.txt e scritto il contenuto.