LVGL(Light and Versatile Graphics Library,轻量多功能图形库)是目前嵌入式领域最主流的开源图形库之一。它主要用于为资源受限的微控制器(MCU)和低性能微处理器(MPU)创建现代、美观且流畅的图形用户界面(GUI)。
下面从几个核心维度来介绍它:
1. 核心特点
- 免费开源:采用 MIT 许可证,非常宽松,可以免费用于商业项目,无需公开代码。
- 硬件要求低:最低仅需 几十 KB 的 RAM 和几百 KB 的 Flash 即可运行,非常适合单片机。
- 现代化 UI 组件:内置超过 30 种基础控件,如按钮、滑块、图表、仪表、键盘、列表、图片、文本区域等,并支持动画、透明度、阴影和抗锯齿字体。
- 强大的绘图能力:支持多种边框、渐变、圆角、阴影、不透明度等风格设置,无需额外图片就能实现毛玻璃、3D 感等视觉效果。
- 事件驱动:采用类似 Qt 或网页前端的信号/槽机制,通过回调函数响应用户的点击、拖拽等输入。
- 支持多种输入设备:可同时驱动触摸屏、鼠标、键盘、编码器、实体按钮等多种输入。
- 多语言与 UTF-8:支持中、日、韩等语言显示,只需将字库文件包含进来即可。
- 无需操作系统:可以跑在裸机程序上,也可以方便地移植到 FreeRTOS、RT-Thread 等实时系统上。
2. 基本工作流程
使用 LVGL 开发界面的大致步骤:
- 初始化:调用
lv_init()并初始化显示驱动和输入设备驱动(如触摸屏)。 - 创建对象:在屏幕上创建各种控件(如
lv_btn_create创建按钮,lv_label_create创建文字标签)。 - 设置属性:调整控件的位置、大小、颜色、文字内容、样式等。
- 添加事件:为控件绑定回调函数,例如“点击按钮时 LED 闪烁”。
- 循环运行:在主循环中周期性调用
lv_timer_handler()处理 LVGL 的内部任务(如动画、事件响应),间隔建议为 5-10 毫秒。
3. 硬件与性能
- 典型配置:
- Cortex-M3/M4 单片机(如 STM32F4 系列)或以上。
- 约 64 KB RAM、200 KB Flash 可以跑基础界面。
- 带帧缓冲区的显示屏(SPI、8080、RGB 接口均可)。
- 性能优化:支持将部分运算或绘图交给 GPU、DMA2D 等硬件加速单元;支持双缓冲或部分刷新以减少内存占用。
4. 生态与工具
- SquareLine Studio:官方推出的拖拽式 UI 设计器(类似 Qt Designer),可大幅提升开发效率。社区版有限制,付费版可商用。
- 模拟器:可以在 Windows、Linux、macOS 上用 VS Code、Code::Blocks、Qt Creator 等直接模拟运行 LVGL 代码,无需硬件。
- 大量移植示例:官方和社区提供了适配常见开发板(STM32、ESP32、NXP i.MX RT、Raspberry Pi)和显示屏驱动芯片的范例。
- 绑定语言:除了 C 语言主库,还有 MicroPython、Arduino 语言、Rust 等绑定,方便不同背景的开发者。
5. 与其他 GUI 方案对比
| 方案 | 特点 | 适合场景 | 对比 LVGL |
|---|---|---|---|
| emWin | 老牌商业库,稳定 | 高可靠性商业产品 | 需付费,界面风格较老旧 |
| TouchGFX | 效果华丽,但硬件要求高 | STM32 高性能单片机 | 与 STM32 绑定较紧,占用资源更多 |
| Qt for MCU | 与 Qt 生态兼容 | 想复用 Qt 技能的开发者 | 商业授权,硬件要求比 LVGL 高 |
| uGFX | 轻量,商业化收费 | 极小资源设备 | 社区活跃度和文档不如 LVGL |