从零点亮 TFT 屏幕:TFT_eSPI 驱动库 4 步实战配置教程
【免费下载链接】TFT_eSPIArduino and PlatformIO IDE compatible TFT library optimised for the Raspberry Pi Pico (RP2040), STM32, ESP8266 and ESP32 that supports different driver chips项目地址: https://gitcode.com/GitHub_Trending/tf/TFT_eSPI
TFT_eSPI 是一款 Arduino 兼容的 TFT 屏幕驱动加图形库(当前版本 2.5.43),把 ILI9341、ST7735、ILI9488 等 16 款以上 TFT 屏和 ePaper 的驱动、图形、字体、触摸打包在一起。它解决的就是"给 ESP32、RP2040、STM32 接块 TFT 屏"这件事——接线、配置、画图一次搞定。本文面向第一次给开发板加屏幕的你,全部事实取自仓库内的配置头文件、示例和文档。
先搞清这三件事
| 关键事实 | 仓库依据 |
|---|---|
| 支持平台:ESP8266、ESP32、STM32、RP2040 有逐芯片优化代码,其余 Arduino 兼容板走通用实现(更慢,库大量使用 32 位变量) | README.txt |
| 最小硬件要求:硬件 SPI 至少 3 根 GPIO(MOSI/SCK/MISO)加 CS、DC、RST、电源,MISO 可不接 | User_Setup.h |
| 点亮流程:装库 → 选/改配置 → 接线 → 编译测试示例,共 4 步 | 下文"最短路径" |
最短路径点亮屏幕
第 1 步:把库放进工程
git clone https://gitcode.com/GitHub_Trending/tf/TFT_eSPI克隆完成后,把 TFT_eSPI 目录放进 Arduino IDE 的libraries文件夹,或在 PlatformIO 里作为库引入。这一步只负责"让编译器能找到库"。
第 2 步:选定一份与你硬件一致的配置
打开 User_Setup_Select.h,默认包含根目录的 User_Setup.h。如果硬件有现成预设,注释掉默认行、放开对应行即可,只留一行生效:
//#include <User_Setup.h> // Default setup is root library folder #include <User_Setups/Setup42_ILI9341_ESP32.h> // ESP32 + SPI ILI9341 240x320User_Setups/ 里有 80 多份预设(Setup1 到 Setup302),覆盖 M5Stack、TTGO T-Display、LilyGo、Nucleo 等常见板子。注意文件头部的警告:升级库会覆盖你改过的配置,改完记得自己留一份备份。
第 3 步:按接线图接屏
3.5 寸 RPi TFT V3.0(480x320,ILI9486)接到树莓派 GPIO 的官方接线图,DC/RST/CS 与 SPI 信号线一目了然;没装触摸屏时 T_CS 接 3.3V:
ESP32 这边以 UNO 引脚布局板为例,SPI 一排(SD2/SD3/CK/MOSI/CSSD1)在板边标注得很清楚,接屏前对一下丝印:

然后把 User_Setup 里的引脚宏改成你实际用的脚。以 ESP32 + ILI9341 为例:
#define TFT_MOSI 23 #define TFT_SCLK 18 #define TFT_CS 15 #define TFT_DC 2 #define TFT_RST 4引脚写错是黑屏的头号原因,改完这一步别急着编译,先对着实物数一遍线。
第 4 步:编译一个测试示例验证
打开 examples/ 里按分辨率分好的示例,先跑一个最简单的:
#include <TFT_eSPI.h> TFT_eSPI tft = TFT_eSPI(); void setup() { tft.init(); tft.fillScreen(TFT_RED); } void loop() {}或者直接用现成的TFT_Rainbow(160x128 / 320x240 / 480x320 各分辨率目录都有)。屏幕出颜色,说明库、配置、接线三者对齐了。
配置速查表
改配置时只动 User_Setup.h(或你选中的 User_Setups 预设),对照这张表即可,不用通读 300 多行注释:
| 配置项 | 所在文件 | 控制什么 | 怎么改 |
|---|---|---|---|
*_DRIVER(如ILI9341_DRIVER) | User_Setup.h 第 1 节 | 驱动芯片 | 只放开一行,其余全部注释 |
TFT_MOSI/SCLK/MISO/CS/DC/RST | 第 2 节 | SPI 接线 | 改成你的实际 GPIO;复位接板 RST 时写TFT_RST -1 |
TFT_BL+TFT_BACKLIGHT_ON | 第 2 节 | 背光控制 | 可选,begin()时自动开背光 |
TFT_WIDTH/TFT_HEIGHT | 第 1 节 | ST7735/ST7789/ILI9163/GC9A01 的像素尺寸 | 按屏幕规格写竖屏宽高 |
TFT_RGB_ORDER | 第 1 节 | ST7735/ST7789/ILI9341 红蓝顺序 | 红蓝反了就逐个试TFT_RGB/TFT_BGR |
TFT_INVERSION_ON/OFF | 第 1 节 | 显示反色 | 白显黑时两个选项逐个试 |
TFT_PARALLEL_8_BIT(16bit 仅 RP2040) | 第 1 节 | 并行接口 | 默认 SPI;并行屏放开并补 D0~D7、WR、RD 引脚 |
LOAD_GLCD/LOAD_FONT2/4/6/7/8/LOAD_GFXFF | 第 3 节 | 内置字体,全开约占 17KB FLASH | 注释不用的省 FLASH |
SMOOTH_FONT | 第 3 节 | 抗锯齿字体功能 | 不用就注释,省约 20KB FLASH |
SPI_FREQUENCY | 第 4 节 | SPI 时钟,决定渲染速度 | ILI9341 可 40MHz(80MHz 有时失败);ST7735 超过 27MHz 可能花屏 |
SPI_READ_FREQUENCY | 第 4 节 | 读屏时钟 | 默认 20000000,不稳就再降 |
SPI_TOUCH_FREQUENCY | 第 4 节 | 触摸 XPT2046 时钟 | 固定 2.5MHz,一般别动 |
TOUCH_CS | 第 2 节 | 触摸片选 | 没有触摸屏就保持注释 |
USE_HSPI_PORT | 第 4 节 | ESP32 换用 HSPI 端口 | VSPI 被占用时放开 |
SUPPORT_TRANSACTIONS | 第 4 节 | SPI 事务支持 | 同总线还有别的 SPI 设备时必需 |
| 外部配置路径 | docs/PlatformIO/External setup for Platform_IO.txt | PlatformIO 用库外 User_Setup | build_flags里加-D TFT_ESPI_USER_SETUP_PATH=\"../configs/你的/User_Setup.h\" |
| ESP-IDF menuconfig | docs/ESP-IDF/Using ESP-IDF.txt、Kconfig | IDF 下免改头文件配置 | idf.py menuconfig进 TFT_eSPI 节,或直接删 Kconfig 用 User_Setup_Select |
按需做你想做的事
让 XPT2046 触摸屏可用(使用方法)
目标:点哪显示哪。
先在 User_Setup 里放开触摸片选:
#define TOUCH_CS 21再跑 examples/Generic/Touch_calibrate/Touch_calibrate.ino,串口会输出 5 个校准值,写回代码:
uint16_t calData[5] = { 286, 3534, 283, 3600, 6 }; // 示例值,以校准输出为准 tft.setTouch(calData);uint16_t x, y; if (tft.getTouch(&x, &y)) { // 有按压才为 true tft.fillCircle(x, y, 4, TFT_RED); }坑:校准是在某个旋转角度下做的,返回坐标只对应那个角度——改tft.setRotation()就得重新校准。
使用抗锯齿平滑字体
目标:文字边缘没有锯齿。
User_Setup 里必须有#define SMOOTH_FONT(默认开着)。字库用 Tools/Create_Smooth_Font/Create_font/Create_font.pde 从 ttf 生成,仓库 examples/Smooth Fonts/ 里现成带NotoSansBold15.h这类字头:
#include "NotoSansBold15.h" // 字体数组名,不能加引号引用 tft.setTextColor(TFT_WHITE, TFT_BLACK); // 第二参数是背景色 tft.loadFont(NotoSansBold15); tft.println("Smooth 15pt"); tft.unloadFont();坑:抗锯齿靠"文字色 + 背景色"逐像素混合,setTextColor(fg, bg)的背景色必须设对,否则字与字之间会留色边。
无闪烁动画:Sprite 缓冲区
目标:旋转、刷新不闪。
Sprite 是一块 RAM 里的"画布",画完一次性推到屏幕,参考 examples/Sprite/Rotated_Sprite_1/:
TFT_eSprite spr = TFT_eSprite(&tft); spr.setColorDepth(8); // 8bpp:同样尺寸 RAM 占用是 16bpp 的 1/2 spr.createSprite(64, 30); spr.fillSprite(TFT_BLACK); spr.drawString("Hello", 32, 15, 4); spr.pushRotated(45, TFT_BLACK); // 按 45° 推出,黑色作透明色坑:createSprite返回指针,创建失败是 NULL(RAM 不够),先判空再用;全屏 16bpp 缓冲在大多数开发板上装不下。
如何开启 DMA 加速
目标:SPI 传数不占 CPU,帧率翻倍。
DMA 配合"双 Sprite 乒乓"效果最好,参考 examples/DMA test/Bouncy_Circles/(RP2040 + ILI9341 实测 45~48fps):
tft.init(); tft.initDMA(); // 初始化 DMA 并挂到 SPI 总线 // 两个半屏 Sprite 交替:画一个,推另一个 sprPtr[0] = (uint16_t*)spr[0].createSprite(240, 160); sprPtr[1] = (uint16_t*)spr[1].createSprite(240, 160);坑:缓冲要真金白银的 RAM(示例注释写得很直白:240x320 全屏缓冲是 150KB),先算宽x高x2字节,不够就改小尺寸或降位深。
上线前检查
- SPI 时钟按驱动上限设:ILI9341 稳在 40MHz(80MHz 有时失败),ST7735 不超 27MHz。
- SPI 总线上还有 SD 卡等其它设备时,确认 Transaction 支持开着(ESP32 自动开)。
- 共享 SPI 的屏别把 SDO 接 MISO——ILI9488 的 SDO 在 CS 拉高时不会三态,会干扰其它设备。
- Sprite 内存按
宽 × 高 × 位深/8字节预算,createSprite失败会返回 NULL,必须判空。
屏幕不听话时
| 症状 | 常见原因 | 先做什么 |
|---|---|---|
| 全黑没反应 | 背光/电源没通,复位线没接,驱动宏选错 | 查背光和 5V;确认 User_Setup 里只有一行*_DRIVER |
| 有图但花屏、错位 | SPI 时钟超过驱动承受值 | 逐档降SPI_FREQUENCY(如 40M→27M→20M) |
| 红蓝反色 | RGB/BGR 顺序不对 | 在 ST7735/ST7789/ILI9341 上逐个试TFT_RGB_ORDER |
| 白显黑 | 显示反色未开 | 逐个试TFT_INVERSION_ON/TFT_INVERSION_OFF |
| 触摸有值但坐标偏移 | 没校准、校准角度不对 | 跑 Touch_calibrate 重新取 5 个值,且角度与成品一致 |
| 读回像素与写入不符 | SPI 时钟过快或走线过长 | 用 examples/Test and diagnostics/TFT_ReadWrite_Test/ 逐位验证,降时钟 |
下一步
先跑一遍 Read_User_Setup 确认编译器吃进的是你想用的那份配置,再刷一个TFT_Rainbow和一次TFT_ReadWrite_Test收尾。配置改完立刻备份一份到库目录外面——升级库会把你改过的 User_Setup 直接覆盖掉。
【免费下载链接】TFT_eSPIArduino and PlatformIO IDE compatible TFT library optimised for the Raspberry Pi Pico (RP2040), STM32, ESP8266 and ESP32 that supports different driver chips项目地址: https://gitcode.com/GitHub_Trending/tf/TFT_eSPI
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考