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

















