在 LVGL(LittlevGL)图形库中,LV_COLOR_16_SWAP 宏用于解决 RGB565 颜色格式的字节序问题,尤其是在通过 SPI/I2C 等字节流接口传输时。以下是详细解释和配置建议:


问题背景

  • RGB565 格式
    每个像素用 16 位表示,结构为 RRRRRGGGGGGBBBBB(5+6+5 位)。
    在内存中,16 位值以 小端(Little Endian) 方式存储:低位字节在前,高位字节在后。例如:

    • 颜色值 0x1234(二进制 00010010 00110100)在内存中存储为 [0x34, 0x12](两个字节)。
  • SPI/I2C 传输特性
    面向字节的接口会按内存顺序发送数据。假设显示器期望 高位字节先到达(常见于某些显示屏),而默认情况下小端系统会先发送低位字节,导致颜色错乱。


LV_COLOR_16_SWAP 的作用

  • 启用 LV_COLOR_16_SWAP = 1
    LVGL 会在发送 16 位颜色时 交换两个字节的顺序。例如:

    • 原颜色值 0x1234(内存 [0x34, 0x12])会被交换为 [0x12, 0x34],按高位字节优先发送。
    • 适用于 显示器要求高位字节先到达 的场景。
  • 默认不启用(LV_COLOR_16_SWAP = 0
    按小端顺序发送字节(低位字节先发送),适用于 显示器兼容小端格式 的场景。


如何判断是否需要启用?

  1. 观察颜色失真现象

    • 若颜色异常(如绿色显示为紫色,或整体偏色),可能是字节序不匹配。
    • 尝试绘制纯色(如红色 0xF800),观察实际显示结果是否匹配预期。
  2. 检查硬件文档

    • 查看显示屏的 数据手册,确认其 RGB565 的字节接收顺序(高位优先还是低位优先)。
    • 例如:某些 ST7789 显示屏要求高位字节先发送。
  3. 测试配置

    • lv_conf.h 中修改 LV_COLOR_16_SWAP 的值(0 或 1),编译后观察颜色是否正常。

配置步骤

  1. 打开 lv_conf.h(通常位于 lvgl/lv_conf.h)。
  2. 找到 LV_COLOR_16_SWAP 定义:
    #define LV_COLOR_16_SWAP  0  /* 0: 不交换,1: 交换字节 */
    
  3. 根据硬件需求修改为 10,例如:
    #define LV_COLOR_16_SWAP  1  /* 启用字节交换 */
    
  4. 重新编译代码,验证显示效果。

其他相关配置

  • 颜色格式设置
    确保 lv_conf.h 中颜色深度配置正确:

    #define LV_COLOR_DEPTH 16  /* 16 位色(RGB565) */
    
  • SPI 字节序配置
    某些硬件允许通过 SPI 寄存器配置字节序(如 STM32 的 SPI_InitStruct.SPI_FirstBit),需与 LV_COLOR_16_SWAP 配合使用。


示例:STM32 + SPI 显示屏

假设硬件为 小端系统,但显示屏要求 高位字节先发送

  1. 默认情况(无交换)

    • 颜色值 0x1234 内存为 [0x34, 0x12]
    • SPI 发送顺序:0x34 → 0x12,导致颜色错误。
  2. 启用 LV_COLOR_16_SWAP = 1

    • LVGL 交换字节,发送顺序 0x12 → 0x34,匹配显示屏需求。

通过合理配置 LV_COLOR_16_SWAP,可解决因字节序不匹配导致的颜色失真问题。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐