3. 初始化序列:软件复位、睡眠模式退出、显示开/关、帧率设置、伽马校正

ST7789 驱动 IC 在上电后并非直接进入可显示状态,必须按照严格的时序发送一系列命令与参数,完成内部寄存器的配置与状态机的迁移。初始化序列的健壮性直接决定屏幕能否正常点亮、色彩是否准确以及刷新率是否稳定。本节将拆解标准初始化流程中的五个关键环节,并给出经过验证的配置参数。

3.1 初始化流程总览

完整的初始化序列遵循“硬件复位 → 软件复位 → 退出睡眠 → 帧率/内存访问控制 → 显示开”的固定顺序。跳过或颠倒其中任何一步都可能导致显示异常或功耗失控。

关键原则: 每次发送命令后必须插入足够的延时(通常 5–120 ms),等待内部模拟电路稳定。延时不足是初始化失败最常见的原因。
ST7789 初始化序列状态机 硬件复位 软件复位 退出睡眠模式 帧率/控制设置 显示开 伽马校正 延时要求:硬件复位 ≥10ms → 软件复位后等待 120ms → 退出睡眠后等待 120ms → 显示开前等待 50ms

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 个字节的电压微调值。默认值通常偏冷或偏暖,通过调整可改善灰阶过渡与色温一致性。

伽马校正曲线对比 伽马校正曲线对比(Gamma 1.0 vs 2.2) 输入灰阶 输出亮度 Gamma 1.0 Gamma 2.2 默认 Gamma 2.2 更符合人眼感知;调整正负伽马寄存器可微调暗部/亮部细节

以下是一组经过验证的伽马寄存器配置,适用于大多数 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 时序或延时是否不足。