1、LVGL初识与环境搭建

做嵌入式图形界面这些年,我试过不少方案。从最早的裸机画点,到后来用 emWin、TouchGFX,再到接触 LVGL,说实话,每个方案都有它的脾气。但 LVGL 是我目前最愿意推荐给身边同事的——不是因为它最炫,而是因为它最「实在」。

1.1 LVGL是什么

LVGL(Light and Versatile Graphics Library),全称轻量级多功能图形库。说白了,就是一套专门给嵌入式设备用的 GUI 框架。它帮你把按钮、滑块、图表、键盘这些常见控件都封装好了,你只需要调用 API,就能在屏幕上画出漂亮的界面。

我最早接触 LVGL 是在一个温控器项目上。当时老板要求 3 天出原型,MCU 还是 STM32F103,RAM 只有 20KB。用 LVGL 的 v7 版本,我两天就把主界面、设置页、曲线图全跑起来了。嗯,从那以后我就成了 LVGL 的忠实用户。

特性 说明
开源免费 MIT 协议,商用无限制
轻量级 最小配置仅需 16KB RAM + 64KB Flash
控件丰富 30+ 内置控件,支持动画、样式、主题
跨平台 支持裸机、FreeRTOS、Linux 等
输入设备 触摸、按键、编码器、鼠标均支持

1.2 为什么选择LVGL

市面上嵌入式 GUI 方案不少,我列个对比表,你一看就明白。

方案 许可证 资源占用 控件丰富度 社区活跃度
LVGL MIT(免费) 低 高 极高
emWin 商业授权 中 中 低
TouchGFX 部分免费 中高 高 中
uGFX 商业授权 低 中 低

我个人选择 LVGL 的理由有三:

  • 免费且无后顾之忧——MIT 协议,闭源商用也没问题。我之前有个客户被商业 GUI 的授权费坑过,后来全切 LVGL 了。
  • 资源门槛极低——16KB RAM 就能跑起来。你想想看,一颗几块钱的 MCU 就能做彩色界面,这在以前不敢想。
  • 社区生态好——GitHub 上 15k+ star,遇到问题搜一下基本都有答案。我每次踩坑,十有八九在论坛里能找到类似案例。

核心观点:LVGL 不是万能的,但在 80% 的嵌入式 GUI 场景下,它是性价比最高的选择。

1.3 源码获取

获取 LVGL 源码很简单,我一般用两种方式。

方式一:GitHub 直接下载

打开 https://github.com/lvgl/lvgl,点绿色的「Code」按钮,选 Download ZIP。适合不熟悉 Git 的初学者。

方式二:Git 克隆(我推荐)

git clone https://github.com/lvgl/lvgl.git
cd lvgl
git checkout v8.3.0    # 切到稳定版本

为什么我推荐 Git 克隆?因为后续更新方便。项目做到一半,LVGL 出了新版本,你只需要 git pull 就能合并更新,不用重新下载整个包。

小提示:LVGL 目前主流版本是 v8.x,v9 正在开发中。建议新项目从 v8.3.x 开始,稳定且资料多。我曾经手痒试过 v9 的 alpha 版,API 变动较大,文档还没跟上,踩了不少坑。

1.4 开发板选型建议

选开发板这件事,我踩过太多坑了。直接说结论:

需求等级 推荐芯片 RAM Flash 屏幕分辨率
入门/低端 STM32F103 / ESP32 20KB+ 256KB+ 320x240
中级 STM32F4 / NXP RT10xx 128KB+ 1MB+ 480x320
高级 STM32H7 / NXP RT1170 512KB+ 2MB+ 800x480

我个人建议:初学者直接买一块 STM32F429 开发板,带 480x272 屏幕的那种。为什么?因为 F429 自带 LCD 控制器,不需要额外买屏幕驱动芯片,接线少、资料多。我带的几个实习生都是用这块板子入门的,基本一周就能跑起 LVGL demo。

避坑指南:我曾经买过一块某宝上的「高性价比」开发板,结果屏幕接口是 8080 并口,LVGL 刷屏速度慢到没法看。后来才发现,这板子的 FSMC 时钟没配置好。所以选板子时,一定要确认屏幕接口类型——RGB 接口 > SPI 接口 > 8080 并口,速度依次递减。

1.5 Keil/IAR/CMake工程模板搭建

搭建工程模板,说白了就是把 LVGL 源码加到你的项目里,然后配好编译选项。我分别说三种方式。

1.5.1 Keil 工程模板

Keil 是我用得最多的 IDE,步骤很简单:

  1. 新建一个 Keil 工程,选好芯片型号。
  2. 把 lvgl/src 目录下的所有 .c 文件添加到工程。
  3. 在工程选项的 C/C++ 选项卡里,添加 lvgl 和 lvgl/src 的路径到 Include Paths。
  4. 在 lv_conf.h 里把 #if 0 改成 #if 1,启用配置。
  5. 编译,搞定。

这里有个坑:LVGL 源码文件很多,手动添加容易漏。我习惯在工程目录下建一个 lvgl 文件夹,然后用 Keil 的「Add Existing Files」批量添加,一次搞定。

1.5.2 IAR 工程模板

IAR 的步骤和 Keil 类似,但有个细节要注意:

// IAR 的优化等级建议设为 Low 或 Medium
// 如果开 High,LVGL 的某些回调函数可能被优化掉
// 我遇到过屏幕点不亮,查了两天才发现是优化问题

另外,IAR 的预处理器符号要手动添加 LV_CONF_INCLUDE_SIMPLE,否则编译会报找不到 lv_conf.h。

1.5.3 CMake 工程模板

如果你用 Linux 开发,或者用 VS Code + GCC,CMake 是标配。我的模板长这样:

cmake_minimum_required(VERSION 3.10)
project(lvgl_demo)

# 添加 LVGL 源码
add_subdirectory(lvgl)

# 添加你的应用代码
add_executable(${PROJECT_NAME} main.c)

# 链接 LVGL 库
target_link_libraries(${PROJECT_NAME} PRIVATE lvgl::lvgl)

# 添加宏定义
target_compile_definitions(${PROJECT_NAME} PRIVATE
    LV_CONF_INCLUDE_SIMPLE
)

这个模板我用了两年,从 STM32 到 ESP32 都能直接套用。只需要改一下交叉编译链和芯片型号就行。

我的习惯:不管用哪种 IDE,我都会在工程里保留一个 lv_conf.h 的备份。万一配置改乱了,直接恢复备份,省得重头配。这招救过我至少三次。

1.6 本章知识体系

下面这张图,是我梳理的 LVGL 初识与环境搭建的核心脉络。你可以把它当作一张「地图」,后续学习时随时回来对照。

LVGL 初识与环境搭建 · 知识体系 LVGL 核心 什么是 LVGL 为什么选 LVGL 源码获取 开发板选型 工程模板搭建(Keil / IAR / CMake) lv_conf.h 配置 显示驱动适配 输入设备适配 核心原则 先跑通 demo → 再理解原理 → 最后定制界面 不要一上来就改底层驱动,容易劝退

这张图把本章内容串起来了。你从「LVGL 核心」出发,先搞清楚它是什么、为什么选它,然后拿到源码,选好板子,最后搭建工程模板。每一步都有对应的知识点,后续章节会逐一深入。

总结一下:环境搭建是 LVGL 开发的第一步,也是最容易出问题的一步。我见过太多人卡在编译报错、屏幕不亮、触摸没反应这些基础问题上。别急,按本章的步骤来,遇到问题先检查 lv_conf.h 的配置,再检查驱动接口。这两关过了,后面就顺了。