Pantalla ST7735 con panel táctil en F411CE
Es posible conectar otro tipo de pantallas con chips como el ST7735 en la variante F411CE, utilizando las librerías mas recientes de adafruit. Con lo aprendido en la librería GD23ZUTX, creo que es posible utilizar la librería SdFat V2 para el manejo de archivos de imagen.
Bueno lo primero, el TFT ST7735 que vamos a instalar es este:
El pinout del TFT lo vamos a conectar de esta forma:

Para evitar algún fallo, sugiero conectar cada unión con hilos individuales soldados entre un cabezal hembra de 6 pines dobles y a cada pin del zócalo del MCU.

Estas son las líneas para el encabezado de configuración:
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library for ST7735
#include <SPI.h>
#define TFT_CS PA4//10
#define TFT_RST PA0//8
#define TFT_DC PA1//9
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
¡Funciona!

La pantalla y el panel táctil están conectados al bus SPI 1. Podemos utilizar la librería XPT2046_Touchscreen, comentando las líneas que llaman a la función attachInterrupt, dentro del archivo ccp. La forma de usar esa función en STM32 es diferente a como se utiliza en ARM o AVR. No obstante, creo que aun podemos usar sin problemas esta librería sin recurrir al uso de interrupciones.
El lector externo está ya conectado en el bus SPI2, así que podemos aprovecharlo para ver si funciona para cargar imágenes bmp en la memoria de la F411CE. Podemos partir de las líneas que se utilizaron en GD23ZUTX, agregándolas en el encabezado
#include <SdFat.h>
#define SD_CS PB12
#define SetSDSpeed 36
static SPIClass SPI_2(SPI2, PB15, PB14, PB13);
#define SD_CONFIG SdSpiConfig(SD_CS, DEDICATED_SPI, SD_SCK_MHZ(SetSDSpeed), &SPI_2)
SdFs SD;
En el setup, podemos iniciar el lector externo con esta línea:
SD.begin(SD_CONFIG);
En la red hay varias modificaciones de la función bmpDraw, que dependiendo de las modificaciones en la librería Adafruit_GFX utilizan ya sea writeRect o pushColor o alguna combinación entre ellas y alguna matriz para almacenar los patrones de colores RGB. La función pushColor se quedó solo como un comentario en la libreria GFX:
// displays supporting setAddrWindow() and pushColors()), but haven't
// implemented this yet.
En la versión mas reciente de la librería GFX, podemos usar writeRect, ya que es la que está definida, con ella podemos intentar leer las líneas del archivo de imagen para reconstruirla en la memoria de la pantalla, quizás no obtengamos una buena velocidad pero es posible que las optimizaciones de la librería SdFat V2 nos den un impulso extra.
Adjunto el ejemplo para poder verificar el funcionamiento del TFT-ST7735, el panel touch XPT2046 y el lector externo.
F411CE_ST7735_Test.zip (207.3 KB)
El panel táctil también funciona y la carga de imágenes, usando la writeRect dentro de bmpDraw, tal parece que si funciona!!!
Para poder inicializar el TFT, el panel táctil y el lector microSD el encabezado y el setup quedó así:
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library for ST7735
#include <SPI.h>
#include <SdFat.h>
#include <XPT2046_Touchscreen.h>
#define CS_PIN PA2 //touch
#define TFT_CS PA4//10
#define TFT_RST PA0//8
#define TFT_DC PA1//9
XPT2046_Touchscreen ts(CS_PIN);
#define TIRQ_PIN PA3//2
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
#define SD_CS PB12
#define SetSDSpeed 36
static SPIClass SPI_2(SPI2, PB15, PB14, PB13);
#define SD_CONFIG SdSpiConfig(SD_CS, DEDICATED_SPI, SD_SCK_MHZ(SetSDSpeed), &SPI_2)
SdFs SD;
int x=0, y=0, Rotacion=3;
char PXY[40];
boolean wastouched = true;
boolean istouched = false;
void setup() {
SD.begin(SD_CONFIG);
tft.initR(INITR_BLACKTAB);
tft.setRotation(Rotacion);
tft.fillScreen(ST77XX_BLACK);
bmpDraw("tiger.bmp", 0, 0);
ts.begin();
ts.setRotation(Rotacion);
}
La calibración táctil con esta librería depende de la rotación de la pantalla, debe ser igual a la rotación del panel táctil. Las coordenadas que se obtienen con la librería no pueden usarse directamente para calcular los pares (x,y), ya que son datos de resistencia eléctrica, que varia según el lugar que se presione en el panel táctil.
Los pares (p.x, p.y) deben ser convertidos a (x,y) mediante dos funciones de mapeo que vinculen la superficie de la pantalla con cada resistencia eléctrica.
Para obtener los valores máximo y mínimo en cada dirección, se debe obtener un promedio de los datos obtenidos en cada esquina del panel táctil, luego con ellos podemos usar la función map para poder relacionarla con los pixeles que tiene la pantalla. En este caso las dos funciones de mapeo que he podido conseguir son:
x = map (p.x, 201, 3950, 0, 160);
y = map (p.y, 3850, 340, 0, 128); //ST7735 1.8", rotación 1