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 知识体系总览 应用层(UI 逻辑) 控件层(30+ 控件 + 样式系统) 核心引擎(渲染、动画、内存管理、事件) 驱动层(显示 + 触摸/按键) 你只需要写驱动层 上层全部由 LVGL 提供 移植核心工作 配置 lv_conf.h + 驱动

从这张图你能看到:LVGL 的架构非常清晰。你只需要关注最底层的驱动层和顶层的应用逻辑。中间那些控件、样式、动画,LVGL 都帮你封装好了。

嗯,这就是 LVGL 的第一印象。后面我们会一步步深入,从移植到实战,把每个环节都走一遍。