NOWAE

Our ideas, your fun!

libohiboard: come iniziare



Guardando la pagina dei progetti del nostro sito, ad oggi sono presenti solo progetti hardware, ma ben presto arriveranno anche progetti a microcontrollore. Tutti i nostri firmware sono basati su una libreria open-source made in Italy: la libohiboard.
La libohiboard è un framework di librerie scritte in C in grado di ridurre drasticamente la quantità di codice necessaria per iniziare a sviluppare su microcontrollori Kinetis della NXP (ex Freescale). La libohiboard è un progetto dell'Associazione Culturale OHILAB che nasce nel 2013 come framework di supporto all'OHIBoard (un altro progetto dell'Associazione) basata su microcontrollore K60. Da allora è stata estesa a moltissimi microcontrollori (dal KL25, al K64 al KV46) e sono state implementate tantissime periferiche. La libreria, pur essendo scritta per ambienti professionali, è di facilissimo utilizzo ma ha una piccola barriera di ingresso: il set-up dell'ambiente di sviluppo! In questo articolo vedremo come configurare l’IDE per iniziare a sviluppare i nostri progetti.

L'ambiente di sviluppo

La NXP mette a disposizione un ambiente di sviluppo molto potente e versatile: il Kinetis Design Studio, o anche conosciuto come KDS. L'IDE di casa NXP è basato su eclipse, un ambiente di sviluppo integrato multi-linguaggio e multipiattaforma nato per la programmazione Java. Il software, giunto alla versione 3.2.0, è gratuitamente scaricabile dal sito NXP, previa registrazione, al seguente link, ed è multipiattaforma, infatti è usabile su Windows, OSX e Linux.
Nel mese di Marzo NXP ha presentato il nuovo ambiente di sviluppo, sempre basato su eclipse, per microcontrollori ARM Cortex-M sia Kinetis (ex Frescale) che LPC: MCUXpresso. Non abbiamo ancora avuto modo di provarlo in maniera approfondita, ma appena avremo eseguito qualche test più a fondo pubblicheremo una recensione.

Un nuovo progetto

Per iniziare un nuovo progetto, è necessario essere consapevoli di quale microcontrollore si vuole utilizzare, infatti la prima domanda che l'IDE ci porrà è il tipo di microcontrollore. Attualmente la libreria supporta le seguenti famiglie di microcontrollori:

  • KL15Z4,
  • KL25Z4,
  • K10DZ10/K10D10,
  • K64F12,
  • KV46F.
Per creare un nuovo progetto, cliccare su File » New » Kinetis SDK 1.x Project. Seguendo le varie finestre che si susseguono si potrà scegliere il nome del progetto, il tipo di microcontrollore che si vuole utilizzare ed altre opzioni che in questo caso non ci servono. Le figure sotto mostrano proprio questo procedimento!
Figura: Iniziare un nuovo progetto
Figura: Il nome del nuovo progetto
Figura: La selezione del microcontrollore
Figura: Altre configurazioni
Figura: Il workspace aggiornato con il nuovo progetto

Importare la libohiboard

Una volta creato il progetto all'interno dell'ambiente di sviluppo è possibile includere la libohiboard. La libreria è scaricabile direttamente da GitHub al seguente link cliccando su download, come mostrato nell'immagine. Ultimato il download, estrarre la cartella all'interno della cartella Sources del progetto con il nome libohiboard. Tornando nell'IDE, cliccando sul nome del progetto e premendo F5 sulla tastiera, il progetto viene aggiornato e nell'albero dei file dovrebbe apparire la cartella libohiboard con tutto il suo contenuto.

Figura: Dove scaricare la libohiboard
Figura: Il workspace aggiornato con la libohiboard

A questo punto è necessario indicare al compilatore la presenza della libreria. Tasto destro sul nome del progetto, Properties » C/C++ General » Paths & Symbols; all'interno del tab Includes è necessario aggiungere il percorso alla cartella “include” della libohiboard.

Figura: Come selezionare « Properties » del progetto
Figura: Il tab « Paths & Symbols »

Per far ciò, cliccare sul pulsante Add, nella finestra che viene aperta cliccare le opzioni Add to all configurations e Add to all languages e poi, usando il pulsante Workspace… selezionare la cartella desiderata all'interno del progetto appena creato, come mostrato in figura. Salvando la configurazione con Apply e cliccando su Ok le configurazioni diventano operative e la libohiboard è finalmente raggiungibile.

Figura: Come aggiungere l'indirizzo della libreria
Figura: Il tab « Paths & Symbols » aggiornato

Configurare la libreria

Il progetto è stato creato, la libreria è stata inserita, cosa manca? La libohiboard ha bisogno che vengano attivate alcune macro per decidere cosa usare nel progetto e quindi cosa compilare. Questo processo permette di risparmiare spazio all'interno della memoria del microcontrollore. Ritornando nella finestra Path & Symbols utilizzata prima, all'interno del tab Symbols dobbiamo innanzitutto selezionare il microcontrollore (eh si, oltre a selezionarlo quando creiamo il progetto, lo dobbiamo indicare anche alla libohiboard) inserendo la macro LIBOHIBOARD_KL25Z4, che indica proprio il microcontrollore scelto.

Figura: Aggiungere una nuova macro

Aggiunta questa prima macro, dobbiamo aggiungerne una per ogni periferica che vogliamo utilizzare, ad esempio:

  • LIBOHIBOARD_UART,
  • LIBOHIBOARD_SPI,
  • LIBOHIBOARD_IIC,
  • LIBOHIBOARD_PIT,
  • LIBOHIBOARD_DAC,
  • LIBOHIBOARD_ADC,
  • ...

A questo punto, la libohiboard è pronta e configurata per essere utilizzata.
Figura: Il tab « Paths & Symbols » nuovamente aggiornato

Configurare la libreria

È giunto finalmente il momento di scrivere le prime righe di codice! La prima operazione da fare è quella di inizializzare il clock generale del microcontrollore e di distribuirlo alle porte che gestiscono i pin. Un esempio è riportato sotto:

#include "libohiboard.h"

static int i = 0;

int main(void)
{
    Clock_Config clockConfig = 
    {
        .source = CLOCK_CRYSTAL,
        .fext = 8000000,
        .foutSys = 40000000,
        .busDivider = 2,
    };

    uint32_t foutBUS;
    uint32_t foutSYS;
    System_Errors errors = ERRORS_NO_ERROR;
    uint8_t index = 0;

    /* Enable clock gate for ports to enable pin routing */
    SIM_SCGC5 |= (
            SIM_SCGC5_PORTA_MASK |
            SIM_SCGC5_PORTB_MASK |
            SIM_SCGC5_PORTC_MASK |
            SIM_SCGC5_PORTD_MASK |
            SIM_SCGC5_PORTE_MASK);

    errors = Clock_setDividers(clockConfig.busDivider, 0,0);
    errors = Clock_Init(&clockConfig);
    foutSYS = Clock_getFrequency(CLOCK_SYSTEM);
    foutBUS = Clock_getFrequency(CLOCK_BUS);

    for (;;)
    {
        i++;
    }
    /* Never leave main */
    return 0;
}
                            

Analiziamo il codice. Alla riga 1 viene inclusa la libreria in modo tale che sia utilizzabile all'interno del progetto (anche se in futuro vedremo che è meglio includerla in un file .h più generico). La variabile clockConfig indica il tipo di clock che vogliamo usi il microcontrollore, in particolare stiamo dicendo che esternamente abbiamo un quarzo da 8MHz, mentre vogliamo come clock interno 40MHz. Alla riga 21 invece, viene fatto in modo che tutti i pin di tutte le porte del microcontrollore siano abilitate. Subito sotto facciamo in modo che la varibile clockConfig, definita prima, venga passata alle funzioni della libreria preposte a configurare il clock. A questo punto il microcontrollore è pronto: possiamo iniziazzare le periferiche prima del for e poi scrivere la nostra applicazione al suo interno!
Siete finalmente pronti! Ora potete iniziare a scrivere codice utilizzando la libohiboard!