1、LVGL初探:什么是LVGL、LVGL的特点与优势、LVGL的应用场景、LVGL的版本选择
1.1 什么是LVGL?
LVGL,全称 LittlevGL,现在官方叫 LVGL(Light and Versatile Graphics Library)。
说白了,它是一个开源的嵌入式图形库。专门给资源受限的 MCU 用的。你想想看,一个只有几百 KB Flash、几十 KB RAM 的单片机,想跑个漂亮的触摸界面,靠裸机画点画线得累死。LVGL 就是干这个的。
我最早接触 LVGL 是在 v7 时代,当时项目需要一个温控器的彩色界面。老板说「用屏幕吧,好看点」。我第一反应是上 Linux + Qt,但硬件成本压不住。后来发现 LVGL,直接在 STM32F429 上就跑起来了,效果还不赖。
它的核心定位很明确:为嵌入式设备提供一套现代、高效、可裁剪的 GUI 框架。你不需要懂复杂的图形算法,也不需要自己管理帧缓冲。LVGL 帮你把按钮、滑块、图表、键盘这些控件都封装好了,你只管调用。
一句话总结:LVGL 就是嵌入式界的「Qt」,但比 Qt 轻得多,专门跑在裸机或 RTOS 上。
1.2 LVGL的特点与优势
我挑几个最打动我的点来讲。这些也是你在选型时最该关注的。
1.2.1 轻量级与可裁剪
LVGL 的代码是用 C 写的,编译后最小可以压到 100 KB 左右。RAM 占用看你的控件数量,一般 8 KB 起步就能跑。
它提供了 lv_conf.h 配置文件。你可以在里面开关各种功能:要不要动画?要不要字体?要不要特定控件?全关掉就剩个核心框架,非常干净。
我的习惯:拿到一个新板子,先把 lv_conf.h 里所有 #if 0 的选项扫一遍。不需要的功能直接关掉,能省不少 Flash。我曾经在一个项目里只开了按钮、标签和滑块三个控件,Flash 占用从 180 KB 降到了 110 KB。
1.2.2 丰富的控件与样式
LVGL 内置了 30+ 个控件。常用的有:
- 基础控件:按钮(btn)、标签(label)、滑块(slider)、进度条(bar)
- 容器控件:页面(page)、滚动条(roller)、表格(table)
- 高级控件:图表(chart)、日历(calendar)、键盘(keyboard)、画布(canvas)
每个控件都支持 CSS 风格的样式设置。你可以改背景色、边框、圆角、阴影、透明度。甚至可以做渐变和图片平铺。
我记得有一次客户要求界面「圆润一点,像手机 App」。我用 LVGL 的 lv_style_set_radius 把按钮圆角调到 20px,再配上 lv_style_set_shadow_width 加个阴影,效果直接拉满。客户当场拍板。
1.2.3 硬件无关的驱动层
LVGL 把显示和输入抽象成了两个接口:
- 显示驱动:你只需要实现一个
flush_cb函数,把 LVGL 的帧缓冲刷到你的 LCD 上。 - 输入驱动:你只需要实现一个
read_cb函数,把触摸坐标或按键值传给 LVGL。
这意味着什么?你换屏幕、换触摸芯片,只需要改驱动层那几行代码。上层 UI 逻辑完全不用动。
避坑指南:我曾经在一个项目里,因为显示驱动没处理好双缓冲,导致画面撕裂。后来发现 LVGL 的 LV_COLOR_DEPTH 和实际屏幕色深不匹配。嗯,这里要注意:驱动层的 buf_size 最好设为屏幕像素数的 1/10 以上,否则刷新会卡。
1.2.4 动画与特效
LVGL 内置了动画引擎。你可以给任何控件的任何属性做动画:位置、大小、颜色、透明度、旋转角度。
比如一个按钮从左边滑入:
lv_anim_t a;
lv_anim_init(&a);
lv_anim_set_var(&a, btn);
lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_x);
lv_anim_set_values(&a, -100, 100);
lv_anim_set_time(&a, 500);
lv_anim_start(&a);
就这几行,按钮就会在 500ms 内从 -100 像素滑到 100 像素。你想想看,在单片机上做这种效果,以前得自己算帧、自己刷缓冲,现在 LVGL 全包了。
1.2.5 多语言与字体支持
LVGL 支持 UTF-8,所以中文、日文、阿拉伯文都没问题。它内置了字体转换工具,你可以把 TTF 字体转成 LVGL 的位图字体格式。
我一般用 lv_font_conv 这个工具。把微软雅黑转成 16px 和 24px 两个大小,一个界面够用了。注意只转常用汉字,别全转,否则字体文件能到几 MB。
1.3 LVGL的应用场景
根据我这几年的经验,LVGL 最适合以下场景:
| 场景 | 典型硬件 | 说明 |
|---|---|---|
| 智能家居面板 | ESP32 + 3.5寸屏 | 温控器、灯光控制、窗帘控制 |
| 工业HMI | STM32F4/F7 + 5寸屏 | 设备参数设置、数据监控、报警界面 |
| 消费电子 | ARM Cortex-M4/M7 | 智能手表、健康手环、小家电屏幕 |
| 车载仪表 | i.MX RT + 7寸屏 | 仪表盘、中控娱乐(非安全关键) |
| 医疗设备 | STM32H7 + 4.3寸屏 | 监护仪、注射泵、手持检测仪 |
你可能会问:「为什么不用 TouchGFX 或 emWin?」
我的看法是:TouchGFX 对硬件要求高,emWin 是商业收费。LVGL 开源免费,社区活跃,文档齐全。对于中小团队和个人开发者来说,性价比最高。
1.4 LVGL的版本选择
版本选择是个坑。我见过不少新手直接下载最新版,结果发现和教程对不上。
目前 LVGL 的主流版本有:
| 版本 | 状态 | 建议 |
|---|---|---|
| v7.x | 已停止维护 | 不推荐新项目使用 |
| v8.x | 稳定版,广泛使用 | 推荐新项目使用 |
| v9.x | 最新版,持续更新 | 适合尝鲜,但文档和教程较少 |
我的建议:如果你是第一次接触 LVGL,直接选 v8.3.x。这个版本最成熟,网上教程最多,社区问题也最容易搜到。等熟悉了再考虑升级到 v9。
v8 和 v9 的主要区别:
- API 变化:v9 重构了部分 API,比如
lv_scr_act()改成了lv_screen_active() - 驱动层:v9 引入了新的驱动注册方式,更灵活但学习成本高一点
- 性能:v9 在渲染和内存管理上有优化,但差别不大
我个人习惯是:项目用 v8.3,个人玩票用 v9。这样既保证项目稳定,又能跟上新特性。
1.5 LVGL知识体系总览
下面这张图帮你快速建立 LVGL 的知识框架。我把它分成三层:
从这张图你能看到:LVGL 的架构非常清晰。你只需要关注最底层的驱动层和顶层的应用逻辑。中间那些控件、样式、动画,LVGL 都帮你封装好了。
嗯,这就是 LVGL 的第一印象。后面我们会一步步深入,从移植到实战,把每个环节都走一遍。