[STM32U5]

【NUCLEO-U5A5ZJ-Q测评】7.基于STM32U5移植lvgl

[复制链接]
2080|12
手机看帖
扫描二维码
随时随地手机跟帖
Tristan_C|  楼主 | 2023-12-4 10:25 | 显示全部楼层 |阅读模式
本帖最后由 Tristan_C 于 2023-12-4 11:01 编辑

#申请原创#
基于STM32U5移植lvgl

LVGL是一个高度可裁剪、低资源占用、界面美观且易用的嵌入式系统图形库,对硬件的要求比较低,可以较为流畅的运行在单片机上。不依赖特定的硬件平台,可以在任何显示屏上运行,并且完全开源,对按钮,触摸,编码器旋钮等支持的非常到位。
开源代码可以官网下载,可以下到当前最新的8.3.10版本
HYPERLINK "https://github.com/lvgl/lvgl/tree/release/v8.3"
adfa001bfcbb493c320436441ce09333
移植使用时,主要用到下面框起来的四个文件或者文件夹
5a9d9985443f70ff07656e94dbcbb10c
他们的主要用的内容和作用为:
examples
一些演示例程和可以用到的接口函数
src
LVGL的源码,最重要的内容
lv_conf_template.h
LVGL配置文件,用来裁剪控制LVGL的功能,通常重命名为lv_conf.h
lvgl.h
LVGL用到的一些头文件的声明
下面就在代码文件夹新建lvgl文件夹,用于放上面四个文件和文件夹
148f81537c2d005aa5e7ad476858b35c
将他们拷贝进去
05527c591cb34d0f7da2418889a95e86
接下来需要看一下keil的配置,因为LVGL是基于C99编写的,所以keil编译时一定要选择C99模式编译,不选择的话我的工程默认使用的是C11模式,所以有可能会出比较多的编译错误
5a942f56b770968d2cdb98da5b1c2df9
3a2f1df5103d2f5815b80c77eb89278f
然后给项目添加下面的lvgl相关的文件夹
019820ab921694c25313151789d52d45
然后添加user_lvgl_port文件夹的相关文件,这里只添加显示的lv_port_disp_template,因为没有输入和文件系统,因此另外两个实际上添加了后面也没用用上。
386c75442c76d47be5916e27459f64da
接下来添加中断的user_lvgl源代码,也就是添加lvgl下面src文件夹的下列文件夹中的所有文件,包括extra(实际上可能不用,但为了后续编译免去麻烦全都加上)
adfc18ae2fad04360638ac73ea3b6fe6
添加头文件路径
969ae3f1424eca4fb1283dcc162d90d0
添加LV_CONF_INCLUDE_SIMPLE到编译器预处理中,以使用lv_conf.h文件
163bcfa94659e266021226533588f855
修改头文件lv_port_disp_templ.h的预编译宏定义打开功能
9635c69890b672b129dcc89b03986502
修改头文件lv_port_disp_templ.c的预编译宏定义打开功能
14f56103e2ed4107b13dd5e6f6adcbce
添加液晶底层驱动的头文件,这里使用的是ILI9431
caec7cc8a3584bfa11018b1385ed3cb6
接下来修改这个lv_port_disp_init中的disp_init函数内容
87620f49099b2ba0378a5510d6ea6720
在这里,将我们的LCD初始化的部分放到这里,当然,也可以放在别处,也行,但是必须要在确保在lvgl初始化之前调用,这里我们就不在这里做初始化,而分开操作。
523125476fc6779443b94822225014a9
下面选择显存方式,代码提供了3中方式,这里选择方式1,因此下面这两个Example测试代码通过预编译注释掉
ef4be2e454373c3543129c0075808904
修改disp_flush函数的填充功能函数为LCD驱动(ILI9431)的描点函数
fe20e3faffb2749c2c1ae4051353bb73
将lv_conf_template.h修改为lv_conf.h
32306b1de76c6918af98a39fc473ca9f
并修改里面的宏定义预编译,将其功能打开
d4b2e84f9ad193207079b51f826013a1
在文件末尾增加屏幕大小定义
18224841eef30df02659abfca42b1d8a
下面这两个宏在调试阶段也可以打开,这是用来在屏幕上显示帧数和MCU占用、内存占用的。
a555ac67f1e7cb5a3695ef5e923bf324
main函数增加头文件
144f32e0de01861a272bffe5842ddba9
还需要一个在嘀嗒定时器里加一个定时函数进行刷新(这里也注意添加头文件)
f28fb36bfa4926b513b7fd9512148d7a
在主函数中对lvgl先进性初始化,要注意,前面有提到,ILI9431初始化需要在lvgl初始化之前进行
0612fbf36e44795ce5090a48fdee7f5f
然后增加两个显示label标签,显示ST和21ic的一些信息
e1fa6d265944cb6c86aae46fccf89c61
并在main函数中增加一个在lv_port_disp_init函数之后调用
0b7ecf31f3930dea2b072beac3a5e01b
主循环中,增加lvgl的处理函数lv_task_handler以及延时
5d3fd36aa55fe3cc91fa80286eb083a7
其中 LV_DISP_DEF_REFR_PERIOD 为其刷新时间周期,在lv_conf.h文件中定义,该参数决定帧率。
4ad4c678cd23aa09013b65a7c71d4595
编译下载运行
41e4ec2398573fd3ab1cac462fff8f81
0aab9178afdcd57bce51d7194ab582f6
104bad74e7bfd1373c71e6f910fc4f8d
从图中看起来,刷新率配置还不算高,刷新太慢了,但CPU占用率已经相当高,这主要是因为屏幕驱动方式以及代码本身优化程度,造成了MCU的占用率不理想,待后续进行更多的优化。
显示效果见视频


使用特权

评论回复
mmbs| | 2023-12-7 21:59 | 显示全部楼层
需要编写代码来创建和操作LVGL的界面元素,如按钮、文本框、列表等。

使用特权

评论回复
mollylawrence| | 2023-12-8 10:30 | 显示全部楼层
对硬件的要求比较低,可以较为流畅的运行在单片机上。

使用特权

评论回复
plsbackup| | 2023-12-8 16:09 | 显示全部楼层
可以在LVGL的官方网站上下载到当前最新的版本。

使用特权

评论回复
dspmana| | 2023-12-8 20:54 | 显示全部楼层
需要修改LVGL源代码中的相关函数,如lv_disp_drv_t等。

使用特权

评论回复
gygp| | 2023-12-9 14:20 | 显示全部楼层
注意不要一次性加载过多的界面元素,以免占用过多的内存和CPU资源。

使用特权

评论回复
sheflynn| | 2023-12-9 16:10 | 显示全部楼层
LVGL可以在MCU CLOCK RATE ≥ 15Mhz,Flash/ROM ≥ 180kB,RAM等性能以上的单片机上正常运行

使用特权

评论回复
everyrobin| | 2023-12-9 22:46 | 显示全部楼层
LVGL是一个高度可裁剪、低资源占用、界面美观且易用的嵌入式系统图形库

使用特权

评论回复
sesefadou| | 2023-12-10 17:54 | 显示全部楼层
在移植过程中需要确保硬件平台和驱动接口与LVGL的要求一致。

使用特权

评论回复
51xlf| | 2023-12-12 11:28 | 显示全部楼层
为LVGL分配足够的内存空间。              

使用特权

评论回复
HonestQiao| | 2023-12-12 14:06 | 显示全部楼层
我分享的这篇 【NUCLEO-U5A5ZJ-Q测评】驱动DFRobot高清彩屏使用lvgl显示动态仪表盘 ,是运行在NUCLEO-U5A5ZJ-Q的Zephyr系统上的LVGL实例,丝滑流畅,效果一级棒!!!

可以参考一下!

使用特权

评论回复
alvpeg| | 2023-12-12 15:11 | 显示全部楼层
需要对lvconf.h文件进行配置,以选择你需要的lvgl组件和功能。

使用特权

评论回复
Tristan_C|  楼主 | 2023-12-12 15:23 | 显示全部楼层
HonestQiao 发表于 2023-12-12 14:06
我分享的这篇 【NUCLEO-U5A5ZJ-Q测评】驱动DFRobot高清彩屏使用lvgl显示动态仪表盘 ,是运行在NUCLEO-U5A5Z ...

好的,乔帮主,多谢提点。我这个总感觉哪里没弄对,抽时间参考你的大作再看看哪里可以优化的。第一次玩ui,还不太会,哈哈

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

117

帖子

1

粉丝