LVGL颜色失真问题
(常见于某些显示屏),而默认情况下小端系统会先发送低位字节,导致颜色错乱。某些硬件允许通过 SPI 寄存器配置字节序(如 STM32 的。面向字节的接口会按内存顺序发送数据。方式存储:低位字节在前,高位字节在后。按小端顺序发送字节(低位字节先发送),适用于。在 LVGL(LittlevGL)图形库中,,可解决因字节序不匹配导致的颜色失真问题。LVGL 会在发送 16 位颜色时。每个像素用 16 位
在 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):
按小端顺序发送字节(低位字节先发送),适用于 显示器兼容小端格式 的场景。
如何判断是否需要启用?
-
观察颜色失真现象:
- 若颜色异常(如绿色显示为紫色,或整体偏色),可能是字节序不匹配。
- 尝试绘制纯色(如红色
0xF800),观察实际显示结果是否匹配预期。
-
检查硬件文档:
- 查看显示屏的 数据手册,确认其 RGB565 的字节接收顺序(高位优先还是低位优先)。
- 例如:某些 ST7789 显示屏要求高位字节先发送。
-
测试配置:
- 在
lv_conf.h中修改LV_COLOR_16_SWAP的值(0 或 1),编译后观察颜色是否正常。
- 在
配置步骤
- 打开
lv_conf.h(通常位于lvgl/lv_conf.h)。 - 找到
LV_COLOR_16_SWAP定义:#define LV_COLOR_16_SWAP 0 /* 0: 不交换,1: 交换字节 */ - 根据硬件需求修改为
1或0,例如:#define LV_COLOR_16_SWAP 1 /* 启用字节交换 */ - 重新编译代码,验证显示效果。
其他相关配置
-
颜色格式设置:
确保lv_conf.h中颜色深度配置正确:#define LV_COLOR_DEPTH 16 /* 16 位色(RGB565) */ -
SPI 字节序配置:
某些硬件允许通过 SPI 寄存器配置字节序(如 STM32 的SPI_InitStruct.SPI_FirstBit),需与LV_COLOR_16_SWAP配合使用。
示例:STM32 + SPI 显示屏
假设硬件为 小端系统,但显示屏要求 高位字节先发送:
-
默认情况(无交换):
- 颜色值
0x1234内存为[0x34, 0x12]。 - SPI 发送顺序:
0x34 → 0x12,导致颜色错误。
- 颜色值
-
启用
LV_COLOR_16_SWAP = 1:- LVGL 交换字节,发送顺序
0x12 → 0x34,匹配显示屏需求。
- LVGL 交换字节,发送顺序
通过合理配置 LV_COLOR_16_SWAP,可解决因字节序不匹配导致的颜色失真问题。
更多推荐



所有评论(0)