一、移植LVGL的前期准备
第一步:ESP32 S3 LVGL版本选择
对于 ESP32-S3,推荐使用 LVGL v8.3.11,因为这个版本在性能、兼容性和 bug 修复方面较为稳定,具体原因如下:
推荐使用 LVGL v8.3.11 的原因
-
官方稳定版本:
- LVGL v8.3.11 是 LVGL v8.3 系列的最终修复版,修复了之前版本的一些 bug,提高了稳定性。
- ESP32 官方文档 和 Espressif 提供的示例工程 也是基于 LVGL v8.3.x,说明这个版本在 ESP32 上经过了较多的优化和测试。
-
适配 ESP32-S3 的 DMA & PSRAM:
- ESP32-S3 具备 PSRAM,LVGL v8.3 在 DMA 传输和 PSRAM 兼容性 方面已经进行了优化,能够更好地适配 S3 硬件加速。
- 之前的 LVGL 7.x 或 8.0 版本 在 ESP32 的 DMA 传输 和 PSRAM 支持 上可能会有 bug 或不够完善。
-
支持 SquareLine Studio:
- SquareLine Studio 是目前最流行的 LVGL UI 设计工具,且最高支持 LVGL v8.3.x。
- 如果你想通过 可视化界面拖拽设计 UI,使用 LVGL v8.3.11 兼容性最佳。
-
支持最新的 LVGL 组件和优化:
- LVGL v8.3 提供了更多的 UI 控件、动画效果,以及更好的输入设备适配(例如触摸屏驱动)。
- 适用于 ESP32-S3 LCD、触摸屏、SPI DMA 传输 等场景。
第二步:LVGL 源码下载
1. 官方 GitHub 下载(推荐)
方式 1:GitHub 页面手动下载(我先着重使用手动下载方式,更适合小白)
- 打开 LVGL GitHub 仓库
https://github.com/lvgl/lvgl
- 点击选择“v8.3”版本
- 点击 “Code” 按钮
- 选择 “Download ZIP” 下载
下载后,解压缩即可使用。
方式 2:直接克隆 GitHub 仓库
在你的 ESP32 开发环境(VS Code、ESP-IDF 终端等)中运行:
git clone --branch v8.3.11 --depth 1 https://github.com/lvgl/lvgl.git
如果你需要最新的 v8.3.11 版本,确保使用 --branch v8.3.11
参数。
2. 使用 ESP-IDF 下载(适用于 ESP32)
如果你使用的是 ESP-IDF 开发环境,可以直接运行:
idf.py add-dependency "lvgl/lvgl^8.3.11"
这将自动下载 LVGL v8.3.11 并添加到 ESP-IDF 组件中。
3. 使用 PlatformIO 下载(适用于 VS Code)
如果你在 VS Code + PlatformIO 开发环境中:
- 在
platformio.ini
文件中添加:
lib_deps = lvgl/lvgl @ ^8.3.11
- 保存后,PlatformIO 会自动下载并集成 LVGL 组件。
4. 在 SquareLine Studio 里下载
如果你使用 SquareLine Studio 设计 UI,它会自动提供 LVGL v8.3.x 版本,你可以直接导出到 ESP32 项目中。
第三步:ESP32 IDF工程文件和LVGL源码准备
我们找到IDF库的例子工程,在IDF安装路径的Espressif\frameworks\esp-idf-v5.3.1\examples\get-started路径下,将里面的hello world 工程文件复制出来。
重命名hello world 工程文件夹为“ESP32S3N16R8_with_LVGLv8.3.11_20250211”,并解压好刚才下载好的LVGL_v8.3.11源码,如图:
打开我们准备好的ESP32S3N16R8_with_LVGLv8.3.11_20250211工程文件,在里面新建一个“components”文件夹,用于存放ESP32组件文件(lvgl源码或者屏幕的驱动代码等等)。
第四步:显示(和触摸)驱动准备
在 ESP32-S3 上移植 LVGL 之前,需要先准备好 显示驱动(LCD) 和 触摸驱动(如果有触摸)。
以下是主要的要点:
(1)确保屏幕的驱动可用,并且可以实现在屏幕上 画点,矩形填充的功能
(2)确保屏幕的触摸驱动可用(如果有触摸功能),并且可以实现获取触摸的XY坐标的功能
(注意:您可以用 lv_port_esp32 里提供的 LVGL 显示驱动,如果里面有支持您选择的屏幕驱动IC)
为了使新手小白更深入的学会和理解LVGL如何在ESP32上移植,我先选择使用自己编写的触摸屏驱动用于lvgl移植!
我手上的屏幕是1.69寸,240x280分辨率,16位色,RGB565,驱动IC为ST7789V,通信接口SPI,触摸IC是 CST816T,通信接口IIC。
在“components”文件夹里面新建“BSP”文件夹,把提前准备好的屏幕驱动代码复制到BSP文件夹
为了将复制过来的屏幕驱动代码链接到ESP32的工程里面,我们还需在BSP文件夹下新建一个CMakeLists.txt文件,里面内容为:
set(src_dirs
LCD_ST7789V_SPI
TOUCH_CST816T_I2C
)
set(include_dirs
LCD_ST7789V_SPI
TOUCH_CST816T_I2C
)
set(requires
driver
esp_timer
esp_driver_ledc
)
idf_component_register(
SRC_DIRS ${src_dirs}
INCLUDE_DIRS ${include_dirs}
REQUIRES ${requires}
)
component_compile_options(
-ffast-math
-O3
-Wno-error=format=-Wno-format
-Werror=implicit-function-declaration
)
(注意:实际要根据你自己的驱动文件夹来模仿编写,从而把你的屏幕驱动文件链接到ESP32 IDF工程里面)
二、LVGL 源码移植
第一步:源码文件移植
将刚才下载准备好的lvgl-release-v8.3源码解压复制到我们新建的“components”文件夹,并重命名为lvgl (这一步必须重命名为lvgl !!,后面会提到原因)
做好以上步骤后,我们使用VS CODE 打开ESP32S3N16R8_with_LVGLv8.3.11_20250211工程,可以看到工程文件列表如下:
依次在VS CODE 上配置好ESP32对应芯片的配置:(该步骤默认小白已经掌握,我不再赘述哈!)
激动人心的时刻到来:编译!!!!
重要的事情说三遍:如果编译成功并没有错误的话,那恭喜你可以接着下面的步骤继续移植,如果还有编译报错,请先解决报错!!!
三、LVGL 显示驱动接口移植
核心任务
- 初始化 LCD 硬件(SPI 或并口驱动)
- 实现
flush_cb
(LVGL → LCD 数据传输) - 配置 LVGL 的显示缓冲区
- 注册显示驱动
对于LVGL显示驱动接口的移植,LVGL源码里面提供了移植示例,我们找到lvgl\examples\porting文件夹,里面有6个文件:
他们分别是 :
显示驱动移植示例代码(lv_port_disp_template)
文件系统移植示例代码(lv_port_fs_template)
输入设备驱动移植示例代码(lv_port_indev_template)
为方便调用管理,我们需要在ESP32 IDF 工程的main文件夹下新建“lv_port”文件夹,然后把这个porting文件夹里面的文件全部复制到新建的“lv_port”文件夹(没有用到的可以不用复制),并重命名