上一章我们系统讲解了 TFT LCD 的原理、接口、时序、ILI9341 控制器、显存机制与 GPIO 模拟驱动。
本章进入真正可用于产品的工程化实现,从 FSMC 硬件配置、高速刷屏、多区域显示、中英文混合排版、图形库、到完整界面引擎,全部一次性讲透、讲全、讲懂。
一、为什么要使用 FSMC 驱动 TFT LCD?
在实际产品中,若界面包含:
- 大量汉字
- 实时曲线
- 图标
- 图片
- 动态数据刷新
GPIO 模拟 8080 会明显卡顿、刷屏慢、闪烁严重。
解决方法只有一个:使用 STM32 FSMC 外设硬件驱动 TFT。
FSMC 优势:
- 写屏 = 写内存
- 速度提升 10~20 倍
- 刷屏无闪烁
- 可跑动态界面
- 工业级稳定性
- 支持高分辨率
这是商用设备、工业屏的标准方案。
二、FSMC 原理:把 LCD 映射成内存
2.1 FSMC 是什么?
FSMC:灵活静态存储控制器。
它原本用于驱动:
- SRAM
- NOR Flash
- NAND Flash
我们利用它的并行接口时序,完美兼容 8080 接口,从而把 TFT 当作内存 mapped 设备。
2.2 地址映射规则
使用 FSMC Bank1 NE1 驱动:
- 命令地址:0x60000000
- 数据地址:0x60010000
c
运行
#define LCD_CMD_ADDR ((uint32_t)0x60000000)
#define LCD_DATA_ADDR ((uint32_t)0x60010000)
#define LCD_CMD *(__IO uint16_t *)LCD_CMD_ADDR
#define LCD_DATA *(__IO uint16_t *)LCD_DATA_ADDR
写命令:
c
运行
LCD_CMD = cmd;
写数据:
c
运行
LCD_DATA = data;
真正的硬件加速、零 CPU 开销。
三、FSMC 驱动 TFT 硬件配置
3.1 引脚分配(标准 16bit 8080)
- FSMC_D0
D15 → LCD_D0D15 - FSMC_NOE → RD
- FSMC_NWE → WR
- FSMC_NE1 → CS
- FSMC_A16 → DC
3.2 FSMC 初始化配置(固定标准)
- 16 位数据宽度
- 异步模式 A
- 写使能
- 地址 / 数据分离
- 最快时序
这是 ILI9341 最稳定的配置。
四、FSMC 版底层驱动(工业级)
4.1 写命令
c
运行
void LCD_FSMC_WriteCmd(uint16_t cmd)
{
LCD_CMD = cmd;
}
4.2 写数据
c
运行
void LCD_FSMC_WriteData(uint16_t data)
{
LCD_DATA = data;
}
4.3 高速画点
c
运行
void LCD_FSMC_DrawPoint(uint16_t x, uint16_t y, uint16_t color)
{
LCD_CMD = 0x2A;
LCD_DATA = x>>8;
LCD_DATA = x&0xFF;
LCD_CMD = 0x2B;
LCD_DATA = y>>8;
LCD_DATA = y&0xFF;
LCD_CMD = 0x2C;
LCD_DATA = color;
}
4.4 高速全屏刷新
c
运行
void LCD_Clear(uint16_t color)
{
uint16_t i,j;
LCD_SetWindow(0,0,239,319);
LCD_CMD = 0x2C;
for(i=0;i<320;i++)
{
for(j=0;j<240;j++)
{
LCD_DATA = color;
}
}
}
速度极快,几乎无感觉。
五、工程化图形库(可直接用于产品)
5.1 画线
c
运行
void LCD_DrawLine(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2,uint16_t color);
5.2 矩形
c
运行
void LCD_DrawRect(uint16_t x,uint16_t y,uint16_t w,uint16_t h,uint16_t color);
5.3 填充矩形
c
运行
void LCD_FillRect(uint16_t x,uint16_t y,uint16_t w,uint16_t h,uint16_t color);
5.4 圆形
c
运行
void LCD_DrawCircle(uint16_t x,uint16_t y,uint16_t r,uint16_t color);
5.5 字符显示
c
运行
void LCD_DrawChar(uint16_t x,uint16_t y,uint8_t ch,uint16_t color);
5.6 字符串显示
c
运行
void LCD_DrawString(uint16_t x,uint16_t y,char *str,uint16_t color);
六、中文显示系统(嵌入式必备)
6.1 中文字库格式
常用:
- 16×16 点阵
- GB2312 编码
- 逐行取模、从左到右
6.2 汉字显示流程
- 输入汉字字符串
- 转换为 GB2312 编码
- 计算字库偏移地址
- 读取 32 字节点阵
- 逐行逐点绘制
6.3 中英文混排
c
运行
void LCD_DrawCNString(uint16_t x,uint16_t y,char *str,uint16_t color);
自动区分英文与汉字,自动排版、自动换行、自动对齐。
七、图像显示与界面布局
7.1 图片取模
使用取模软件将图片转为:
- RGB565
- 倒置
- 从上到下
- 从左到右
生成数组直接写入屏幕。
7.2 多区域界面布局
工程化界面通常分为:
- 顶部标题栏
- 中间数据区
- 底部状态栏
- 右侧菜单区
每个区域独立刷新,互不干扰。
八、高速刷屏优化技巧(工程必备)
8.1 局部刷新,不要全屏刷新
只更新变化区域,可提升速度 5~10 倍。
8.2 使用块写入(Set Window)
设置矩形窗口 → 连续写入颜色 → 速度最快。
8.3 禁止逐点写图
大量数据必须用连续填充。
8.4 静态界面缓存
不变部分绘制一次即可,不需要反复刷新。
九、常见问题深度解析
9.1 FSMC 配置后屏幕不亮
- Bank 选择错误
- 时序过快或过慢
- 地址线 A16 接错
- 复位未执行
9.2 显示错位
- 宽度高度设置反了
- 扫描方向 MADCTL 错误
- 窗口设置越界
9.3 颜色相反
- RGB565 高低字节交换
- 取模顺序错误
9.4 汉字显示方框
- 字库未烧录
- 取模方式不匹配
- 编码不是 GB2312
十、总结
TFT LCD 是嵌入式系统最核心的输出设备,而 FSMC 硬件驱动是实现高速、稳定、专业显示的唯一工业级方案。
通过 ILI9341 控制器 + 8080 并行接口 + GRAM 显存机制,我们可以实现:
- 高速刷屏
- 中英文混合排版
- 图像与图标显示
- 图形与曲线绘制
- 多区域、多图层界面
- 低 CPU 占用
- 工业级稳定性
掌握本篇内容,你已经具备独立开发商用显示设备、工业控制屏、智能仪表、人机交互界面的完整能力。
下一章我们将进入 触摸屏控制(XPT2046) ,实现真正的 “显示 + 触摸” 完整交互系统,打造可直接用于产品的 HMI 人机界面。