1. 花屏现象的本质:像素数据错位、颜色通道翻转、扫描顺序错误

做嵌入式 GUI 开发,最让人头疼的问题之一就是花屏。你辛辛苦苦把界面画好了,烧进去一看——满屏的彩色条纹、颜色不对、图像撕裂。说实话,我第一次遇到花屏时,第一反应是硬件坏了。后来才发现,绝大多数花屏问题,根源就那么几个。

今天我们就来扒一扒花屏的本质。搞懂了这些,你至少能解决 80% 的显示异常。

1.1 像素数据错位

什么叫像素数据错位?说白了,就是显存里的数据跟屏幕上的像素点没对上号。

每个像素点由若干字节组成。比如 RGB565 格式,一个像素占 2 个字节。如果数据错位了,原本属于 (x, y) 的像素数据,跑到了 (x+1, y) 的位置上。结果就是整个画面像被“推”了一下,出现斜向的彩色条纹。

核心原因:LVGL 的缓冲区地址、大小、像素格式三者不匹配。

我遇到过这样一个案例:客户用 STM32F429 驱动 480×272 的屏幕,LVGL 配置了 3 个 480×10 的缓冲区。看起来没问题对吧?结果一运行,屏幕下半部分全是彩色噪点。查了半天,发现是 DMA2D 传输时,源地址计算错了——每行跳过的字节数没对齐。

常见的像素数据错位场景:

  • 缓冲区地址未对齐——有些 MCU 要求缓冲区地址 4 字节或 8 字节对齐
  • 缓冲区大小不足——LVGL 需要至少 1/10 屏幕大小的缓冲区
  • 像素格式不匹配——LVGL 配置的是 RGB565,但 LCD 驱动用的是 RGB888
  • DMA 传输参数错误——源地址、目标地址、行偏移没算对

我的习惯:每次配置 LVGL 显示驱动时,先用一个纯色填充函数测试。如果纯色显示正常,再加载 LVGL。这样能快速排除硬件驱动问题。

1.2 颜色通道翻转

颜色通道翻转,就是 RGB 的顺序搞反了。你想想看,屏幕期望的是 RGB,但你送过去的是 BGR。结果红色变成蓝色,蓝色变成红色,整个画面像开了“反色滤镜”。

为什么会这样?

很多 LCD 控制器默认是 RGB 顺序,但有些屏的物理排线是 BGR。LVGL 本身不关心这个,它只管把颜色值写进缓冲区。真正决定颜色顺序的,是 LCD 驱动 IC 的寄存器配置。

颜色顺序 像素数据(RGB565) 显示效果
RGB R[4:0] G[5:3] G[2:0] B[4:0] 正常
BGR B[4:0] G[5:3] G[2:0] R[4:0] 红蓝互换
GBR G[4:0] B[5:3] B[2:0] R[4:0] 严重偏色

我曾经在一个项目里,用 ILI9341 驱动 320×240 的屏。LVGL 显示红色按钮,结果出来是蓝色。我当时还以为是 LVGL 的 color 宏定义错了。后来用逻辑分析仪抓了 SPI 数据,才发现是 ILI9341 的 MADCTL 寄存器里 RGB/BGR 位没设置对。

避坑指南:我曾经在切换不同批次屏幕时,忘了检查颜色顺序。同一款屏,不同批次可能颜色顺序不同。建议在驱动初始化时,加一个颜色顺序检测函数——显示纯红、纯绿、纯蓝,肉眼确认。

1.3 扫描顺序错误

扫描顺序,就是像素点从显存到屏幕的“行走路线”。

正常情况下,屏幕从左到右、从上到下扫描。但如果扫描顺序错了,画面可能上下颠倒、左右镜像,甚至对角线翻转。

LVGL 的坐标系统是固定的:左上角是 (0,0),x 向右增加,y 向下增加。但 LCD 驱动 IC 的扫描方向可以通过寄存器配置。如果两者不一致,就会出现问题。

常见的扫描顺序问题:

  • 上下颠倒——LVGL 的 (0,0) 在左上,但 LCD 从右下开始扫描
  • 左右镜像——LVGL 从左到右,但 LCD 从右到左
  • 行列交换——LVGL 按行扫描,但 LCD 按列扫描

我记得有个项目,用 ST7789 驱动圆形屏幕。LVGL 画了一个圆,结果显示出来是椭圆。查了三天,发现是扫描顺序导致 x 和 y 的步长不一样。最后在驱动初始化里,把 MADCTL 寄存器的 MV 位(行/列交换)置 1,问题就解决了。

关键点:扫描顺序错误通常表现为“画面整体偏移”或“图像拉伸/压缩”,而不是局部花屏。如果你看到整个画面歪了,先检查扫描顺序。

1.4 三种问题的关系

这三种问题经常同时出现。比如像素数据错位 + 颜色通道翻转,画面会又花又偏色。扫描顺序错误 + 像素数据错位,画面会像被“揉”过一样。

下面这张图,帮你理清它们的关系:

花屏问题分类与关系 花屏问题本质分类 花屏现象 像素数据错位 地址/大小/格式不匹配 颜色通道翻转 RGB/BGR 顺序错误 扫描顺序错误 方向/镜像/行列交换 症状:彩色条纹 / 颜色错乱 / 图像撕裂 / 画面偏移 / 偏色 排查方向:缓冲区配置 → 驱动寄存器 → 像素格式 → 扫描方向 Step 1: 检查缓冲区 Step 2: 检查颜色顺序 Step 3: 检查扫描方向

1.5 快速定位方法

遇到花屏,别慌。按这个顺序排查:

  1. 先看现象——是整体偏色还是局部花?是图像撕裂还是画面偏移?
  2. 检查缓冲区——地址对齐了吗?大小够吗?格式一致吗?
  3. 检查颜色顺序——用纯色测试,看红蓝是否互换
  4. 检查扫描顺序——用 LVGL 画一个箭头或文字,看方向是否正确

我的小技巧:在 LVGL 初始化完成后,立即显示一个“测试界面”——包含红绿蓝三个色块、一个箭头、一段文字。这样一眼就能看出是哪种问题。这个测试界面我用了好几年,帮我省了无数排查时间。