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 电压先于模拟电压稳定。

  1. VCC(I/O 电压,1.65V~3.3V) 先上电,或与 VCI(模拟电压,2.5V~3.3V)同时上电。
  2. VCC 稳定后,等待 T1 ≥ 10ms(ILI9341)或 T1 ≥ 5ms(ST7789),再给 VCI 上电。
  3. VCI 稳定后,等待 T2 ≥ 10ms,再拉高 RESX 引脚释放硬件复位。
  4. RESX 拉高后,等待 T3 ≥ 120ms(ILI9341)或 T3 ≥ 150ms(ST7789),芯片内部振荡器稳定,方可发送 SPI 命令。
工程经验: 实际项目中建议将 T1、T2、T3 统一放宽至 200ms,以兼容不同批次芯片和电源纹波差异。使用 GPIO 控制 RESX 时,务必确保上电瞬间 RESX 为低电平(可通过外部下拉电阻实现)。

3.2.2 下电时序(Power Off Sequence)

下电时序与上电相反,且同样重要:

  1. 发送 Display Off 命令(CMD 0x28),等待 20ms。
  2. 发送 Sleep In 命令(CMD 0x10),等待 120ms~150ms。
  3. 拉低 RESX 引脚。
  4. 先关闭 VCI(模拟电压),等待 10ms。
  5. 再关闭 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 从上电到显示开启的完整状态转换过程,以及各阶段所需的等待时间。

驱动芯片初始化状态转换图(ILI9341 / ST7789) 上电(VCC → VCI) 硬件复位(RESX) 软件复位(CMD 0x01) Sleep Out(CMD 0x11) 寄存器配置(3A/36/2A/2B) Display On(CMD 0x29) 等待 ≥ 120ms 等待 ≥ 5ms 等待 ≥ 120ms 等待 ≥ 20ms

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%。