[STM32L5] 【STM32L562E-DK试用】+ lvgl移植

[复制链接]
1431|0
 楼主| latera 发表于 2025-2-16 21:04 | 显示全部楼层 |阅读模式
本帖最后由 latera 于 2025-2-17 08:34 编辑

在移植前,先准备一个已经完成了lcd 和 触摸屏的工程。我是直接使用上一篇文章通过SDK中BSP 的demo来新建的工程。具体参考方式可参考:【STM32L562E-DK试用】+ 基本功能测试 - STM32/STM8单片机论坛 - ST MCU意法半导体官方技术支持论坛 - 21ic电子技术开**坛
1. lvgl 源代码下载
lvgl 的源码下载地址为 https://github.com/lvgl/lvgl。我选择的是release/v9.2 分支下载。因为网络问题,我就直接选择用压缩包下载。也可以通过git clone 下载这个仓库。
QQ20250216-193127.png
下载解压后的文件内容如下:
QQ20250216-193550.png
Demo: lvgl 提供的各种测试样例代码
src:lvgl 基本的源代码
examples:这个文件夹其实是lvgl官网上手册对应的各种控件的测试样例。也包括移植时使用的样例源码。
lv_conf_template.h:lvgl配置样例,下面会修改名字后使用
lv_version.h: 版本信息
lvgl.h:lvgl的顶层头文件,外部引用lvgl需要包含这个头文件。

2. lvgl 代码并入BSP工程
2.1 文件复制
为了将lvgl 的文件 包含入BSP工程中,在BSP工程中可以添加一个文件夹 lvgls,并在这个文件夹下一级添加 lvgl 和 lvgl_app 2个文件夹,lvgl 用包含上面提到的3个文件夹(所有内容)和3个头文件。lvgl_app 可以用添加自己编写的代码文件。
QQ20250216-194402.png
QQ20250216-194926.png
实际examples这个文件夹,到这篇文章中并没有用到,只是为了方便移植成功后,使用这个工程可以直接添加这些文件,来测试这些例子。

将lv_conf_template.h 修改为lv_conf.h

从 lvgl/examples/porting 文件夹中复制显示设备和输入设备的接口代码文件复制到lvgl这个文件层级下。并将_template去掉。如上一幅图所示。porting文件夹内容如下所示:
QQ20250216-195511.png

2.2 MDK工程中添加文件
2.2.1 lvgl/src文件添加

src中包含了很多文件夹和文件。实际有部分文件是多余。但是为了方便以后测试,这里尽量添加多部分文件到MDK工程中。

其中:
mdk中的lvgl_src 包含src 文件夹下的lv_init.c
mdk其他添加的文件夹和 src文件夹中的子文件夹对应。需要注意的是,文件夹中还包含子文件夹(多级),除了部分文件,需要将这些文件夹中的文件都包含进MDK中。
draw中不需要添加 nxp 、renesas 、sdl 文件夹。
QQ20250216-200912.png
drivers文件夹实际不使用,不用添加
libs 大部分都不是用,可以只添加
QQ20250216-200952.png
2.2.2 头文件路径添加
QQ20250216-201246.png
如果你是按照以上方法一路操作下来的。可以逐一复制以下每行内容到MDK的头文件路径中。
..\lvgls
..\lvgls\lvgl
..\lvgls\lvgl\src
..\lvgls\lvgl\src\core
..\lvgls\lvgl\src\display
..\lvgls\lvgl\src\draw
..\lvgls\lvgl\src\drivers
..\lvgls\lvgl\src\font
..\lvgls\lvgl\src\indev
..\lvgls\lvgl\src\layouts
..\lvgls\lvgl\src\libs
..\lvgls\lvgl\src\misc
..\lvgls\lvgl\src\osal
..\lvgls\lvgl\src\others
..\lvgls\lvgl\src\stdlib
..\lvgls\lvgl\src\themes
..\lvgls\lvgl\src\tick
..\lvgls\lvgl\src\widgets

3. LVGL 移植
3.1 添加驱动和demo文件
为了添加lvgl的驱动文件,在mdk中添加一个文件夹,名为lvgl_porting。对应添加disp、indev 2个驱动文件和配置头文件。
894e8b8c-fe12-4bd5-ba28-b446c285704e.png
添加lvgl_demo文件夹,用于添加你需要测试demo例程。如你想测试demos文件夹中widget例程,像下面截图一样添加将lv_demo_widgets.c 添加进去
QQ20250216-202220.png
并且将添加头文件路径
..\lvgls\lvgl\demos\widgets

3.2 lvgl代码修改
lv_port_disp.c 中增加lcd尺寸定义
#define MY_DISP_HOR_RES    240
#define MY_DISP_VER_RES    240
并参考注释中的说明,在disp_init()函数中直接使用example_1的显存定义方式。取消使用example_2和example_3的方式。
在disp_flush中直接调用UTIL_LCD_FillRGBRect 函数,这函数会最终调用ST7789H2_FillRGBRect这个函数。实现向lcd某一矩形区域填充色彩。
QQ20250216-202908.png
QQ20250216-202926.png
lv_port_indev.c
因为只使用触摸屏这一输入设备。mouse 等输入设备的初始化可取消。
修改touched_is_pressed 和 touched_get_xy 函数的实现。重点是调用BSP_TS_Get_MultiTouchState这个函数来获取触摸点的坐标
QQ20250216-202958.png
QQ20250216-203014.png
QQ20250216-203025.png

lv_config.h
把 第一个 # if 0  改为 # if 1 从而使能文件
因为lv_config.h默认配置的颜色深度为 16bit(RGB565)。和开发板BSP工程完全一致。且默认是启动widgets demo。所以不需要修改。


4. BSP工程修改
修改堆栈的大小,栈过小会出现运行异常。
QQ20250216-204909.png
HAL_Tick中添加lv_tick_inc
QQ20250216-204639.png
main.c 添加lvgl的头文件和demo的头文件
QQ20250216-204733.png
SystemHardwareInit();已经完成了lcd和触摸屏的硬件初始化
只需要在SystemHardwareInit();之后完成lvgl,lvgl显示驱动,lvgl输入驱动,和demo的初始化就可以
QQ20250216-204844.png

并在while循环中调用lv_timer_handler();

5. LVGL Demo测试
QQ20250216-210420.png
显示正常,触摸正常,还挺流畅的。


您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

107

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部