LVGL9-移植

1.环境

检查gcc,g++, make, cmake编译环境,如果不具备则安装mingw64和cmake

1.1 Mingw64下载安装

下载已经编译好的mingw64版本mingw-build-binaries,选择类似于x86_64-15.2.0-release-posix-seh-ucrt-rt_v13-rev0.7z的版本下载并解压到D盘下,例如D:\mingw64,则PATH的系统环境变量应该添加D:\mingw64\bin,注意,在该目录下把mingw32-make.exe复制一份并重命名为make.exe

1.2 CMake下载安装

下载cmake的安装包cmake,选择类似于cmake-4.1.2-windows-x86_64.zip的版本,解压到D盘下,例如D:\cmake-4.1.2-windows-x86_64,则PATH的系统环境变量应该添加D:\cmake-4.1.2-windows-x86_64\bin

1.3 Vcpkg下载安装

在D盘下克隆vcpkg的仓库,教程:通过 CMake 安装和使用包

1
git clone https://github.com/microsoft/vcpkg.git

进入vcpkg目录,执行启动脚本

1
cd vcpkg; .\bootstrap-vcpkg.bat

环境变量PATH添加D:\vcpkg

1.4 检查环境

1
gcc --version
1
g++ --version
1
make --version
1
cmake --version
1
vcpkg --version

2.安装SDL2环境

1
vcpkg install sdl2:x64-mingw-static

则安装好的SDL2的路径应该是D:\vcpkg\installed\x64-mingw-static\share\sdl2

3.下载LVGL

1
git clone --recursive https://github.com/lvgl/lv_port_pc_vscode

3.1 修改CMakeLists.txt

修改根目录下的CMakeLists.txt,在# Find and include SDL2 library下面一行引入SDL2库,例如

1
2
3
4
# Find and include SDL2 library
# 引入SDL2库
set(SDL2_DIR "D:/vcpkg/installed/x64-mingw-static/share/sdl2")
find_package(SDL2 REQUIRED)

3.2 使用CMake编译

创建并进入build目录

1
mkdir build && cd build

生成Makefile

1
cmake -G "MinGW Makefiles" ..

编译项目

1
make -j16

3.3 运行

进入bin目录找到main.exe双击运行

1
cd ../bin; ./main.exe

4.优化

4.1 修改运行尺寸

main.c中找到sdl_hal_init函数,修改尺寸

1
sdl_hal_init(720, 1280);

4.2 鼠标残影

hal.c中找到鼠标初始化相关代码,注释掉,否则会有鼠标残影

1
2
3
4
5
6
7
8
9
10
11
#if 0 // 注释鼠标图片,否则会有重影
/*Declare the image file.*/
LV_IMAGE_DECLARE(mouse_cursor_icon);
lv_obj_t * cursor_obj;
/*Create an image object for the cursor */
cursor_obj = lv_image_create(lv_screen_active());
/*Set the image source*/
lv_image_set_src(cursor_obj, &mouse_cursor_icon);
/*Connect the image object to the driver*/
lv_indev_set_cursor(mouse, cursor_obj);
#endif

4.3 打开监控

lv_conf.h中确保以下宏定义启用

1
2
3
#define LV_USE_SYSMON   1
#define LV_USE_PERF_MONITOR 1
#define LV_USE_MEM_MONITOR 1

4.4 提升帧率

lv_conf.h中修改以下宏定义,16ms刷新一次,即60FPS

1
#define LV_DEF_REFR_PERIOD  16

重新编译运行,记得关闭程序再编译,否则提示Permission denied错误

5.Gui Guider导出

以Gui Guider中的Demo: SmartAppliance为例进行导出

5.1 生成Project

  • 点击New,在LVGL9.2.1的标签下选择Simulator,选择SmartAppliance,点击Create Project
  • Project Directory修改为项目保存路径
  • 其他参数自定义,分辨率可以保持默认的480*272
  • 点击Create确定
  • 尝试点击右上角的编译按钮,选择C进行编译运行

5.2 导出代码

  • 点击Project
  • 移动到Export Code
  • 选择Zephyr
  • 弹窗选择保存路径
    导出后的目录结构如下
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    .
    ├── CMakeLists.txt
    ├── patches
    ├── prj.conf
    └── src
    ├── custom
    │   ├── custom.c
    │   ├── custom.h
    │   ├── lv_conf_ext.h
    │   ├── ui_Aircon.c
    │   ├── ui_Aircon.h
    │   ├── ui_Oven.c
    │   └── ui_Oven.h
    ├── generated
    │   ├── events_init.c
    │   ├── events_init.h
    │   ├── gui_guider.c
    │   ├── gui_guider.h
    │   ├── guider_customer_fonts
    │   ├── guider_fonts
    │   ├── images
    │   ├── setup_scr_scrAircon.c
    │   ├── setup_scr_scrHome.c
    │   ├── setup_scr_scrHood.c
    │   ├── setup_scr_scrOven.c
    │   ├── widgets_init.c
    │   └── widgets_init.h
    └── main.c
    其中customgenerated文件夹下的源文件需要加入编译。

5.3 复制文件

在成功运行lvgl9的官方Demo后,把customgenerated目录复制到src目录下,结构如下

1
2
3
4
5
6
7
8
src/
├── custom
├── freertos
├── freertos_main.c
├── generated
├── hal
├── main.c
└── mouse_cursor_icon.c

5.4 修改文件

5.4.1 main.c

在引入头文件部分添加

1
2
#include "generated/gui_guider.h"
#include "generated/events_init.h"

再添加guider_ui结构体

1
lv_ui guider_ui;

在main函数里的初始化官方demo处,替换为ui和events初始化,例如

1
2
3
setup_ui(&guider_ui);
events_init(&guider_ui);
// lv_demo_widgets();

5.4.2 其他文件

把所有的源文件中的lv_animimg_set_src的最后一个布尔值参数删除,删除后类似如下

1
lv_animimg_set_src(ui->scrAircon_aimgAirconSwing, (const void **) scrAircon_aimgAirconSwing_imgs, 15);
  • 所有函数lv_animimg_set_playback_time替换为lv_animimg_set_reverse_duration
  • 所有函数lv_animimg_set_playback_delay替换为lv_animimg_set_reverse_delay

5.4.3 添加编译规则

根目录下的CMakeLists.txt文件增加编译规则,大概37行后面添加新的编译路径

1
2
3
4
5
6
# Main include files of the project
include_directories(${PROJECT_SOURCE_DIR}/main/inc)
# 新增的编译路径
include_directories(${PROJECT_SOURCE_DIR}/src)
include_directories(${PROJECT_SOURCE_DIR}/src/custom)
include_directories(${PROJECT_SOURCE_DIR}/src/generated)

set(MAIN_SOURCES src/mouse_cursor_icon.c src/hal/hal.c)修改为

1
2
3
4
5
6
7
8
file(GLOB_RECURSE GENERATED_SOURCES 
src/generated/*.c
src/generated/guider_customer_fonts/*.c
src/generated/guider_fonts/*.c
src/generated/images/*.c
)
file(GLOB CUSTOM_SOURCES src/custom/*.c)
set(MAIN_SOURCES src/mouse_cursor_icon.c src/hal/hal.c ${GENERATED_SOURCES} ${CUSTOM_SOURCES})

重新编译运行

6.直接克隆

克隆已经移植好的仓库,符合环境要求则可直接编译运行

1
git clone --recursive https://github.com/orionxer/lv_port_pc_vscode

7.VSCode优化

由于仓库包含了多个子模块,在VSCode中使用Copilot非常容易出现OOM(Out Of Memory)错误从而导致闪退。在VSCode工作区中忽略子模块,让Copilot不去索引子模块内容作为上下文。
创建.vscode/settings.json,内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"files.watcherExclude": {
"**/config/**": true,
"**/lvgl/**": true,
"**/FreeRTOS/**": true
},
"search.exclude": {
"**/config/**": true,
"**/lvgl/**": true,
"**/FreeRTOS/**": true
},
"files.exclude": {
}
}

创建.vscode/c_cpp_properties.json,内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**",
"D:/vcpkg/installed/x64-mingw-static/include/SDL2"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"windowsSdkVersion": "10.0.19041.0",
"compilerPath": "D:/mingw64/bin/gcc.exe",
"cStandard": "c99",
"cppStandard": "c++17",
"intelliSenseMode": "windows-gcc-x64"
}
],
"version": 4
}

LVGL9-移植
https://orionxer.github.io/blog/2025/10/03/lvgl-porting/
作者
Orionxer
发布于
2025年10月3日
更新于
2025年10月8日
许可协议