本帖最后由 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 下载这个仓库。
下载解压后的文件内容如下:
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 可以用添加自己编写的代码文件。
实际examples这个文件夹,到这篇文章中并没有用到,只是为了方便移植成功后,使用这个工程可以直接添加这些文件,来测试这些例子。
将lv_conf_template.h 修改为lv_conf.h
从 lvgl/examples/porting 文件夹中复制显示设备和输入设备的接口代码文件复制到lvgl这个文件层级下。并将_template去掉。如上一幅图所示。porting文件夹内容如下所示:
2.2 MDK工程中添加文件
2.2.1 lvgl/src文件添加
src中包含了很多文件夹和文件。实际有部分文件是多余。但是为了方便以后测试,这里尽量添加多部分文件到MDK工程中。
其中:
mdk中的lvgl_src 包含src 文件夹下的lv_init.c
mdk其他添加的文件夹和 src文件夹中的子文件夹对应。需要注意的是,文件夹中还包含子文件夹(多级),除了部分文件,需要将这些文件夹中的文件都包含进MDK中。
draw中不需要添加 nxp 、renesas 、sdl 文件夹。
drivers文件夹实际不使用,不用添加
libs 大部分都不是用,可以只添加 2.2.2 头文件路径添加 如果你是按照以上方法一路操作下来的。可以逐一复制以下每行内容到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个驱动文件和配置头文件。
添加lvgl_demo文件夹,用于添加你需要测试demo例程。如你想测试demos文件夹中widget例程,像下面截图一样添加将lv_demo_widgets.c 添加进去
并且将添加头文件路径
..\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某一矩形区域填充色彩。
lv_port_indev.c
因为只使用触摸屏这一输入设备。mouse 等输入设备的初始化可取消。
修改touched_is_pressed 和 touched_get_xy 函数的实现。重点是调用BSP_TS_Get_MultiTouchState这个函数来获取触摸点的坐标
lv_config.h
把 第一个 # if 0 改为 # if 1 从而使能文件
因为lv_config.h默认配置的颜色深度为 16bit(RGB565)。和开发板BSP工程完全一致。且默认是启动widgets demo。所以不需要修改。
4. BSP工程修改
修改堆栈的大小,栈过小会出现运行异常。
HAL_Tick中添加lv_tick_inc
main.c 添加lvgl的头文件和demo的头文件
SystemHardwareInit();已经完成了lcd和触摸屏的硬件初始化
只需要在SystemHardwareInit();之后完成lvgl,lvgl显示驱动,lvgl输入驱动,和demo的初始化就可以
并在while循环中调用lv_timer_handler();
5. LVGL Demo测试
显示正常,触摸正常,还挺流畅的。
|