前言
随着物联网、智能家居、智能控制等行业的极速发展,小而美的且反应迅速且成本低的,模块化,定制化的嵌入式系统的需求越来越大,其中降低使用要求,提高用户体验,人机交互是一个非常好的方法,所以本文记录的是调试rtthread+lcd+littlevgl GUI的记录及流程
一、资源介绍
硬件是自行画的PCB板,资源如下
- MCU:STM32F407ZGT6
- LCD:3.2寸320*240分辨率,驱动芯片:ILI9341。 引脚除了RESET和背光控制引脚,其他引脚连接均和正点原子的STM32F407探索者开发板兼容
- 使用FSMC接口驱动
软件是使用rtthread studio1.1.5版本
二、配置过程
添加littlevgl2rtt软件包
配置如下
其中DPI计算方法:
用勾股定理,比如5寸屏(屏幕的寸数就是对角线的长度),1080*1920分辨率,dpi就是sqrt(1080^2 + 1920^2) / 5=440。
所以我的计算得到是125
LCD屏幕配置及驱动注册请参考上一篇
RT-Thread学习笔记系列之LCD驱动及emwin示例(2)
保存编译无误下载屏幕却没有任何显示,LCD屏幕是验证过的,这个软件包也有很多人使用过(头大,没办法只能一步步分析了)
分析过程
-
方法:
- 先参考别人使用这个软件包的例子和过程
- 对比两者之间的区别
- 参考官方的demo和文档介绍
-
查找过程:
- 这个软件包作者是在RT1050 fire的板子,lcd为800*480进行测试
- 官方有使用ART-PI开发板进行直播使用过
- 论坛也有很多小伙伴也是直接使用ART-PI开发板直接使用BSP驱动成功过
- 我手上有ART-PI开发板但是屏幕接口不兼容无法直接验证,既然别人一步成功,那却别肯定是驱动或者接口方面的问题,自己直接创建一个art-pi模板的BSP工程,使能LCD驱动,对比两者的区别,再对比接口的区别。任何屏幕显示底层无非都是打点,刷新,显示打开这几个步骤。所以最终找到了区别如下:
-
区别
- ART-PI的LCD驱动的结构体有使用到官方对图像定义的rt_device_graphic_info结构体并分配了内存给指针framebuffer,所以该指针不为空,而我的LCD驱动是没有使用
- littlevgl2rtt软件包中得接口驱动文件littlevgl2rtt.c中初始化函数littlevgl2rtt_init对刷新回调函数是有做区分的
- 官方的示例文件中的介绍
-刷新函数lcd_fb_flush和lcd_flush的区别
static void lcd_fb_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p)
{
int x1, x2, y1, y2;
.
.//中间代码省略
.
rt_device_control(device, RTGRAPHIC_CTRL_RECT_UPDATE, &rect_info);
lv_disp_flush_ready(disp_drv);
}
static void lcd_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p)
{
int x1, x2, y1, y2;
.
.//中间代码省略
.
//TODO color convert
for (y = act_y1; y <= act_y2; y++)
{
rt_graphix_ops(device)->blit_line((const char *)color_p, act_x1, y, act_x2 - act_x1 + 1);
color_p += (x2 - x1 + 1);
}
}
发现我的驱动使用的刷新函数没有lv_disp_flush_ready(disp_drv);没有通知图形库,在lcd_flush函数的最后面加上这句就好了,然后编译下载
显示正常了,说明驱动已经成功,但是每个窗口太大了(按照计算方法确实是125,可能长宽比原因littlevgl认为这样是最佳的显示把),调节一下DPI为80(本人不断的调节认为比较好的一个数值),显示比较合理
总结
- 遇到问题不要灰心,不要放弃,白嫖党是没有竞争力的,成为有竞争力的人是你能去解决问题
- 如果有现成的例子,对比法是简单有消的方法
- 先要清楚原理,就像LCD屏幕底层就是打点,打开显示等几个步骤,可以通过断点或log判断是否有执行
- 多看官方的文档和demo,官方的一般都是比较严格可靠的,细心点查找避免忽略重要的信息