domenica , 13 Ottobre 2019
iten
Home » Elettronica » Come utilizzare la seriale di una scheda STM32 Nucleo

Come utilizzare la seriale di una scheda STM32 Nucleo

Come vi ho detto nei precedenti tutorial su questa nuova scheda di sviluppo di ST, la STM32 Nucleo fornisce un debugger integrato ST Link, nella versione 2.1. L'ST Link è principalmente sviluppato per poter eseguire operazioni di debugging del micro target della nostra scheda (sia essa stessa la Nucleo o un'altra scheda che stiamo realizzando). Tuttavia, l'ST Link integrata ci fornisce almeno un'altra feature interessante: una porta seriale virtuale.
Quando si installano i driver ST Link, una nuova periferica appare nella lista dei dispositivi installati nel sistema: l'ST-Link Virtual COM port.

2015-01-24 08_38_11-Device Manager

Nel caso in cui state adoperando un PC Linux o un Mac, la seriale vi sarà mappata nella directory /dev. Tipicamente, il sistema operativo assegnerà al dispositivo un nome del tipo tty.usbmodemXXXX, come mostrato nell'immagine sotto.

Schermata 2015-01-24 alle 08.40.43La porta seriale può tornare utile per almeno due ragioni: per stampare messaggi che ci aiutano a capire lo stato di esecuzione del firmware durante il debugging (non strettamente necessario, in realtà, dato che è possibile adoperare l'ARM semihosting) o per scambiare messaggi tra la scheda Nucleo e il PC magari tramite un'applicazione dedicata sviluppata ad hoc. In quest'articolo vi mostrerò come correttamente programmare l'UART del micro target STM32 collegata all'interfaccia ST-Link integrata. Tuttavia, prima di cominciare a scrivere il codice vero e proprio, è utile dare uno sguardo al progetto hardware della scheda. L'ST, infatti, fornisce il progetto hardware completo della Nucleo (la board è sviluppata adoperando Altium Designer, un CAD professionale adoperato nell'industria elettronica, ma non è richiesto avere un oggetto così costoso per analizzare gli schemi hardware). In questo tutorial assumerò l'uso del modello STM32Nucleo-F401RE, ma dovrebbe essere molto semplice adattare il codice al proprio modello (la parte Hardware è identica a tutte le Nucleo).

Primo passaggio: il corretto pinout

Un microcontrollore complesso ma allo stesso tempo flessibile come l'STM32 ha la maggior parte dei pin di I/O che possono fornire differenti funzionalità. Questo significa che prima di poter adoperare una periferica (nel nostro caso la USART) è necessario configurare i corrispondenti pin di I/O ad essa associati. Tramite il tool STM32CubeMX, possiamo scoprire che il micro STM32F401RETx ha tre differenti USART: USART1, USART2 and USART6.

2015-01-24 08_52_46-STM32CubeMX uart2.ioc_ STM32F401RETx Ora, per capire quale delle 3 sia collegata all'interfaccia ST Link, è necessario dare uno sguardo agli schemi hardware della Nucleo. Come è possibile vedere nell'immagine seguente, le porte USART_TX and USART_RX sono collegate rispettivamente ai pin PA2 e PA3. Questo significa che l'interfaccia ST Link è connessa alla periferica USART2 del microcontrollore.

stm32-nucleo-usart-pinout Ok. Abbiamo quindi le necessarie informazioni per cominciare a scrivere il codice.

Secondo passaggio: il codice

Il primo step per la parte di codice consiste nel generare un progetto scheletro adoperando il plug-in di Eclipse per GCC ARM, come mostrato nella serie sulla toolchain per STM32. Durante la generazione del progetto di test è possibile adoperare i seguenti parametri di configurazione:

Schermata 2015-01-24 alle 09.17.09Se avete seguito i tutorial precedenti, già sapere che il plugin GNU Eclipse genera una configurazione del clock non corretta per la board Nucleo-F4. Va, quindi, adoperato il tool STM32CubeMX. Per semplicità, questo è il codice che dovete sostituire all'interno del file _initialize_hardware.c.

Fatto ciò, possiamo creare una funzione ad hoc per la configurazione dell'interfaccia USART2. Chiamiamo questa funzione  MX_USART2_UART_Init, come mostrato nel seguito.

Il contenuto di questa funzione non richiede particolari spiegazioni. huart2 è un'istanza del descrittore UART_HandleTypeDef. È niente altro che una struct usata per configurare la periferica UART. Tuttavia, questa funzione da sola non è sufficiente per adoperare la seriale. Dobbiamo ancora configurare i pin corrispondenti all'UART. Questo lavoro è svolto da questa funzione hook:

Anche in questo caso il codice è molto semplice. Come prima cosa, dobbiamo inizializzare il clock associato alla PORTA e alla periferica UART. Poi, dobbiamo configurare i pin PIN2 e PIN3 rispettivamente come TX e RX della UART2. Un aspetto importante da sottolineare è che noi non dobbiamo invocare esplicitamente questa funzione. Come detto sopra, si tratta di una funzione hook che sarà chiamata automaticamente dalla funzione HAL_UART_Init(), che invochiamo all'interno della funzione  MX_USART2_UART_Init().  Il posto giusto per chiamare questa funzione di inizializzazione è all'interno della procedura __initialize_hardware() nel file  _initialize_hardware.c. Ok. Non ci resta che creare un semplice  main() di esempio per testare che tutto funzioni.

Il  main() è minimale: semplicemente stamperà un messaggio sulla seriale e entrerà in un loop infinito.

Prima di poter compilare il progetto, ci occorre un ultimo passaggio. Per default, il plug-in GNU ARM di Eclipse disabilita i file HAL non necessari, al fine di ridurre il tempo di compilazione. Per questo dobbiamo abilitare la compilazione del file stm32f4xx_hal_uart.c. Andiamo in Project Explorer->system->src->stm32f4-hal and e clicchiamo con il tasto destro del mouse sul file stm32f4xx_hal_uart.c , come mostrato nell'immagine seguente:

Schermata 02-2457080 alle 13.25.27 Clicchiamo su "Properties" e andiamo in  C/C++ Build ed eliminiamo la spunta dalla voce "Exclude from build", come mostrato sotto. Schermata 02-2457080 alle 14.10.44 Ok. Adesso possiamo compilare il firmware e caricarlo sulla nostra Nucleo usando GDB e OpenOCD. Per leggere i messaggi dalla seriale virtuale della nostra Nucleo ci occorrerà un terminale seriale, in base al sistema operativo che adoperiamo. Sul Marketplace di Eclipse ci sono alcuni terminali che si integrano nell'IDE. TCF è uno di questi. Un alternativa per Windows è rappresentata da putty. Su Mac e Linux ckermit è da preferire. Schermata 02-2457080 alle 15.08.19 Ho realizzato un progetto finito che mostra come utilizzare la seriale virtuale della Nucleo, che può essere scaricato dal mio repository github. In un prossimo articolo vi mostrerò come adoperare le altre due seriali. A presto 😉


Check Also

Compilare micropython per una scheda STM32Nucleo-F4

Chi mi conosce sa che il mio linguaggio di programmazione preferito è Python. Ho scritto …

3 comments

  1. Ho scoperto da un giorno questo sito e mi sono già letto tutti gli articoli.

    Complimenti all'Autore che riesce a coniugare concetti difficili ad una spiegazione semplice ed efficace, senza trascurare i dettagli.

    Bravo!

    Unica critica (bonaria) Scrivi più articoli!

  2. Ciao! Complimenti per tutti i tuoi tutorial, sono sempre di ispirazione!

    Bello il tuo esempio molto pratico, ma per la ricezione ci sai dire qualcosa di più? Sinceramente trovo il metodo receive delle librerie HAL un po difficoltoso da utilizzare.

    Ciao, continua così!!

     

  3. Ciao e grazie mille per le informazioni sul tuo sito, una vera ancora di salvezza per chi inizia a lavorare con questa eccellente piattafforma STM32.
    Vorrei chiederti una cosa: su alcuni tutorial ho sentito parlare di CDC Virtual Port (non veniva configurata la UART ma solo impostata l'USB): in ogni caso si utilizzavano o Discovery board F4 (con due porte USB, una per l'ST Link e una per la comunicazione) o le piccole STM32F103C8T6 (usando un ST Link esterno e comunicando con la micro USB a bordo). Dal momento che i miei tentativi di avere un output su terminale usando la CDC su una Nuleo STM32F446RE non hanno portato risultati, mi è stato suggerito che le schede Nucleo non possano usare l' USB come CDC USB. Sinceramente la cosa mi sembra strana, mi piacerebbe sapere se qualcuno può confermarmi questa ipotesi...
    Grazie ancora e un saluto a te e a tutti i lettori del blog!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.