Corso Embedded ARM: le interfacce seriali e gli interrupt

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.

SERCOM1

Figura 1: Il modulo di comunicazione seriale SERCOM

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 driver.c e contengono funzioni di interfaccia a basso livello con i registri delle periferiche, specifiche di una particolare famiglia di device;
  • 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.
  • 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).

CMSIS__

Figura 2: architettura del framework ASF

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).

wizard

Figura 3: l'ASF Wizard ci consente di importare i moduli necessari per il progetto

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 PREMIUM. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici PREMIUM e potrai fare il download (PDF) dell'EOS-Book e Firmware del mese. ABBONATI ORA con PAYPAL è semplice e sicuro.

Abbonati alle riviste di elettronica

7 Commenti

  1. Maurizio Di Paolo Emilio Maurizio Di Paolo Emilio 3 febbraio 2017
  2. enzo1965 3 febbraio 2017
    • Maurizio Di Paolo Emilio Maurizio Di Paolo Emilio 3 febbraio 2017
    • Luca Davidian 15 febbraio 2017
  3. enzo1965 4 febbraio 2017
  4. enzo1965 15 febbraio 2017
  5. Mattia.Dell'Oca 4 marzo 2017

Scrivi un commento

ESPertino è la nuova scheda per IoT compatibile ARDUINO.
Scopri come averla GRATIS!