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 写操作包含以下步骤:
- 拉低 CS,选中芯片。
- 设置 DC 电平:命令(0)或数据(1)。
- 在 SCLK 驱动下,通过 SDA 逐位发送 8 位数据(MSB first)。
- 拉高 CS,结束传输。
1.4 典型电路连接
下图展示 ST7789 与 MCU(以 ESP32 为例)的典型 4 线 SPI 连接方案。该方案仅需 5 根信号线 + 电源/地,适合嵌入式项目快速原型开发。
电路设计要点:
- 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 控制或像素格式设置。