Nel precedente articolo abbiamo introdotto l'ambiente ARM e il Cortex-M0+, il processore alla base del microcontrollore Atmel SAMD21, il cuore della scheda Arduino M0 PRO. In questa lezione cominceremo a programmare l'interfaccia seriale (o meglio, le interfacce seriali) e nel contempo esamineremo un po' più dettagliatamente la struttura del CMSIS e dell'ASF e approfondiremo l'architettura e le periferiche del core Cortex-Mo+. Tutto questo ci tornerà utile nel prosieguo del corso quando impiegheremo le nozioni acquisite nella realizzazione di un vero e proprio progetto.
L'interfaccia seriale: SERCOM
Generalmente i microcontrollori hanno moduli di comunicazione seriale separati, ognuno riservato ad una diversa periferica (USART, SPI, I2C) e con i propri registri e pin dedicati. Nei microcontrollori della famiglia SAMD tutte le periferiche sono comprese in unico modulo chiamato SERCOM (SERial COMmunication interface). Il SAMD21 dispone di 6 istanze del modulo SERCOM, da SERCOM0 a SERCOM5, ciascuna configurabile come USART, SPI o I2C, ognuna delle quali ha a disposizione 4 pad dal PAD[0] al PAD[3] per i segnali della periferica. La funzionalità di ogni pad è configurabile a seconda della modalità scelta e ogni pad può essere assegnato a diversi pin del microcontrollore, rendendo la gestione dei pin di interfaccia del modulo molto flessibile. La struttura del modulo SERCOM è riportata nella figura 1.
In questa lezione utilizzeremo il modulo SERCOM nella sua configurazione come USART (Universal Synchronous/Asynchronous Receiver Transmitter).
ASF: Driver,Service e Component
Creiamo un nuovo progetto all'interno di Atmel Studio e scegliamo "GCC C ASF Board Project" come template; dal menù successivo scegliamo il nostro device, ovvero il SAMD21G18a e come board indichiamo il template generico User board template (Arduino M0 PRO non è ancora tra le schede supportate dall'ASF) e clicchiamo ok. Dal Solution explorer sulla destra, all'interno della cartella src, possiamo osservare la struttura del nostro progetto: il main.c contiene ovviamente l'entry point della nostra applicazione e asf.h è l'header che viene incluso per avere a disposizione i moduli del framework che abbiamo scelto di utilizzare nel nostro progetto. Come visto nel precedente articolo, l'Atmel Software Framework è diviso in moduli di astrazione hardware, dal livello più basso a salire distinguiamo:
- i driver sono composti di driver.h e driver.c e contengono funzioni di interfaccia a basso livello con i registri delle periferiche, specifiche di una particolare famiglia di device;
- i servizi (services) sono dei moduli software che si interfacciano con i driver e espongono delle funzionalità di più alto livello, generalmente comuni a più device: ad esempio il modulo USART espone delle funzioni read e write per la trasmissione di caratteri, o il modulo delay fornisce routine per la generazione di ritardi arbitrari.
- i componenti (components) infine semplificano l'accesso a periferiche e componenti hardware esterni come memorie, display ecc.
L'ASF si poggia sul CMSIS, la cui struttura è stata analizzata nella prima lezione ed è utile avere uno schema di quella che è l'architettura completa del framework, ossia l'albero delle dipendenze e la suddivisione delle cartelle all'interno del progetto: nella figura 2 vengono mostrati solo alcuni dei file principali che compongono il progetto (dare un'occhiata all'interno della cartella src nel progetto è utile per avere un'idea chiara delle dipendenze).
Il file asf.h è l'unico header che ci dobbiamo preoccupare di includere nel nostro progetto; questo a sua volta si occuperà di includere tutte le dipendenze necessarie a seconda dei moduli che verranno inclusi nel progetto. Per poter utilizzare le funzionalità di un modulo o periferica infatti è necessario includere nel progetto il corrispettivo modulo software fornito con l'ASF. Per fare ciò Atmel Studio mette a disposizione l'ASF Wizard sotto "ASF->ASF Wizard...". Per questa lezione è necessario includere il modulo SERCOM USART - polled (driver) e le routine di delay - cycle (service): basta scrivere il nome del driver o del servizio nella casella di ricerca e selezionare "add"; quando tutti i moduli sono stati aggiunti selezionare "apply" e cliccare su ok quando il wizard ci presenterà il riassunto dei file aggiunti o rimossi nel progetto (figura 3).
Adesso abbiamo tutti gli strumenti necessari a scrivere velocemente il codice della nostra applicazione. Per prima cosa andiamo sotto "Tools->Extensions and updates..." e installiamo il plug-in "Terminal for Atmel Studio", che ci consentirà di aprire un monitor seriale comodamente all'interno dell'IDE. Lo scopo di questa lezione è utilizzare l'interfaccia USART dell'Arduino per ricevere e trasmettere [...]
ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 3162 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.
Gli Interrupt rappresentano una chiave per il design a basso consumo, dove il core da modalità sleep passa a quella attiva (in seguito a eventi di interrupt), svolgendo determinate operazioni.
Anche sul core Cortex-M3, il Vectored Interrupt NVIC permette al nucleo di configurare la gestione degli interrupt.
Volendo passare ad un arduino a 32 bit è consigliabile la arduino due o la M0 pro??
Gli argomenti trattati in questo corso, sono applicabili ad arduino due?
Gli argomenti sono relativi ad arduino m0 pro, personalmente ti consiglio appunto questo con il suo debug. Ti suggerisco alcuni link di interesse http://it.emcelettronica.com/quale-scheda-arduino-scegliere-per-il-mio-progetto e http://it.emcelettronica.com/arduino-zero-pro-presentazione-e-specifiche-tecniche
Arduino M0 PRO ha sulla board un SAMD21G18A, un microcontrollore basato sul processore ARM Cortex-M0+ (una variante low power del M0). Arduino DUE è un SAM3X8E ed è basato sul Cortex-M3 (un processore per microcontrollori della serie Cortex ma con più features). I due processori sono retrocompatibili (l’M3 può essere programmato come un M0+) per quanto riguarda il core (le periferiche comuni a tutti i processori del profilo Cortex) ma cambia il microcontrollore intorno ad esso e quindi le periferiche: per avere una idea più chiara di come adattare (il termine adatto è “portare”, dall’inglese “porting”) un progetto da un micro all’altro (si legga anche la sezione sul CMSIS) legga il primo articolo della serie. Per seguire queste lezioni le consiglio comunque di utilizzare l’ARDUINO M0 PRO e ssendo il codice scritto apposta per il SAMD21G18A.
Grazie Maurizio.
Molto chiaro, grazie.
Ottimo articolo! Molto comprensibile anche per chi non ha mai approfondito la programmazione a basso livello! Grazie mille.