STM32 进阶封神之路(三十四):TFT LCD 深度全解 —— 显示原理、ILI9341 控制器、8080 并行接口与底层驱动体系

0 阅读9分钟

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 的核心结构从上到下依次为:

  1. 背光模块:提供恒定白色光源
  2. 上偏光片:过滤光线方向
  3. 玻璃基板与透明电极
  4. 液晶层:核心控制层
  5. 玻璃基板与透明电极
  6. 下偏光片
  7. RGB 彩色滤光片
  8. 像素驱动电路

**工作原理一句话总结:**通过施加电压控制液晶分子旋转角度 → 控制光线通过量 → 经过 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 内部包括:

  1. GRAM 图形显存:存储一帧图像
  2. 接口控制模块:8080 / SPI / RGB 接口
  3. 行列驱动电路
  4. 时序发生器
  5. 电压调节电路
  6. 背光控制逻辑

MCU 只需要通过命令把数据写入 ILI9341 的 GRAM,芯片就会自动刷新到屏幕。

2.3 ILI9341 支持三种接口

  1. **8080 并行接口(16bit)**速度最快,工程最常用
  2. SPI 接口(3/4 线)接线少,速度慢
  3. 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 写命令严格时序

  1. CS = 0
  2. DC = 0
  3. 数据放到 DB [15:0]
  4. WR 产生下降沿
  5. WR 上升沿
  6. CS = 1

3.4 8080 写数据严格时序

  1. CS = 0
  2. DC = 1
  3. 数据放到 DB [15:0]
  4. WR 产生下降沿
  5. WR 上升沿
  6. CS = 1

时序正确,屏幕就能正常驱动。时序错误,屏幕一定不亮、花屏、乱码。


四、GRAM 显存机制 —— 刷屏快的核心

4.1 什么是 GRAM?

GRAM = Graphics RAM就是 ILI9341 内部的 150KB 显存

MCU 不需要持续刷新屏幕,只需要:

  1. 设置坐标范围
  2. 写入颜色数据
  3. 自动存入 GRAM
  4. ILI9341 自动扫描显示

4.2 屏幕刷新机制

  • 不需要逐帧刷新
  • 不需要显存加速
  • 改哪里更哪里
  • 写入即显示

这是 TFT LCD 可以做到高速显示的根本原因。

4.3 标准写屏流程

  1. 发送命令:设置列地址 X
  2. 发送命令:设置页地址 Y
  3. 发送命令:0x2C(写 GRAM)
  4. 连续写入颜色数据
  5. 自动填充到对应区域

五、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 初始化序列(必须严格执行):

  1. 硬件复位
  2. 退出睡眠(0x11)
  3. 等待稳定
  4. 设置色彩格式:RGB565(0x3A)
  5. 设置显示方向(0x36)
  6. 设置时钟
  7. 开启显示(0x29)
  8. 开启背光

少任何一个命令,屏幕都不会正常显示。


七、底层核心驱动函数 —— 显示系统的基石

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)

显示流程:

  1. 输入汉字
  2. 查询 GB2312 编码
  3. 读取 16×16 点阵
  4. 逐点绘制

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 驱动库应包括:

  1. 硬件层(时序、IO、初始化)
  2. 核心层(画点、画线、矩形、圆形)
  3. 文字层(ASCII、汉字、数字、字体)
  4. 图形层(图像、曲线、进度条)
  5. 应用层(界面、菜单、数据显示)

分层清晰,便于移植、维护、升级。


十、总结

TFT LCD 是嵌入式系统最重要的输出设备,也是体现开发水平的关键模块。ILI9341 作为最主流的驱动控制器,通过 8080 并行接口与 MCU 通信,依靠内部 GRAM 实现高速显示。

驱动 TFT LCD 并不难,难点在于:

  • 理解时序
  • 理解 GRAM 机制
  • 理解坐标系统
  • 写出稳定、高速、可复用的驱动

只要掌握本章内容,你就可以独立开发:

  • 工业仪表界面
  • 环境监测显示面板
  • 智能设备交互屏幕
  • 中文菜单系统
  • 图像与曲线显示系统

下一章我们将进入真正的高速工程化实战,使用 FSMC 打造工业级刷屏引擎,实现毫秒级刷新、多图层、多字体、多画面切换。