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命令,然后连续发送像素数据。避免在每像素间插入命令,可大幅提升吞吐量。
GRAM写入时序(SPI模式) CS DC SCLK SDA 命令(0x2C) 参数1 参数2 参数3 参数4 像素数据流 DC=0 表示命令,DC=1 表示数据;连续像素数据阶段无需额外命令

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时钟频率。
像素写入性能优化决策流程 开始像素写入 是否全屏刷新? SetWindow(0,0,W,H) SetWindow(x,y,w,h) DMA连续写入像素数据流
实践建议: 在STM32平台上,使用SPI+DMA+双缓冲机制,配合SetWindow局部刷新,可以将320x240全屏刷新时间从数百毫秒降低到20ms以内,达到60fps的刷新率。