STM32 进阶封神之路(三十四):TFT LCD 深度全解 —— 显示原理、ILI9341 控制器、8080 并行接口与底层驱动体系
在嵌入式物联网、工业控制、智能监测设备中,TFT LCD 是最核心、最直观的人机交互输出单元。它不仅承担数据显示、状态反馈、界面呈现的任务,更是整套系统可用性与专业性的直接体现。
上一章我们完成了 SPI Flash W25Q64 的通用读写与掉电存储,本章将完整、系统、深入地讲解 TFT LCD 的硬件原理、通信接口、显存机制、驱动架构、时序逻辑,并从底层一步步搭建可直接用于产品的稳定驱动框架。全文内容详实、结构严谨、可直接作为技术博客发布,不涉及任何课程资料名称与课题指向,只做纯粹、专业的嵌入式技术分享。
一、TFT LCD 显示系统总览:从原理到工程实现
1.1 为什么嵌入式系统离不开 TFT LCD?
在嵌入式项目中,显示模块是连接设备与用户的唯一视觉窗口。无论是环境监测、智能家居、车载仪表、工业控制屏,还是手持设备,一块稳定、清晰、高速的 TFT LCD 都决定了系统的完整度与专业度。
与 1602、12864 等单色屏相比,TFT LCD 具有:
- 高分辨率
- 真彩色显示
- 可显示图像、曲线、汉字、图标
- 可搭配触摸屏实现交互
- 刷新率高、响应速度快
- 体积薄、功耗可控因此,TFT LCD 已经成为中高端嵌入式设备的标准显示方案。
1.2 TFT LCD 到底是如何显示颜色的?
很多开发者会用 LCD,但并不理解它的工作原理。真正理解原理,才能解决花屏、白屏、黑屏、刷屏慢等问题。
TFT LCD 的核心结构从上到下依次为:
- 背光模块:提供恒定白色光源
- 上偏光片:过滤光线方向
- 玻璃基板与透明电极
- 液晶层:核心控制层
- 玻璃基板与透明电极
- 下偏光片
- RGB 彩色滤光片
- 像素驱动电路
**工作原理一句话总结:**通过施加电压控制液晶分子旋转角度 → 控制光线通过量 → 经过 RGB 彩色滤光片 → 形成不同颜色的像素点。
液晶本身不发光,它只是光阀门。
1.3 像素、分辨率、色深、显存 —— 四个必须理解的核心概念
(1)像素 Pixel
屏幕最小的发光点,1 个像素 = R(红)+ G(绿)+ B(蓝)三个子像素。
(2)分辨率 Resolution
横向像素数量 × 纵向像素数量。常见屏幕:
- 2.4 寸:240×320
- 3.5 寸:320×480
- 4.3 寸:480×272
- 7 寸:800×480
分辨率决定显示清晰度。
(3)颜色深度(色深)
嵌入式 TFT LCD 最常用:RGB565(16bit 色)
- R:5 位
- G:6 位
- B:5 位总共可以显示 65536 种颜色,满足绝大多数工业与消费类设备。
每个像素占用 2 字节。
(4)显存大小计算
以 240×320 屏为例:240 × 320 = 76800 像素76800 × 2 = 153600 字节(约 150KB)
这就是 ILI9341 控制器内部 GRAM 的大小。
二、ILI9341 显示控制器详解 ——LCD 的 “显卡”
2.1 为什么 STM32 不能直接驱动 TFT?
STM32F103 这类主流 MCU 没有内置 RGB 液晶控制器,无法直接生成像素时序驱动玻璃面板。
因此必须使用 外置驱动芯片。
最主流、最通用、资料最完善的就是:ILI9341
它的地位相当于计算机的显卡。
2.2 ILI9341 功能框图(核心)
ILI9341 内部包括:
- GRAM 图形显存:存储一帧图像
- 接口控制模块:8080 / SPI / RGB 接口
- 行列驱动电路
- 时序发生器
- 电压调节电路
- 背光控制逻辑
MCU 只需要通过命令把数据写入 ILI9341 的 GRAM,芯片就会自动刷新到屏幕。
2.3 ILI9341 支持三种接口
- **8080 并行接口(16bit)**速度最快,工程最常用
- SPI 接口(3/4 线)接线少,速度慢
- RGB 接口(MCU 一般不用)
嵌入式系统首选:16bit 8080 并行接口。
三、8080 并行接口 ——TFT 驱动的灵魂
3.1 8080 接口信号定义
8080 是一套并行总线标准,也是 ILI9341 的核心控制方式。
信号包括:
- DB[15:0] :16 位数据口(传输命令与颜色)
- CS:片选(低电平有效)
- DC(RS) :数据 / 命令选择脚
- WR:写信号(下降沿锁存)
- RD:读信号(一般不使用)
- RST:硬件复位
- BLK:背光控制
3.2 DC 脚的意义(最关键)
- DC = 0 → 写命令
- DC = 1 → 写数据
所有驱动代码都围绕这一条规则展开。
3.3 8080 写命令严格时序
- CS = 0
- DC = 0
- 数据放到 DB [15:0]
- WR 产生下降沿
- WR 上升沿
- CS = 1
3.4 8080 写数据严格时序
- CS = 0
- DC = 1
- 数据放到 DB [15:0]
- WR 产生下降沿
- WR 上升沿
- CS = 1
时序正确,屏幕就能正常驱动。时序错误,屏幕一定不亮、花屏、乱码。
四、GRAM 显存机制 —— 刷屏快的核心
4.1 什么是 GRAM?
GRAM = Graphics RAM就是 ILI9341 内部的 150KB 显存。
MCU 不需要持续刷新屏幕,只需要:
- 设置坐标范围
- 写入颜色数据
- 自动存入 GRAM
- ILI9341 自动扫描显示
4.2 屏幕刷新机制
- 不需要逐帧刷新
- 不需要显存加速
- 改哪里更哪里
- 写入即显示
这是 TFT LCD 可以做到高速显示的根本原因。
4.3 标准写屏流程
- 发送命令:设置列地址 X
- 发送命令:设置页地址 Y
- 发送命令:0x2C(写 GRAM)
- 连续写入颜色数据
- 自动填充到对应区域
五、TFT LCD 两种驱动方式:GPIO 模拟 vs FSMC 硬件
5.1 方式一:GPIO 模拟 8080 时序(通用、易移植)
用普通 GPIO 翻转模拟 WR、DC、CS、DB 信号。
优点:
- 任意引脚可用
- 移植性极强
- 不需要硬件外设缺点:
- 速度较慢适合:调试、小屏、简单界面、低成本设备。
5.2 方式二:FSMC 硬件驱动(高速、工业级)
STM32 的 FSMC 外设本来用于驱动 SRAM、NOR Flash。
我们可以把 TFT LCD 映射为一段内存地址:
- 命令地址:0x60000000
- 数据地址:0x60010000
写屏 = 写内存速度是 GPIO 模拟的 10~20 倍。
优点:
- 极快
- 刷屏流畅
- 可显示图片、动画、曲线适合:工业屏、复杂界面、高速刷新设备。
六、ILI9341 标准初始化序列(点亮屏幕必备)
屏幕能否点亮,90% 取决于初始化是否正确。
标准 ILI9341 初始化序列(必须严格执行):
- 硬件复位
- 退出睡眠(0x11)
- 等待稳定
- 设置色彩格式:RGB565(0x3A)
- 设置显示方向(0x36)
- 设置时钟
- 开启显示(0x29)
- 开启背光
少任何一个命令,屏幕都不会正常显示。
七、底层核心驱动函数 —— 显示系统的基石
7.1 写命令函数
c
运行
void LCD_WriteCmd(uint16_t cmd)
{
LCD_CS(0);
LCD_DC(0);
LCD_DATA_OUT(cmd);
LCD_WR(0);
LCD_WR(1);
LCD_CS(1);
}
7.2 写数据函数
c
运行
void LCD_WriteData(uint16_t data)
{
LCD_CS(0);
LCD_DC(1);
LCD_DATA_OUT(data);
LCD_WR(0);
LCD_WR(1);
LCD_CS(1);
}
7.3 画点函数 —— 所有显示的基础
c
运行
void LCD_DrawPoint(uint16_t x, uint16_t y, uint16_t color)
{
// 设置坐标X
LCD_WriteCmd(0x2A);
LCD_WriteData(x>>8);
LCD_WriteData(x&0xFF);
// 设置坐标Y
LCD_WriteCmd(0x2B);
LCD_WriteData(y>>8);
LCD_WriteData(y&0xFF);
// 写入GRAM
LCD_WriteCmd(0x2C);
LCD_WriteData(color);
}
7.4 画线、矩形、圆形、字符
全部基于画点函数扩展而来。
7.5 中文显示
中文需要字库,常见两种方式:
- 内部 Flash 存储点阵
- 外挂字库芯片(GT20L)
显示流程:
- 输入汉字
- 查询 GB2312 编码
- 读取 16×16 点阵
- 逐点绘制
7.6 图像显示
使用取模工具将图片转为 RGB565 数组,直接写入 GRAM 即可。
八、屏幕显示问题全排查(99% 的问题都能解决)
8.1 白屏、背光不亮
- 背光脚 BLK 未拉高
- 复位时序错误
- 初始化命令缺失
- 供电异常
8.2 黑屏、有背光无显示
- 未发送 SLPOUT(0x11)
- 未发送 DISPON(0x29)
- 数据口错位
- 驱动时序错误
8.3 花屏、颜色错乱
- 色深设置错误(不是 RGB565)
- 扫描方向设置错误
- 数据引脚错位
- GRAM 写入越界
8.4 刷屏极慢
- 使用 GPIO 模拟
- 逐点刷新
- 未使用块写入方式
- 未使用 FSMC
8.5 汉字显示乱码
- 字库取模方式错误
- 编码不是 GB2312
- 点阵读取偏移错误
九、工程化显示系统架构(可直接用于产品)
一个可复用、可维护的 TFT LCD 驱动库应包括:
- 硬件层(时序、IO、初始化)
- 核心层(画点、画线、矩形、圆形)
- 文字层(ASCII、汉字、数字、字体)
- 图形层(图像、曲线、进度条)
- 应用层(界面、菜单、数据显示)
分层清晰,便于移植、维护、升级。
十、总结
TFT LCD 是嵌入式系统最重要的输出设备,也是体现开发水平的关键模块。ILI9341 作为最主流的驱动控制器,通过 8080 并行接口与 MCU 通信,依靠内部 GRAM 实现高速显示。
驱动 TFT LCD 并不难,难点在于:
- 理解时序
- 理解 GRAM 机制
- 理解坐标系统
- 写出稳定、高速、可复用的驱动
只要掌握本章内容,你就可以独立开发:
- 工业仪表界面
- 环境监测显示面板
- 智能设备交互屏幕
- 中文菜单系统
- 图像与曲线显示系统
下一章我们将进入真正的高速工程化实战,使用 FSMC 打造工业级刷屏引擎,实现毫秒级刷新、多图层、多字体、多画面切换。