3. 驱动芯片初始化:ILI9341 / ST7789 常用驱动IC初始化流程、寄存器配置、上下电时序
LCD TFT 驱动芯片的初始化是显示系统正常工作的第一步。初始化失败会导致黑屏、花屏、颜色异常或显示偏移。本章以市场占有率最高的 ILI9341(常用于 2.8"~3.5" 320×240 分辨率)和 ST7789(常用于 1.3"~2.0" 240×240/240×320 分辨率)为例,详细拆解初始化流程、关键寄存器配置以及严格的上下电时序要求。
3.1 驱动芯片初始化核心流程
无论使用哪款驱动 IC,初始化流程都遵循以下通用步骤。差异主要体现在寄存器地址、参数值和具体时序参数上。
初始化黄金法则: 严格按照数据手册规定的 上电时序 → 硬件复位 → 软件复位 → Sleep Out → 关键寄存器配置 → Display On 顺序执行,不可颠倒或省略任何步骤。
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | 上电(Power On) | VCC(I/O 电压)先于 VCI(模拟电压)或同时上电,需满足时序要求 |
| 2 | 硬件复位(Hardware Reset) | RESX 引脚拉低 ≥10μs,再拉高,等待 120ms~150ms |
| 3 | 软件复位(Software Reset) | 发送 CMD 0x01,等待 5ms~10ms |
| 4 | Sleep Out | 发送 CMD 0x11,等待 120ms~150ms(退出睡眠模式) |
| 5 | 关键寄存器配置 | 设置像素格式、帧率、伽马曲线、显示方向、内存访问控制等 |
| 6 | Display On | 发送 CMD 0x29,等待 20ms~50ms |
| 7 | 清屏 / 初始化显存 | 将整个显示缓冲区填充为黑色或指定背景色 |
3.2 上下电时序详解
上下电时序是驱动芯片初始化中最容易被忽视但后果最严重的部分。时序违规可能导致芯片闩锁(Latch-up)、永久损坏或显示异常。
3.2.1 上电时序(Power On Sequence)
ILI9341 和 ST7789 的上电时序要求基本一致,核心原则是 I/O 电压先于模拟电压稳定。
- VCC(I/O 电压,1.65V~3.3V) 先上电,或与 VCI(模拟电压,2.5V~3.3V)同时上电。
- VCC 稳定后,等待 T1 ≥ 10ms(ILI9341)或 T1 ≥ 5ms(ST7789),再给 VCI 上电。
- VCI 稳定后,等待 T2 ≥ 10ms,再拉高 RESX 引脚释放硬件复位。
- RESX 拉高后,等待 T3 ≥ 120ms(ILI9341)或 T3 ≥ 150ms(ST7789),芯片内部振荡器稳定,方可发送 SPI 命令。
工程经验: 实际项目中建议将 T1、T2、T3 统一放宽至 200ms,以兼容不同批次芯片和电源纹波差异。使用 GPIO 控制 RESX 时,务必确保上电瞬间 RESX 为低电平(可通过外部下拉电阻实现)。
3.2.2 下电时序(Power Off Sequence)
下电时序与上电相反,且同样重要:
- 发送 Display Off 命令(CMD 0x28),等待 20ms。
- 发送 Sleep In 命令(CMD 0x10),等待 120ms~150ms。
- 拉低 RESX 引脚。
- 先关闭 VCI(模拟电压),等待 10ms。
- 再关闭 VCC(I/O 电压)。
严禁热插拔: 在 VCI 未完全放电(通常需 1s 以上)的情况下重新上电,可能导致芯片内部电荷泵异常,产生过压损坏。建议在电源路径上增加放电电阻。
3.3 关键寄存器配置对比
以下表格列出 ILI9341 和 ST7789 在初始化阶段必须配置的核心寄存器,以及常见参数值。
| 功能 | 命令 | ILI9341 参数 | ST7789 参数 | 说明 |
|---|---|---|---|---|
| 软件复位 | 0x01 | 无参数 | 无参数 | 复位后需等待 5ms |
| Sleep Out | 0x11 | 无参数 | 无参数 | 退出睡眠,等待 120ms |
| 像素格式 | 0x3A | 0x55(16位) 0x66(18位) |
0x05(16位) 0x06(18位) |
推荐使用 16位(RGB565)以节省带宽 |
| 内存访问控制 | 0x36 | 0x48(默认) 0xE0(旋转180°) |
0x00(默认) 0xC0(旋转180°) |
控制显示方向、RGB/BGR 顺序 |
| 列地址设置 | 0x2A | XSTART, XEND | XSTART, XEND | 设置显示窗口列范围 |
| 页地址设置 | 0x2B | YSTART, YEND | YSTART, YEND | 设置显示窗口行范围 |
| 写内存 | 0x2C | 像素数据流 | 像素数据流 | 连续写入像素数据 |
| Display On | 0x29 | 无参数 | 无参数 | 开启显示,等待 20ms |
3.4 ILI9341 与 ST7789 初始化代码示例
以下代码展示基于 SPI 接口的典型初始化函数。实际项目中需根据具体模块调整参数。
3.4.1 ILI9341 初始化代码片段
void ILI9341_Init(void) {
// 1. 硬件复位
LCD_RESET_LOW();
delay_ms(10);
LCD_RESET_HIGH();
delay_ms(150);
// 2. 软件复位
LCD_WriteCmd(0x01);
delay_ms(10);
// 3. Sleep Out
LCD_WriteCmd(0x11);
delay_ms(150);
// 4. 像素格式:16位 RGB565
LCD_WriteCmd(0x3A);
LCD_WriteData(0x55);
// 5. 内存访问控制:RGB 顺序,默认方向
LCD_WriteCmd(0x36);
LCD_WriteData(0x48);
// 6. 帧率控制(可选,使用默认值)
LCD_WriteCmd(0xB1);
LCD_WriteData(0x00);
LCD_WriteData(0x18);
// 7. 伽马校正(使用默认曲线)
LCD_WriteCmd(0x26);
LCD_WriteData(0x01);
// 8. Display On
LCD_WriteCmd(0x29);
delay_ms(50);
// 9. 清屏
ILI9341_FillScreen(0x0000);
}
3.4.2 ST7789 初始化代码片段
void ST7789_Init(void) {
// 1. 硬件复位
LCD_RESET_LOW();
delay_ms(10);
LCD_RESET_HIGH();
delay_ms(150);
// 2. 软件复位
LCD_WriteCmd(0x01);
delay_ms(10);
// 3. Sleep Out
LCD_WriteCmd(0x11);
delay_ms(150);
// 4. 像素格式:16位 RGB565
LCD_WriteCmd(0x3A);
LCD_WriteData(0x05);
// 5. 内存访问控制:默认方向
LCD_WriteCmd(0x36);
LCD_WriteData(0x00);
// 6. 显示反转控制(部分模块需要)
LCD_WriteCmd(0x21); // 开启反转
// 7. 显示窗口设置(全屏)
LCD_WriteCmd(0x2A);
LCD_WriteData(0x00); LCD_WriteData(0x00); // XSTART
LCD_WriteData(0x00); LCD_WriteData(0xEF); // XEND (240-1)
LCD_WriteCmd(0x2B);
LCD_WriteData(0x00); LCD_WriteData(0x00); // YSTART
LCD_WriteData(0x00); LCD_WriteData(0xEF); // YEND (240-1)
// 8. Display On
LCD_WriteCmd(0x29);
delay_ms(50);
// 9. 清屏
ST7789_FillScreen(0x0000);
}
3.5 初始化流程状态图
下图展示 ILI9341 / ST7789 从上电到显示开启的完整状态转换过程,以及各阶段所需的等待时间。
3.6 常见初始化失败排查清单
调试技巧: 当屏幕不亮或显示异常时,不要盲目修改寄存器参数。先使用逻辑分析仪或示波器检查 SPI 时序、RESX 波形和电源纹波,确认硬件基础正常后再排查软件配置。
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| 屏幕完全不亮 | 电源未上电 / RESX 未释放 / Sleep Out 未执行 | 检查 VCC/VCI 电压、RESX 波形、初始化顺序 |
| 白屏 | Display On 未发送 / 背光未开启 | 检查 CMD 0x29 是否发送、背光 PWM 引脚电平 |
| 花屏 / 颜色错乱 | 像素格式不匹配 / RGB/BGR 顺序错误 | 检查 CMD 0x3A 和 0x36 的 BGR 位 |
| 显示偏移 / 部分显示 | 列/页地址设置错误 / 窗口设置不正确 | 检查 CMD 0x2A 和 0x2B 的起始/结束地址 |
| 闪烁 / 条纹 | 帧率设置不当 / 电源纹波过大 | 检查 CMD 0xB1 参数、VCI 端加 10μF 电容 |
| 上电后芯片发烫 | 上下电时序违规导致闩锁 | 立即断电,检查 VCI 放电回路,严格按时序操作 |
3.7 初始化性能优化建议
在批量生产或需要快速启动的场景下,初始化时间直接影响用户体验。以下优化策略可在保证稳定性的前提下缩短初始化耗时:
- 合并等待时间: 硬件复位后的 120ms 等待可以与 Sleep Out 后的 120ms 等待合并,前提是确保 RESX 释放后芯片内部振荡器已稳定。
- 使用 DMA 发送初始化序列: 将初始化命令和数据打包为连续数组,通过 SPI DMA 发送,CPU 可在此期间执行其他任务。
- 跳过不必要的寄存器配置: 如果使用芯片默认值(如帧率、伽马曲线),可省略对应命令,但像素格式和内存访问控制必须显式配置。
- 预编译初始化表: 将初始化序列定义为 const 数组,减少运行时函数调用开销。
实测数据: 在 40MHz SPI 总线下,ILI9341 完整初始化(含所有等待时间)约需 380ms~420ms;优化后(合并等待、跳过默认配置)可缩短至 250ms~280ms。ST7789 因分辨率较低,初始化时间通常比 ILI9341 快 20%~30%。