4. 像素点写入基础:SetWindow/SetCursor命令、GRAM写入时序、16位/18位色深写入
在LCD TFT驱动开发中,像素点写入是最基础也是最频繁的操作。理解SetWindow(又称Address Set或CASET/RASET)、SetCursor(RAMWR前的列/页地址设置)以及GRAM写入时序,是优化显示缓冲区刷新性能的前提。本章将深入剖析这些底层机制,并对比16位与18位色深写入的差异。
4.1 SetWindow / SetCursor 命令详解
大多数TFT LCD控制器(如ILI9341、ST7789、NT35510)通过窗口机制来限定GRAM写入区域。SetWindow命令通常由两个子命令组成:
- CASET (Column Address Set):设置列起始地址和结束地址。
- RASET (Row Address Set):设置行起始地址和结束地址。
SetCursor则是在窗口设定后,用于指定当前写入的起始像素位置。在连续写入模式下,硬件会自动递增列/行地址,无需每次写入都发送坐标。
关键概念: SetWindow定义了一个矩形区域,后续所有GRAM写入操作仅影响该区域内的像素。这为局部刷新、滚动、窗口裁剪提供了硬件级支持,避免了无效像素的写入,是性能优化的第一道关卡。
4.1.1 命令序列对比
| 操作 | 命令 | 参数 | 说明 |
|---|---|---|---|
| 设置列窗口 | 0x2A (CASET) | SC[15:0], EC[15:0] | 列起始地址(SC)到结束地址(EC) |
| 设置行窗口 | 0x2B (RASET) | SR[15:0], ER[15:0] | 行起始地址(SR)到结束地址(ER) |
| 写入GRAM | 0x2C (RAMWR) | 像素数据流 | 连续写入,地址自动递增 |
| 设置光标(部分IC) | 0x2E (RAMRD) | 列/行地址 | 用于读GRAM时的光标定位 |
4.2 GRAM写入时序
GRAM写入时序决定了像素数据从MCU传输到LCD内部显存的速度。典型的写入时序分为命令阶段和数据阶段。对于SPI接口,时序表现为片选(CS)拉低、命令/数据标志(DC)切换、时钟(SCLK)边沿采样数据(SDA)。对于并行8080接口,则涉及WR、RD、RS、CS等控制信号。
优化要点: 连续写入时,只需在开始时发送一次SetWindow命令,然后连续发送像素数据。避免在每像素间插入命令,可大幅提升吞吐量。
4.3 16位色深写入
16位色深(RGB565)是单片机驱动TFT最常用的格式。每个像素占用2字节,颜色分量分布为:R[4:0] 5位、G[5:0] 6位、B[4:0] 5位。写入时,MCU按大端或小端顺序发送两个字节。
4.3.1 RGB565 数据打包
// RGB565 像素打包示例
uint16_t rgb565_pixel(uint8_t r, uint8_t g, uint8_t b) {
return ((r & 0xF8) << 8) | // R[7:3] -> bit[15:11]
((g & 0xFC) << 3) | // G[7:2] -> bit[10:5]
((b & 0xF8) >> 3); // B[7:3] -> bit[4:0]
}
注意: 部分LCD控制器要求先发送高字节(MSB first),部分要求低字节(LSB first)。务必查阅数据手册的“Memory Write Cycle”时序图,否则颜色会错乱。
4.4 18位色深写入
18位色深(RGB666)每个像素占用3字节,颜色分量各占6位。虽然人眼对18位色深的感知提升有限,但在某些高色深应用(如图像显示、渐变渲染)中仍有需求。写入时,每个像素需要传输3个字节,数据量比16位多50%。
4.4.1 RGB666 数据打包
// RGB666 像素打包示例(3字节,高位对齐)
void rgb666_pixel(uint8_t r, uint8_t g, uint8_t b, uint8_t *buf) {
buf[0] = r & 0xFC; // R[7:2] -> byte0[7:2]
buf[1] = g & 0xFC; // G[7:2] -> byte1[7:2]
buf[2] = b & 0xFC; // B[7:2] -> byte2[7:2]
}
4.5 16位 vs 18位色深对比
| 对比项 | 16位 (RGB565) | 18位 (RGB666) |
|---|---|---|
| 每像素字节数 | 2 字节 | 3 字节 |
| 颜色深度 | 65,536 色 | 262,144 色 |
| 数据带宽需求 | 低 | 高(增加50%) |
| 典型应用 | 通用UI、文字、图标 | 照片、渐变、高精度图像 |
| MCU处理开销 | 低 | 中 |
| 帧缓冲区大小(320x240) | 153,600 字节 | 230,400 字节 |
4.6 写入性能优化策略
基于上述基础,可以从以下几个维度优化像素写入性能:
- 减少命令开销:批量写入时,只在区域切换时发送SetWindow,避免逐像素发送坐标。
- 利用硬件自动递增:连续写入时,地址自动递增,无需软件干预。
- 选择合适色深:非必要场景使用16位色深,减少数据量。
- DMA传输:使用MCU的DMA模块自动搬运像素数据,释放CPU。
- SPI时钟优化:在LCD规格允许范围内,提高SPI时钟频率。
实践建议: 在STM32平台上,使用SPI+DMA+双缓冲机制,配合SetWindow局部刷新,可以将320x240全屏刷新时间从数百毫秒降低到20ms以内,达到60fps的刷新率。