ST7789 屏幕初始化踩坑记录
补档说明:屏幕模组批次和面板偏移可能不同,下面记录的是排查顺序与验证方法,不是一份可以盲抄的万能初始化表。
第一次点亮 ST7789 时,我把“白屏”理解成初始化命令有误,连续换了三份网上的寄存器表。后来发现复位脚焊接不稳,命令根本没有可靠进入芯片。修好之后画面又整体偏移、红蓝互换,才意识到白屏、错位、偏色和花屏分别属于不同层级,混在一起排查只会来回试参数。
第一步只验证电气事实
先不运行图形库,只执行硬复位和整屏填色。确认逻辑电平、背光供电、复位低电平宽度以及 CS/DC 的变化。示波器上要看的是屏幕引脚附近的信号,不是 MCU 焊盘。排线会带来振铃,面包板上的 40 MHz 能工作并不代表量产板也稳定。
我把 SPI 频率降到 10 MHz,发送固定的 0x00、0xFF 和交替字节,用逻辑分析仪确认 CPOL/CPHA、位序与 DC 切换。只有这一层可靠之后,才把频率逐步提高。
初始化表需要有来源
初始化命令被整理成带注释的数组,每条都包含参数长度和命令后延迟,不再散落在函数中。重点核对四项:睡眠退出后的等待、颜色模式 COLMOD、内存访问控制 MADCTL、可视窗口的列行地址。
write_cmd(0x11); // Sleep Out
delay_ms(120);
write_cmd_data(0x3A, 0x55); // RGB565
write_cmd(0x29); // Display On
有些 240×240 模组内部使用 240×320 控制空间,实际窗口需要 Y 偏移。旋转方向改变后,偏移也可能随坐标轴交换。为此我给每种旋转保存 x_offset、y_offset、宽高和 MADCTL 值,而不是在绘图代码里补神秘常数。
用测试图而不是看照片
整屏画红、绿、蓝可以确认像素格式和字节序;四角不同颜色可以确认方向与偏移;一像素网格能暴露窗口边界;渐变则适合发现低位丢失。测试图由驱动直接绘制,绕开 LVGL 缓冲区,避免同时调两套系统。
红蓝互换最终由 MADCTL 的 BGR 位解决。偶发花屏来自 DMA 缓冲区生命周期:传输还没完成,上一块缓冲已经被重写。改为双缓冲并在完成回调后归还所有权,画面才稳定。
交付前检查
- [x] 冷启动、软复位和深睡唤醒均能点亮
- [x] 四种旋转方向的边界与触摸坐标一致
- [x] 纯色、棋盘格、渐变测试图无偏色和缺线
- [x] 最高目标频率在高低温与长排线条件下回归
- [x] DMA 缓冲区位于兼容内存,生命周期可追踪
- [x] 背光亮度由独立 PWM 控制,关屏不等于停刷
这次记录让我形成了固定顺序:供电与复位、总线波形、最小初始化、窗口与像素、缓冲与图形库。屏幕问题看起来都发生在同一块玻璃上,原因却横跨多个层级。一次只证明一件事,往往比收集更多初始化代码有效。
评论区