使用littlevgl2rtt软件包成功点亮Art-Pi多媒体扩展版之后,一直心心念RGB屏幕接口。于是兴冲冲的下单了一块正点原子的4.3寸RGB触摸屏来用。收到屏幕之后,一路轻车熟路,配置,编译,下载,一看傻了,怎么刷屏的速度比多媒体扩展板的SPI屏还慢。有多慢,是眼见一行一行的刷新的慢!
于是,论坛翻贴,QQ群请教大佬,经过三天三夜的摸索,总算优化到一个自己比较满意的结果了。再此,要感谢各位大佬无私的提供技术支持,帮忙解决问题。现在我把过程记录下来,方便后来的小伙伴遇到相同问题的时候有解决的思路。当然,也希望有更好的方法的小伙伴们提出更好的优化方案。
开发工具:
RT-Thread Studio
OS版本:
4.0.3
开发板:
Art-Pi + 正点原子4.3寸RGB屏
软件包:
Littlevgl2rtt(latest)
温馨提示:
下面的优化方案是基于该软件包的优化,如果是自己一直lvgl的不再此讨论范围。
首先是软件包配置
硬件上要打开LCD和SDRAM
软件包配置,这里打开sample,就可以先用软件包的演示查看效果
正常情况下,这样配置后保存,编译通过,下载。就可以正常工作了。不过会发现图像切换速度非常慢,非常卡。
下面就来谈谈如何优化,RGB屏使用的是LTDC接口推屏的,这部分驱动其实rtt已经帮我们做好了,将LTDC接口封装为lcd设备,lvgl调用lcd设备接口对设备进行读写。该函数位于drv_lcd.c文件中,首先想要优化的是这个函数,不过暂时没想到要怎么优化。后面根据大佬的建议,lvlg不要通过这个接口来刷屏,而是直接刷屏,而且要开启DMA2D,用DMA2D来刷。
开启DMA2D,在stm32h7xx_hal_conf.h文件中,打开宏定义
在stm32h7xx_hal_msp.c文件中添加,硬件层初始化代码。
然后在drv_lcd.c文件中添加DMA2D软件层面的初始化代码
并且在drv_lcd_hw_init()函数中调用该初始化函数
到这里,DMA2D的初始化就算是完成了,接下来要怎么用呢?
去软件包内修改littlevgl2rtt.c文件,
首先修改littlevgl2rtt_init()函数。
屏蔽掉原有的缓存buf,因为该buf取值较小,而art-pi上有使用SDRAM,拥有较大的内存空间,我们可以直接申请和屏幕像素相对应大小的缓存空间,而且申请两个,因为lvgl支持双刷buffer。
记得屏蔽掉原来buf申请内存空间的代码
接下来改单刷buffer为双刷buffer
然后改刷屏的函数,lcd_fb_flush(),将函数中的内容全部屏蔽掉,改成一下代码。
这里提供了两种DMA2D的方式,一种是中断方式,一种是轮询方式。如果使用中断方式,需要添加DMA2D中断处理函数。
两者的区别就是,
采用轮询方式的,则一直等待DMA2D传输结束,然后通过函数lv_disp_flush_ready()函数通过LVGL已经完成刷屏。
采用中断方式的,则是在中断处理函数中调用函数lv_disp_flush_ready()函数通过LVGL已经完成刷屏。
通过上述优化之后,刷屏速度大大提高。个人已经比较满意了,可以达到项目应用的要求了。当然还有更好的方法,比如自己移植LVGL而不是使用软件包,或者是直接用DMA2D寄存器操作来刷屏,这些操作都比较高级,作为初学者的我还没学会。哪天我学会了,再来分享。或者有大佬可以共享一下教程,众乐乐一下。
再次,感谢在问题解决过程中给我提供帮助的各位大佬们!
参考文档:
LVGL 优化帧率技巧_无人等人的博客-CSDN博客
[https://blog.csdn.net/weixin_43862847/article/details/109318017]
f429 discovery开发版 LVGL移植(带操作系统)_无人等人的博客-CSDN博客
[https://blog.csdn.net/weixin_43862847/article/details/109056321]
stm32 DMA2D使用中断LVGL,提高LVGL帧率_紫枫洛天的博客-CSDN博客
[https://blog.csdn.net/a2267542848/article/details/111163633]
LVGL在rt-thread上的移植 - hechunc的个人空间 - OSCHINA - 中文开源技术交流社区
https://my.oschina.net/hechunc/blog/4535663
相关文章:
Art-Pi学习笔记10:优化多媒体扩展板的音频驱动添加录音功能
Art-Pi学习笔记9:如何使用art-pi的多媒体扩展板播放TF卡中的音乐文件
Art-Pi学习笔记9:如何为Art-pi的内部flash设置读保护
Art_Pi学习笔记8:使用AHT10温湿度模块
Art_Pi学习笔记7:自己添加硬件定时器设备HWTIMER
Art_Pi学习笔记6:驱动PWM输出
Art-Pi学习笔记5_4:在littlevgl中显示二维码
Art-Pi学习笔记5_3:在littlevgl软件包中显示中文字体
Art_Pi学习笔记5.2:LVGL模拟器安装在VS2019上的避坑指南
Art_Pi学习笔记5.1:优化LVGL软件包提高刷屏的速度
Art_Pi学习笔记5:移植LittleVGL2RTT软件包驱动多媒体扩展屏
Art_Pi学习笔记4:驱动多媒体扩展版的LCD和触摸功能
Art_Pi学习笔记3:学习驱动wifi模块AP6212
Art_Pi学习笔记2:驱动片外SPI_FLASH_W25Q128
Art-Pi学习笔记1:驱动SDIO和USB设备做TF读卡器
图很小很难看清楚,能改分享一下源码,谢谢
@muecn 按照上面的提示一步一步修改,应该不难吧。你需要哪部分的源码?
我测试你代码来 我是10寸屏 但是切换画面的时候 有扭曲也比较慢
@solomon 不同的屏可能参数上有差异,需要细微调整一些参数
我用的原子的4.3寸RGB 800*480屏幕
,触摸功能老师不正常 是什么原因呢,GT9147初始化正常 LCD显示正常
@MCU1680 你看看初始化中的打印信息,是不是有正确打印出9147的ID来。我手头的屏幕也是正点的,但是触摸IC被换了,不是9147.要相应的修改触摸部分的驱动代码。
@MCU1680 这是我的打印消息,触摸芯片被换成了1158
这么优化完帧率还是很低,是ART-Pi外置SRAM的限制么
博主,想求一份littlevgl2rtt.c这个代码,拜托了
@FranHawk 你参考一下吧,这是代码内容,注释部分转码的时候搞丢了。所以中文部分变乱码。代码倒是没问题。
设置完DMA2D后,屏幕一直是白屏,又遇到过吗?
@WGH_799 没有,可以试试先不开dma2d的,调通了,在开dma2d。一步一步来,步子太大,容易…
图片确实有点糊,但是楼主牛啊😄
太厉害啦,哥们儿
博主,我最近刚学这LVGL,我看你给的csdn链接中,有个作者在终端中会加一个标志位(stm32 DMA2D使用中断LVGL,提高LVGL帧率_紫枫洛天的博客-CSDN博客)
if(g_gpu_state==1){
g_gpu_state = 0;
lv_disp_flush_ready(&g_disp_drv);
}
这个标志位有必要加吗,我的项目的话如果加上可能会出现 lv_disp_flush_ready(&g_disp_drv);这个代码运行不到的情况,导致在lvgl代码中有个while判断代码一直判断进而导致lvgl线程运行不下去,去掉就好了😭,不知道为什么不知道博主有什么思路吗