NUCLEO-L476RG e display SPI ILI9341

In questo articolo vedremo come far funzionare un display basato su integrato ILI9341 e collegato tramite interfaccia SPI ad una scheda STM32 Nucleo-L476RG. Quanto descritto è semplicemente fruibile anche per i possessori di altre schede Nucleo come, ad esempio, la F401RE.

Iniziamo creando un progetto STM32

Dare un nome al progetto

Confermare l’impostazione predefinita delle periferiche

Vogliamo collegare il display alla SPI1 ma, come si vede nello screenshot seguente, la porta non è disponibile

Come spiega il pop up, PA5 è in uso come uscita GPIO. In particolare vediamo come a PA5 vi sia collegato il LED VERDE

A questo punto, per rendere disponibile PA5, ne ripristiniamo lo stato (Reset_State)

La SPI1 diventa ora disponibile e possiamo abilitarla

Come si vede i pin interessati sono: PA5 – clock, PA6 – MISO e PA7 – MOSI. Individuiamoli sul connettore CN5

Colleghiamoli ai ripettivi contatti sul display LCD scelto. A tal proposito indico alcuni LCD da me testati:

https://www.adafruit.com/product/1743

http://www.hiletgo.com/ProductDetail/2157216.html

L’alimentazione da 3.3V è prelevabile dal connettore CN6

Aggiungiamo ora il pacchetto per la gestione del display

Selezionare X-CUBE-DISPLAY, Board Part DISPLAY, LCD, ILI9341 e nella colonna Selection scegliere SPI

Tornati alla schermata Pinout & Configuration, nella categoria Middleware, selezionare ed abilitare X-CUBE-DISPLAY

Si vede come vadano definiti anche tre pin per i segnali LCD RESET, LCD CS e LCD DCX

Per convenienza e disponibilità sul connettore CN5 useremo i pin PB6, PC7 e PA9 assegnandovi le opportune etichette

Andiamo quindi ad assegnare i pin alla relative funzioni nel Middleware X-CUBE-DISPLAY Platform Settings

Impostiamo ora i parametri di comunicazione della SPI adatti al controller ILI9341

A questo punto salvare e generare il codice.

Per scoprire le funzioni a disposizione per la gestione del display, apriamo il file DISPLAY/Target/lcd_io.h

Inseriamo le righe di codice come da figura per vedere se la comunicazione con il display funziona

Mettendo dei breakpoint e lanciando il debug è possibile vedere come le variabili LCD_width e LCD_height vadano ad acquisire i valori letti dal display; controllare la loro correttezza

Più significativo è ora visualizzare un’immagine sul display. Scegliete un’immagine non troppo grande (vedi le dimensioni della memoria della Nucleo) ricordando che la codifica è RGB565, cioè due byte per pixel.

Convertiamo ora l’immagine in un array C da inserire nel programma. Per questa operazione sfruttiamo dei servizi online

Compilare il form e premere Convert per ottenere un file sorgente C scaricato (nel mio caso il file si chiama cat_180x101.c)

Aprire il file in un editor ed individuare l’array dell’immagine, che nel mio caso si chiama cat_180x101_map

Copiare l’array nel file main.c del progetto, sezione /* USER CODE 1 */, definendolo unicamente come uint8_t

Nota: l’ultima parte dell’array originale individuata con il commento /*alpha channel*/ va rimossa

Per finire, inseriamo il codice come mostrato in figura nella sezione /* USER CODE 2 */ del main.c

Da 0 a PING con STM32H723ZG

Questo articolo spiega passo passo come configurare l’interfaccia ethernet di una scheda nucleo-h723zg partendo dalla sola preimpostazione che l’ambiente stm32cubeide (versione 1.13.1) offre in fase di creazione di un nuovo progetto.

Iniziamo dunque aprendo STM32CubeIDE e creando un nuovo progetto

Nella schermata successiva selezioneremo la scheda in uso, cioè la NUCLEO-H723ZG

A questo punto assegnare un nome al progetto e premere FINISH

Alla prossima finestra confermare la configurazione di default della scheda

Nel pannello “Pinout & Configuration”, “Categories”, “System Core”, impostare “Cortex_M7” come segue

Impostare poi le prime tre aree della MPU nel seguente modo e lasciare le altre disabilitate

Nel pannello “Pinout & Configuration”, “Categories”, “Eth”, pannello “Parameter Settings”, mettere

Nel pannello “Pinout & Configuration”, “Categories”, “Middleware”, selezionare “LWIP” ed impostare “General Settings” come segue

Ora selezionare “Platform Settings” ed il driver “LAN8742”

A questo punto passare a “Key Options” ed impostare come segue

Con le impostazioni dal pannello “Pinout & Configuration” abbiamo finito e passiamo alle integrazioni nel codice C. Di seguito le modifiche da apportare al file STM32H723ZGTX_FLASH.ld

ed al file LWIP/Target/ethernetif.c

Nel ciclo while(1) del sorgente main.c inserire la chiamata MX_LWIP_Process()

Il sistema è ora pronto per rispondere al ping

Per la produzione di questo tutorial ho utilizzato le informazioni contenute nei seguenti riferimenti:

How to create project for STM32H7 with Ethernet an… – STMicroelectronics Community