1. LVGL 概述与环境搭建
各位工程师朋友,欢迎来到《LVGL界面移植与多平台适配指南》的第一章。今天咱们聊聊 LVGL 是什么,以及怎么把它的模拟器跑起来。
先说说我自己的经历。几年前我接手一个智能家居面板项目,MCU 资源有限,又要做漂亮的动画界面。试了好几个方案,要么太吃内存,要么文档稀烂。后来找到 LVGL,一周就把原型跑起来了。嗯,从那以后我就成了它的忠实用户。
1.1 LVGL 是什么
LVGL(Light and Versatile Graphics Library)是一个开源的嵌入式图形库。说白了,就是给单片机做界面的工具包。它用 C 语言写的,资源占用小,但功能一点不含糊。
你想想看,一个只有几百 KB Flash 的芯片,也能跑出带按钮、滑块、图表、动画的界面。这就是 LVGL 的本事。
核心特点:
- 纯 C 实现,无硬性依赖
- 支持 16/32/64 位 MCU 和 MPU
- 内置 30+ 控件(按钮、标签、图表、键盘等)
- 硬件加速接口(支持 DMA2D、GPU)
- 丰富的输入设备支持(触摸、按键、编码器)
1.2 为什么选择 LVGL
市面上嵌入式 GUI 方案不少,比如 emWin、TouchGFX、LittlevGL(LVGL 的前身)。我为什么推荐 LVGL?
| 对比项 | LVGL | emWin | TouchGFX |
|---|---|---|---|
| 开源协议 | MIT(免费商用) | 商业授权 | 部分免费 |
| 最低 RAM | ~8 KB | ~16 KB | ~32 KB |
| 控件数量 | 30+ | 20+ | 25+ |
| 社区活跃度 | 高(GitHub 15k+ star) | 中 | 中 |
| 学习曲线 | 平缓 | 中等 | 较陡 |
我个人最看重两点:一是 MIT 协议,商用不用提心吊胆;二是社区活跃,遇到问题搜一搜就有答案。我曾经在凌晨两点卡在一个触摸校准问题上,发了个 issue,第二天早上就有开发者回复了。这种体验,商业库给不了。
1.3 源码获取
获取 LVGL 源码很简单。官方仓库在 GitHub 上,我习惯直接克隆最新稳定版。
git clone https://github.com/lvgl/lvgl.git --branch v8.3.0
注意,我建议你拉取 release 分支,而不是 master。master 可能包含未稳定的新特性。我在项目里吃过这个亏——用 master 跑了一个月,突然一个 API 变了,编译不过。后来就老实了,只跟 release。
除了核心库,你还需要一个 lv_drivers 仓库,里面封装了常见显示器和触摸芯片的驱动。
git clone https://github.com/lvgl/lv_drivers.git
小技巧: 如果你只想快速体验,可以直接下载 lv_sim_visual_studio 或 lv_sim_eclipse_sdl 模拟器项目,里面已经整合好了核心库和驱动。
1.4 开发环境准备(VS Code + PlatformIO)
我推荐 VS Code + PlatformIO 组合。为什么?因为跨平台、配置简单、插件生态好。你不需要折腾 Keil 或 IAR 的许可证,一个编辑器搞定所有。
安装步骤:
- 下载安装 VS Code(code.visualstudio.com)
- 在扩展市场搜索 PlatformIO IDE,点击安装
- 安装完成后,重启 VS Code
- PlatformIO 会自动安装 Python 和核心工具链
注意: PlatformIO 安装过程需要联网下载工具链,如果网络不好,可能会卡在某个步骤。我曾经在公司内网装了一下午没成功,后来用手机热点才搞定。建议提前准备好稳定的网络环境。
1.5 第一个 LVGL 模拟器工程
好,环境准备好了,咱们开始创建第一个工程。这个工程会在你的电脑上模拟 LVGL 界面,不需要任何硬件。
步骤一:创建 PlatformIO 项目
- 打开 VS Code,点击 PlatformIO 图标
- 选择 New Project
- 项目名填
lvgl_simulator - Board 选择 Desktop 下的 Native
- Framework 选择 LVGL
- 点击 Finish
步骤二:配置 platformio.ini
PlatformIO 会自动生成一个配置文件。我们需要添加 SDL 模拟器依赖。
[env:native]
platform = native
build_flags =
-I lib/lvgl
-I lib/lv_drivers
lib_deps =
lvgl/lvgl@^8.3.0
lvgl/lv_drivers@^8.3.0
libsdl
步骤三:编写主程序
在 src/main.c 中写入以下代码:
#include "lvgl.h"
#include "lv_drivers/display/monitor.h"
#include "lv_drivers/indev/mouse.h"
int main(void)
{
lv_init();
monitor_init();
mouse_init();
lv_disp_drv_t disp_drv;
lv_disp_drv_init(&disp_drv);
disp_drv.flush_cb = monitor_flush;
lv_disp_drv_register(&disp_drv);
lv_indev_drv_t indev_drv;
lv_indev_drv_init(&indev_drv);
indev_drv.type = LV_INDEV_TYPE_POINTER;
indev_drv.read_cb = mouse_read;
lv_indev_drv_register(&indev_drv);
/* 创建一个简单的按钮 */
lv_obj_t *btn = lv_btn_create(lv_scr_act());
lv_obj_set_pos(btn, 100, 100);
lv_obj_set_size(btn, 120, 50);
lv_obj_t *label = lv_label_create(btn);
lv_label_set_text(label, "Hello LVGL");
lv_obj_center(label);
while(1) {
lv_timer_handler();
SDL_Delay(5);
}
return 0;
}
步骤四:编译运行
点击 PlatformIO 底部的 Build 按钮(对勾图标),编译通过后点击 Run(箭头图标)。你会看到一个窗口弹出来,上面有一个写着 "Hello LVGL" 的按钮。
成功了! 你的第一个 LVGL 模拟器工程已经跑起来了。你可以用鼠标点击按钮,虽然现在它还没有响应事件,但界面已经正常渲染了。
这里我画了一张图,帮你理清整个知识体系:
这张图把本章的知识点串起来了。你看,从中心节点出发,四个分支分别对应四个小节,每个小节下面又有具体的子知识点。这样学起来,思路就清晰多了。
个人建议: 第一次跑模拟器时,别急着改代码。先感受一下 LVGL 的渲染效果,点一点按钮,拖一拖窗口。这能帮你建立对框架的直观认识。我当初就是先玩了半小时 demo,才决定深入学习的。
好了,第一章的内容就到这里。你已经了解了 LVGL 是什么、为什么选它、怎么获取源码、怎么搭建环境,并且成功跑起了第一个模拟器工程。这些基础打牢了,后面学控件、学移植就会轻松很多。