给仪表、家电、充电桩、手持终端加一块彩屏时,第一反应常常是:上 Linux + Qt,或者干脆整台 Android。界面是好看了,代价也跟着来------内存、启动时间、BSP、证书、产线刷机,一股脑砸过来。明明只要几个按钮、一张表盘、几条曲线,却先养起一套「迷你手机系统」。
LVGL (Light and Versatile Graphics Library)走的是另一条路:一份用 C 写的、可移植的嵌入式图形库,目标就是在 MCU / MPU 上做出接近现代手机的 UI------控件、样式、布局、动画、多语言字体都有,却尽量压在很小的 RAM / Flash 里。官网自称「世界上采用最广的开源嵌入式 UI 生态」:厂商中立、免版税、不绑特定芯片或 OS。
它不是「又一个画点阵的 demo」。自己写 draw_pixel 能点亮屏,但做不出完整的按钮态、列表惯性、主题切换;厂商闭源 UI 库好用,却容易锁死在某一家 SoC 上。LVGL 要的是:好看、可商用、可移植性。
- 官网:https://lvgl.io
- 文档:https://docs.lvgl.io
- 源码:github.com/lvgl/lvgl
- 许可:MIT
一、它到底是什么
名字拆开看就很直白:Light(轻)、Versatile(通用)、Graphics Library(图形库)。近年官网更爱说 Embedded UI Ecosystem------库本身之外,还有各芯片官方示例、模拟器、编辑器、绑定(MicroPython / Rust 等)和商业支持网络。
核心可以记五件事:
| 关键词 | 含义 |
|---|---|
| 可移植 C 库 | 无强制外部依赖;Make / CMake / 直接丢进工程都行 |
| 不绑 OS | 裸机、FreeRTOS、Zephyr、NuttX、Linux......都能挂 |
| 任意显示类型 | 单色、OLED、ePaper、TFT,甚至 PC 监视器仿真 |
| 控件 + 样式 | 30+ 内置控件,100+ 样式属性;Flex / Grid 类布局 |
| 可商用 | MIT;小米等厂商公开提过量产使用(见官网引用) |
它不是完整操作系统,也不是 Android 替代品。更贴切的比喻是:嵌入式界的「轻量 UI 引擎」------你提供屏驱和触摸,它负责把界面画漂亮、画流畅。

| Qt / Android 一类 | LVGL | |
|---|---|---|
| 资源 | 往往要较大内存与存储 | 可裁剪到 MCU 量级 |
| 系统 | 通常要完整 OS | 裸机 / RTOS / Linux 均可 |
| 移植 | 窗口系统、驱动栈重 | 主要接 flush / 输入 / tick |
| 生态 | 应用商店、多媒体强 | 芯片厂示例多,偏产品 UI |
| 上限 | 富媒体、复杂 App | 强在「小资源做出像样 HMI」 |
二、三个常见误解
≠ 只能跑在「大 MCU」上。
资源紧时可以关掉特效、缩小缓冲、用更简单的色深;官方说法是:有帧缓冲、再加至少约 1/10 屏 的渲染缓冲,再配大约 几十 KB RAM / 百余 KB Flash 量级就能起步(具体数字随版本与功能集变化,以文档为准)。当然------动画越多、色深越高、缓冲越大,越吃内存。
≠ 已经帮你写好所有屏驱。
LVGL 核心是「怎么画」;「怎么把像素推到这块屏」仍要 display flush 回调,触摸要 indev。好在 ESP-IDF、NXP MCUXpresso、ST / Renesas 等生态里,一键加 LVGL、现成板级工程已经很常见。
≠ v8 教程可以直接当 v9 抄。
主线进入 v9 后,API 有一批重命名与架构调整(如 display / button / image 命名、Observer 取代旧消息机制、并行渲染等)。写文或抄示例时,请对齐你工程里的大版本,避免「照着博客编不过」。
三、架构:输入 → 刷新 → 出屏
一次完整的界面刷新,可以粗看成三步:

软件栈从上到下:

| 层 | 干什么 | 你实际碰到的东西 |
|---|---|---|
| 应用 | 页面、业务、动画 | 创建控件、写回调、绑数据 |
| LVGL 核心 | 控件树、样式、布局、绘制 | lv_obj、Style、Flex/Grid、Draw |
| Port 适配 | 心跳、刷屏、输入、可选 GPU | lv_tick、flush_cb、触摸驱动 |
| 硬件 / OS | 算力、总线、显存 | SPI/RGB/MIPI、RTOS、Framebuffer |
上手时真正会碰到的,多半是下面几条:
-
配置头
lv_conf.h(或 Kconfig)色深、内存池、用哪些控件、是否开 GPU / 文件系统------裁剪从这里开始。
-
Display + Input 注册
v9 起显示与输入设备 API 更统一。你实现「把一块 buffer 送到屏上」和「读触摸坐标」,库负责脏区与合成。
-
Widgets 与 Style
Button、Label、Slider、Chart、Keyboard、Arc、Table......样式属性可按状态(按下、禁用、焦点)分别设,接近「写 CSS 的思路」,但是在 C 里。
-
Layout
Flex / Grid 类布局减少手写坐标;换分辨率时少改一堆魔法数字。
-
可选加速
软件渲染是底线;平台允许时可接 VG-Lite、Dave2D、OpenGL / NanoVG、Arm 相关加速等。v9 后期还加强了矢量、模糊阴影、甚至 glTF 等偏 MPU 的能力------MCU 产品不必全开,按板子能力取用。
四、常见落地形态

| 形态 | 说明 |
|---|---|
| MCU + SPI / RGB 小屏 | 家电面板、手持仪、穿戴;社区与官方 Port 最多 |
| 芯片厂 IDE 一键集成 | 如 NXP / Espressif 等包管理或示例工程,缩短量产路径 |
| Linux MPU + FB / DRM / Wayland | 工控大屏、车载旁路屏;算力与显存更宽裕 |
| PC 模拟器(SDL 等) | 先在电脑上把 UI 调顺,再上板------强烈建议养成习惯 |
还有 MicroPython 绑定、Rust binding、在线 / 桌面编辑器等周边------适合「先验证交互,再固化到 C 固件」。
五、谁适合用、谁不适合
多半会喜欢的:
- 产品要 彩屏 HMI,但不想上完整 Linux / Android
- 需要 多芯片可移植(今年 STM32,明年换另一家 MCU)
- 要按钮、列表、图表、多语言、简单动画,资源却卡在百 KB~数 MB
- 已有 FreeRTOS / Zephyr / 裸机工程,只差一层体面的 UI
- 希望 MIT 进商用,少纠结许可证
建议别硬上的:
- 要应用商店、浏览器内核、复杂多媒体播放------更像 Android / 大 Linux 的活
- 完全拒绝写驱动,指望「拖进工程就亮任意山寨屏」------屏驱与时序仍要人扛
- 团队只会网页前端、零嵌入式基础------能学,但缓冲、DMA、SPI 带宽会教做人
- 把 v8 老代码无脑当 v9 用------先看迁移说明
六、怎么动手
- 先在 PC 上跑官方模拟器 / 示例------确认控件、主题、布局手感,不烧板也能出活
- 选一块官方或芯片厂有 LVGL demo 的板------ESP32 屏套件、NXP / ST 官方板都常见
- 接好三件事:tick(心跳)、display flush、触摸 / 按键 indev
- 从官方 demo 改一页自己的------改标签、换颜色、加一个按钮回调
- 再谈优化:双缓冲、DMA 刷屏、局部刷新、关掉用不到的控件与特效
七、和 Qt、emWin、自研点阵怎么选
| 方案 | 一句话 |
|---|---|
| 自研 draw_pixel / 字模 | 极致可控,复杂 UI 工期爆炸 |
| 厂商闭源 UI(如部分 emWin 授权形态) | 和特定生态绑得紧,迁移成本要算清楚 |
| Qt(嵌入式) | 能力强,更吃 OS 与资源,适合更大系统 |
| LVGL | 开源 MIT、轻、移植面广,嵌入式产品 UI 高频选项 |
八、优缺点
优点
- 真正面向 MCU 的轻量设计,功能与体积可裁剪
- 不绑 OS / 不绑芯片,MIT 利于商用
- 控件、样式、布局、字体、多语言能力完整
- 芯片大厂生态与板级示例多,PC 仿真能加快迭代
- 主线活跃(v9 持续增强渲染与 MPU 能力)
缺点
- 屏驱、缓冲、带宽仍是工程活,库代替不了硬件联调
- 大版本迁移(尤其 v8→v9)要专门排期
- 超复杂桌面级交互、重 3D / 浏览器场景不是主战场
- 「网上随便一份旧博客」和你工程版本不一致时,排错成本高
九、写在最后
下次再给家电面板、充电桩屏幕、手持仪表加「好看一点的界面」时,不妨多问一句:这件事必须上 Linux + Qt,还是一份可移植的 C GUI 库就够?
LVGL 把路走窄了:专注嵌入式屏上的 UI 引擎。窄的好处是,控件、样式、仿真器和芯片厂示例,能把「从黑屏到可点按钮」压缩到一个周末能验证的长度。
