ST7789驱动像素刷新与双缓冲性能调优实战 - 第1节

1.1 ST7789 芯片概述

ST7789 是一款由意法半导体(STMicroelectronics)推出的单芯片 TFT-LCD 驱动控制器,广泛用于 1.54 英寸至 2.0 英寸的小尺寸彩色显示屏。它支持 262K 色(RGB 6-6-6)显示,分辨率最高可达 240×320 像素,内部集成显示 RAM(GRAM)、电源管理电路、伽马校正和 SPI 接口控制器。

该芯片的核心优势在于:

  • 低功耗:典型工作电流约 3.5 mA(全屏刷新),休眠模式可降至 5 µA。
  • 高集成度:无需外部 RAM 或电源转换芯片,仅需少量电容即可工作。
  • 接口灵活:支持 3/4 线 SPI、8/9/16/18 位并行接口,嵌入式系统中最常用 4 线 SPI。
  • 内置帧缓冲:GRAM 容量为 240×320×18 bit ≈ 172 KB,支持窗口裁剪和局部刷新。
实战提示: ST7789 的 GRAM 采用 18 位色深(每像素 6 位 R/G/B),但多数 MCU 通过 SPI 发送 16 位 RGB565 数据,芯片内部自动转换。理解这一映射关系是后续双缓冲优化的基础。

1.2 引脚功能与典型电路

下表列出 ST7789 在 4 线 SPI 模式下最常用的引脚及其功能:

引脚名称 类型 功能描述 典型连接
CS 输入 片选信号,低电平有效 MCU GPIO
SCL 输入 SPI 时钟线 MCU SPI SCK
SDA 输入 SPI 数据线(MOSI) MCU SPI MOSI
DC 输入 数据/命令选择:0=命令,1=数据 MCU GPIO
RST 输入 硬件复位,低电平有效 MCU GPIO 或 RC 复位电路
BL 输入 背光控制(部分模块引出) MCU GPIO 或 PWM
VCC 电源 逻辑电源,典型 2.4V–3.3V 3.3V 电源
GND 电源 地 GND
常见错误: DC 引脚不能接固定电平。若将 DC 接高电平,芯片将无法接收命令,屏幕无法初始化。务必使用独立 GPIO 控制。

1.3 SPI 接口时序

ST7789 的 4 线 SPI 时序遵循标准 SPI 模式 0(CPOL=0, CPHA=0)或模式 3(CPOL=1, CPHA=1),时钟空闲电平与数据采样边沿如下:

  • 模式 0:SCLK 空闲为低,数据在上升沿采样,下降沿输出。
  • 模式 3:SCLK 空闲为高,数据在上升沿采样,下降沿输出。

一次完整的 SPI 写操作包含以下步骤:

  1. 拉低 CS,选中芯片。
  2. 设置 DC 电平:命令(0)或数据(1)。
  3. 在 SCLK 驱动下,通过 SDA 逐位发送 8 位数据(MSB first)。
  4. 拉高 CS,结束传输。
ST7789 4线SPI写操作时序图 CS DC 命令/数据选择 SCLK SDA D7 D6 D5 D4 D3 D2 D1 D0 8位数据(MSB first) 上升沿采样,下降沿输出 模式0:空闲低电平 模式3:空闲高电平

1.4 典型电路连接

下图展示 ST7789 与 MCU(以 ESP32 为例)的典型 4 线 SPI 连接方案。该方案仅需 5 根信号线 + 电源/地,适合嵌入式项目快速原型开发。

ST7789 典型电路连接(4线SPI + ESP32) MCU (ESP32) GPIO 5 → CS GPIO 18 → SCLK GPIO 23 → MOSI GPIO 2 → DC GPIO 4 → RST GPIO 16 → BL ST7789 模块 CS SCLK SDA (MOSI) DC RST BL 电源 VCC → 3.3V GND → GND 可选:RST接RC复位 BL接PWM调光
电路设计要点:
  • VCC 与 GND 之间并联 10 µF 电解电容 + 0.1 µF 陶瓷电容,滤除电源噪声。
  • RST 引脚可接 MCU GPIO 实现软件复位,也可通过 10 kΩ 电阻上拉至 VCC 并接 0.1 µF 电容到 GND 形成上电复位。
  • SPI 信号线长度尽量短(< 10 cm),避免高速时钟信号反射导致数据错误。
  • 若使用 3.3V MCU,ST7789 可直接驱动;若使用 5V MCU(如 Arduino Uno),需加电平转换芯片(如 74LVC245)。

1.5 初始化序列与验证

ST7789 上电后需发送初始化命令序列才能进入正常显示模式。以下为精简初始化代码(基于 MicroPython):

def st7789_init(spi, cs, dc, rst):
    # 硬件复位
    rst.value(0)
    time.sleep_ms(10)
    rst.value(1)
    time.sleep_ms(120)

    # 软件命令序列
    write_cmd(0x01)   # 软件复位
    time.sleep_ms(150)
    write_cmd(0x11)   # 退出睡眠模式
    time.sleep_ms(10)
    write_cmd(0x3A)   # 设置像素格式
    write_data(0x55)  # 16位色(RGB565)
    write_cmd(0x36)   # 设置扫描方向
    write_data(0x00)  # 默认方向
    write_cmd(0x29)   # 开启显示
    time.sleep_ms(10)
验证方法: 初始化完成后,向 GRAM 写入全红(0xF800)、全绿(0x07E0)、全蓝(0x001F)数据,观察屏幕是否显示对应纯色。若颜色异常,检查 SPI 时序、DC 控制或像素格式设置。