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,步骤很简单:
- 新建一个 Keil 工程,选好芯片型号。
- 把
lvgl/src目录下的所有.c文件添加到工程。 - 在工程选项的 C/C++ 选项卡里,添加
lvgl和lvgl/src的路径到 Include Paths。 - 在
lv_conf.h里把#if 0改成#if 1,启用配置。 - 编译,搞定。
这里有个坑: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 开发的第一步,也是最容易出问题的一步。我见过太多人卡在编译报错、屏幕不亮、触摸没反应这些基础问题上。别急,按本章的步骤来,遇到问题先检查 lv_conf.h 的配置,再检查驱动接口。这两关过了,后面就顺了。