3. 初始化序列:软件复位、睡眠模式退出、显示开/关、帧率设置、伽马校正
ST7789 驱动 IC 在上电后并非直接进入可显示状态,必须按照严格的时序发送一系列命令与参数,完成内部寄存器的配置与状态机的迁移。初始化序列的健壮性直接决定屏幕能否正常点亮、色彩是否准确以及刷新率是否稳定。本节将拆解标准初始化流程中的五个关键环节,并给出经过验证的配置参数。
3.1 初始化流程总览
完整的初始化序列遵循“硬件复位 → 软件复位 → 退出睡眠 → 帧率/内存访问控制 → 显示开”的固定顺序。跳过或颠倒其中任何一步都可能导致显示异常或功耗失控。
关键原则: 每次发送命令后必须插入足够的延时(通常 5–120 ms),等待内部模拟电路稳定。延时不足是初始化失败最常见的原因。
3.2 软件复位与睡眠模式退出
硬件复位通常由主控 MCU 的 GPIO 拉低 RST 引脚实现,而软件复位与睡眠模式退出则通过 SPI 命令完成。这两个步骤是初始化序列中最容易出错的环节。
| 步骤 | 命令 | 参数 | 延时要求 | 说明 |
|---|---|---|---|---|
| 软件复位 | 0x01 (SWRESET) | 无 | ≥120 ms | 复位所有寄存器到默认值 |
| 退出睡眠 | 0x11 (SLPOUT) | 无 | ≥120 ms | 唤醒 DC/DC 转换器与振荡器 |
| 进入睡眠 | 0x10 (SLPIN) | 无 | ≥5 ms | 低功耗模式,显示关闭 |
常见陷阱: 部分 ST7789 模组在退出睡眠后立即发送显示开命令会导致花屏。必须在 SLPOUT 后等待至少 120 ms,待内部电压稳定后再执行后续配置。
3.3 显示开/关控制
显示开/关命令控制源极驱动器的输出状态。显示关(0x28)时面板进入空白状态,但内部 RAM 内容保持不变;显示开(0x29)恢复显示。在初始化序列中,显示开命令应放在所有参数配置完成之后。
// 显示开/关命令示例(基于 MicroPython + SPI)
def display_on():
spi_write(0x29) # 显示开
time.sleep_ms(50)
def display_off():
spi_write(0x28) # 显示关
time.sleep_ms(5)
3.4 帧率设置与内存访问控制
帧率设置通过命令 0xB2 (PORCTRK) 和 0x36 (MADCTL) 实现。前者配置内部振荡器分频与扫描周期,后者控制 RGB/BGR 顺序以及扫描方向。
| 命令 | 参数 | 默认值 | 推荐值 | 作用 |
|---|---|---|---|---|
| 0xB2 | 5 字节 | 0x0C 0x0C 0x00 0x33 0x33 | 0x0C 0x0C 0x00 0x33 0x33 | 设置帧率 = 60 Hz(典型值) |
| 0x36 | 1 字节 | 0x00 | 0x00 / 0xC0 / 0x60 | RGB 顺序与扫描方向 |
| 0x3A | 1 字节 | 0x05 | 0x05 (16位) / 0x06 (18位) | 像素格式设置 |
性能提示: 使用 16 位像素格式(0x05)可减少 SPI 传输量 25%,在双缓冲场景下能显著提升帧率。如果色彩精度要求高,再考虑 18 位格式。
3.5 伽马校正
ST7789 提供正负伽马曲线寄存器(0xE0 / 0xE1),各包含 14 个字节的电压微调值。默认值通常偏冷或偏暖,通过调整可改善灰阶过渡与色温一致性。
以下是一组经过验证的伽马寄存器配置,适用于大多数 1.3–1.54 寸 ST7789 模组,色温接近 6500K:
# 正伽马曲线 (0xE0) - 14 字节
gamma_pos = [0xD0, 0x08, 0x11, 0x08, 0x0C, 0x15, 0x39,
0x33, 0x50, 0x36, 0x13, 0x14, 0x29, 0x2D]
# 负伽马曲线 (0xE1) - 14 字节
gamma_neg = [0xD0, 0x08, 0x10, 0x08, 0x0C, 0x15, 0x39,
0x33, 0x50, 0x36, 0x13, 0x14, 0x29, 0x2D]
3.6 完整初始化序列参考
将上述步骤整合为可复用的初始化函数,注意延时顺序不可颠倒:
def st7789_init():
# 1. 硬件复位(GPIO 控制)
gpio_low(RST_PIN)
time.sleep_ms(10)
gpio_high(RST_PIN)
time.sleep_ms(10)
# 2. 软件复位
spi_write(0x01)
time.sleep_ms(120)
# 3. 退出睡眠模式
spi_write(0x11)
time.sleep_ms(120)
# 4. 帧率与内存访问控制
spi_write(0xB2, [0x0C, 0x0C, 0x00, 0x33, 0x33])
spi_write(0x36, 0x00) # RGB 顺序
spi_write(0x3A, 0x05) # 16 位像素
# 5. 伽马校正
spi_write(0xE0, gamma_pos)
spi_write(0xE1, gamma_neg)
# 6. 显示开
spi_write(0x29)
time.sleep_ms(50)
验证要点: 初始化完成后,读取命令 0x09 (RD_DISPLAY_STATUS) 应返回 0x00(正常)。如果返回非零值,检查 SPI 时序或延时是否不足。