【前言】
这几天我在开STM32F769的GUI显示,前面我分享了st7789的驱动、优化、lvgl的移植、GT911的驱动移植等内容。昨天我用LVGL设计工具设计好界面后,跑起来时,发现颜色不对。经过多次偿试,最终把颜色给调对了,现在记录并分享如下。
【事因缘起】
1、我使用Gui_Guider设计好界面原图:
我上传到开发板后实际的效果:
很明显颜色对不上号。
【问题排查】
1、我首先去查找了一下lvgl像素点的结构体,我使用的是16bit颜色,lvgl的颜结构体如下:
typedef union { struct { #if LV_COLOR_16_SWAP == 0 uint16_t blue : 5; uint16_t green : 6; uint16_t red : 5; #else uint16_t green_h : 3; uint16_t red : 5; uint16_t blue : 5; uint16_t green_l : 3; #endif } ch; uint16_t full; } lv_color16_t;
我使用spi数据传输为16bit发送,那么我发送的就应该是BGR格式。
我首先偿试使用 LV_COLOR_SWAP=1,交换一下格式,虽然从色值上看是行不通的,也只是试一下,修改后,发现显示不正常。
2、于是开始找资料,查找st7789的颜色通道值,首先想到的是修改0x3A寄存器的值,原来我的驱动的值 为0x65,开始找到的资料是修改为0x08,不对,后面修改为0x68也不对。经过好多次的偿试都是失败的。
【解放方法】
最后我找出了卖屏商家给出的GD32的驱动,我找到他lcd_int的函数,全部修改成他的参数。下载后,一切正常了。
【问题分析】
我使用文件对比工具对前后面的两个驱动文件进行了对比,发现主要有几个参数不一样:
经过分析,最后定位到了0x3A的寄存器上面的不同。在st7789对这个寄存器的介绍中,有如下介绍:
1. 0x3A 寄存器(接口像素格式设置) 功能:设置显示颜色深度和数据格式。 常见值: 0x05:16 位 RGB565 格式(R:5 位,G:6 位,B:5 位)。 0x55:16 位 RGB565 格式(大端模式)。 0x66:18 位 RGB666 格式(每个颜色分量 6 位)。 作用:决定屏幕如何解析输入的颜色数据,确保与 MCU 输出格式匹配。
同时我也找到的一份st7789的数据手册,他对0x3A的介绍如下:
由于我是使用spi_dma 16bit一次性写入屏中的,所以,颜色的高位先传入,因此需要把0x3A置为0x55。
【总结】
通过这次的问题查找,驱动一块屏,所需要的基础知识还是非常多的。在我们使用spi写入数据时,需要所要根据颜色的格式进行组装。在自定颜格式是,需要考虑到数据传输的方式。
最起先我是想把颜色格从565拆开,再进行组装发送进行测试的,但是那样的效率会下降很多,对cpu的资源占用过大,而且还需要占用大内存进行文件缓存。
总之,这次对lvgl的颜色不一致的问题的查找,原因分析以及最后解决问题,并进行了原因分析,使得我对st7789的驱动又提高到了一个新的高度。