HLK-W801-LVGL8之LCD驱动
前言
接着开始第二部分,LCD驱动的移植工作
链接:第一部分源码移植
这一篇主要说明在LCD移植中的思路及遇到问题的解决方案
LCD驱动思路
-
了解显示驱动芯片的基本使用和寄存器的说明
显示屏的默认参数为:尺寸:240 RBG x320 dots; 默认水平240,垂直320
使用16bit数据接口并口驱动(8080并口),控制时序
显示屏的初始化配置,电源相关,显示基本参数(显示方向,帧率,时钟等)这些相关寄存器说明
-
移植平台GPIO驱动到显示驱动芯片的适配与调试
主要为GPIO的驱动移植,参考硬件引脚,需要完成控制IO和16bit并口IO驱动读写,这里考虑到IO设置执行速度,未使用SDK中的IO应用接口,而是重新通过宏定义方式来完成GPIO的驱动设置
W801的IO驱动重写
GPIO主要包括IO的读写方向配置,读IO数据,写IO数据等接口,这个接口主要放在平台的驱动文件中lv_env文件夹的lv_env.h里定义实现
- IO引脚定义,参考前面文章的硬件接口宏定义;
- 读写方向配置,读IO数据,写IO数据接口宏定义
- 16bit并口数据读写接口宏定义
ILI9325显示驱动数据访问接口
1)并口数据读写访问接口封装, 函数采用inline关键子定义,放在平台驱动lv_env.h中
2) lv_drv_conf.h中并口驱动的适配,这里和官方接口有不同,在CS定义直接通过宏定义区分置高或置低的操作,增加读数据的宏定义
3)显示驱动芯片ILI9325的接口实现,目前只需实现init和flush接口就可以基本满足显示要求;下面主要说明一下flush函数的实现,这个是disp接口的关键,
lv_port_disp_init中初始化显示驱动实例,其中
#define MY_DISP_HOR_RES 240
#define MY_DISP_VER_RES 320
编译调试硬件接口
1) 首先要确认硬件接线的正确性,因为涉及的杜邦线连接W801和TFTLCD板,容易线序错误,这里在仔细检查后,在通过读取驱动芯片ID方式来验证接线的正确性
读取ILI9325的00寄存器若正确可以返回ID,这样就可以确保接线的对的,如果这里显示都不对后续的工作也无法进行;
当然这里的调试也是比较花时间的,也包括了IO驱动控制逻辑的调试,时序调试要求满足规格书要求,详细参考上面的[W801的IO驱动重写]章节,已经过多次调试测试调整
如图所示下载后读取ID成功,显示为9325,表示硬件连接基本上没问题
LVGL的接口调用
1) 依据文档的参考,由于SDK中基于Freertos,这里的心跳接口lv_tick_inc(1)放入系统tick钩子回调函数中 (注意在配置文件中TickHook的选项需是能)
2) 创建gui的显示任务,负责lv_task_handler的调用,5ms延时调用一次
3) 另外针对手上的这个TFTLCD还需注意一下参数配置,lv_port_disp_init(void)中LCD的水平尺寸为 240,垂直尺寸为320,
调试中主要问题记录
- 一开始编译调试下载,看到屏幕是这样子的,LCD显示满满的花屏,因为前面已经确定硬件接线是OK的,所以主要排查软件配置,驱动和接口问题了;
- 一通排查后,发现初始化部分设置错误,这个驱动芯片ILI9325版本比较低,在帧率设置中不支持最大值0x0E的配置,找了几个不同版本的ILI9325数据手册对比,早期版本只支持到0x0D,
- 结果一修改,图片就显示得比较正常了。
- 上部和底部像素还是乱得,检查代码发现lv_conf.h 前面在设置时打开了MONIOR功能,这里的花屏应该时局部刷新不对
这时把问题定位到flush函数实现上了,结果发现存在bug,只指定坐标开始,并未指定区域,这应该是问题所在了,
原来是这样子的:
修改后增加填充区域位置坐标指定
编译下载运行,终于显示驱动大功告成