• Non ci sono risultati.

5.2 Software

5.2.1 STM32 CubeMX

Il STM32 CubeMX è un software freeware basato sull'ambiente di svilup- po Java e liberamente scaricabile online. Il software permette di generare in maniera automatica il codice C per ogni scheda di sviluppo Nucleo, con un'ampia personalizzazione. Si passa infatti dal generare codice di inizializza- zione per le periferiche della scheda che si desidera utilizzare, all'installazione di un vero e proprio sistema operativo in tempo reale open-source, il FreeR- TOS per chi ha necessità di un lesystem, algoritmi di scheduling e primitive semaforiche.

Una volta lanciato il CubeMX, nella prima schermata verrà richiesto di selezionare il processore o la scheda di sviluppo per la quale si vuole generare il codice. Fatto ciò, attraverso una interfaccia graca è possibile selezionare e congurare i componenti desiderati.

Figura 5.5: Schermata iniziale del STM32 Cube MX.

Nella prima scheda "Pinout & Conguration" mostrata in gura 5.5, nel menù a tendina di sinistra "Connectivity", abbiamo selezionato uno dei due bus I2C e una delle due porte USART. Dopo ogni aggiunta, il software

assegnerà i pin richiesti dal componente ad alcuni dei pin liberi sulla scheda. Nel riquadro di destra invece si possono modicare in maniera graca le scelte automatiche nell'assegnazione dei pin con un certo margine di libertà. Non è possibile ovviamente collegare qualunque bus a qualunque pin. Nel manuale [25] sono riportate in dettaglio tutte le possibili associazioni e una vista schematica (g. 5.6) per risalire ai terminali sici a cui collegare gli input e output della nostra scheda, a partire dalle etichette utilizzate dal CubeMX.

Figura 5.6: Rappresentazione schematica dei collegamenti sici dei pin esterni con le etichette usate dal CubeMX.

per i dati. Il CubeMX posiziona questi due collegamenti rispettivamente sui pin PB6 e PB7. Dalla gura 5.6 si vede che questi corrispondono al pin numero 17 del connettore STmorpho destro e al pin numero 21 del connet- tore sinistro. Su questi due pin abbiamo collegato la scheda di debug su cui abbiamo testato le funzioni di lettura e scrittura attraverso il bus I2C.

Anche l'utilizzo della USART richiede due connessioni: USART_TX per la trasmissione e USART_RX per la ricezione. Il CubeMX assegna questi due collegamenti rispettivamente ai pin PA2 e PA3, che dalla gura 5.6 si vede corrispondono ai pin 35 e 36 sul connettore STmorpho di destra. In realtà collegando il pc via USB questi canali di comunicazione sono già mappati su quel bus.

Una volta selezionati tutti i componenti necessari, nella seconda scheda "Clock Conguration" è possibile impostare alcuni registri dei generatori di clock. Operando su divisioni del periodo e su dei multiplexer è possibile mani- polare le frequenze di clock di alcuni componenti della scheda, ma per questo progetto non è stato necessario intervenire su questa specica di design.

Nella terza scheda "Project Menager" possiamo scegliere il nome del pro- getto contente tutti i le con i codici di inizializzazione, e altri parametri,

come la toolchain da utilizzare per la generazione del codice (nel nostro caso SW4STM32).

Per concludere non resta che cliccare su "Generate Code". L'applicazione genererà una cartella con all'interno tutti i le sorgenti per l'inizializzazione delle periferiche e i parametri per la loro congurazione. Il software aggiun- gerà alla cartella di progetto anche una parte delle librerie HAL e LL, con le funzioni atte ad interfacciarsi con i componenti abilitati. Sarà generato inne anche un le main.c in cui l'utente potrà aggiungere il suo codice specico. Il software generato è distribuito sotto la clausola 3 della licenza BSD, ed è quindi adatto sia per applicazioni commerciali che per sviluppi di applica- zioni open-source. A questo punto l'utente può iniziare a personalizzare il software in base alle sue esigenze.

Una delle caratteristiche più interessanti del CubeMX è che successive modiche fatte al progetto utilizzando l'interfaccia graca, permetteranno l'aggiornamento di questi le soltanto nella parte riguardante l'inizializza- zione e congurazione, senza modicare la parte di software già scritta dal- l'utente. Per spiegare come avviene questo, riportiamo di seguito a titolo di esempio le prime righe del main.c, a cui abbiamo aggiunto due librerie "string.h" e "stdlib.h" e due denizioni necessarie al nostro progetto:

/* USER CODE BEGIN Header */ /* USER CODE END Header */

/* Includes ---*/ #include "main.h"

/* Private includes ---*/ /* USER CODE BEGIN Includes */

#include "string.h" #include "stdlib.h"

/* USER CODE END Includes */

/* Private typedef ---*/ /* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ---*/ /* USER CODE BEGIN PD */

#define DIM_R_BUFFER 50 #define DIM_KEY 10 /* USER CODE END PD */

Parte della portabilità del codice dipende proprio dalla struttura base del main.c. Il CubeMX utilizza infatti i commenti all'interno del le sorgente C per dividere il le in aree in cui all'utente è permesso aggiungere codice, da aree in cui questo è fortemente sconsigliato, pena la cancellazione di quelle righe al successivo aggiornamento.

Se aggiungiamo il nostro codice esclusivamente nelle varie aree lasciate libere tra i tag /* USER CODE BEGIN xxx */ e /* USER CODE END xxx*/, anche se avremo bisogno in futuro di modicare la congurazione della scheda e di riscrivere quindi il codice di inizializzazione, sarà possibile aggiornare direttamente il progetto attraverso il CubeMX. Grazie a questa sintassi, nella generazione del nuovo codice, il CubeMX non interferirà col codice utente già scritto in precedenza negli spazi appositi.

Durante la stesura del codice per comodità ho inserito le librerie string.h e stdlib.h. Com'è noto, vanno aggiunte col comando #include prima del main(). Per mantenere la compatibilità futura del codice però sono stati inseriti nell'area indicata dai commenti come "private includes - user code begin include". Allo stesso modo i due #dene hanno una loro area specica indicata come "private dene - user code begin PD". Il resto del main è riportato per completezza in Appendice A.

Un ulteriore passo per garantire portabilità è quello di utilizzare funzioni presenti nella libreria HAL ogni qualvolta ci si vuole interfacciare con un componente della scheda. Anziché scrivere delle funzioni da zero, che di- penderanno dal tipo di dispositivo, le HAL orono una interfaccia comune a tutte le schede. Nel caso in cui si deciderà di cambiare la scheda in favo- re di una più adatta alle proprie esigenze, anche se la nuova scheda ha una periferica diversa, il CubeMX aggiornerà la libreria per la nuova scheda, ma l'"abstraction layer", ovvero la sintassi delle funzioni, sarà lo stesso.

Se non utilizziamo le HAL ma scriviamo una libreria di comunicazione personalizzata, questa sarà inevitabilmente dipendente dalle proprietà della USART della scheda che stiamo programmando.

In questo lavoro ad esempio, durante lo sviluppo delle funzioni di comu- nicazione USART, è stato deciso di passare da un sistema di comunicazione in polling ad uno ad interrupt. L'aver utilizzato le librerie HAL e aver ri- spettato la formattazione del codice ha permesso l'aggiornamento del codice abilitando la tabella NVIC degli interrupt attraverso il CubeMX, senza aver

dovuto riscrivere nulla tranne ovviamente la funzione di callback dell'inter- rupt per l'acquisizione dei dati. In futuro, se sarà necessaria una maggiore potenza di calcolo, si potrà riadattare il sistema operativo a qualunque scheda semplicemente aggiornando i le di progetto attraverso il CubeMX.

Documenti correlati