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 开发界面的大致步骤:

  1. 初始化:调用 lv_init() 并初始化显示驱动和输入设备驱动(如触摸屏)。
  2. 创建对象:在屏幕上创建各种控件(如 lv_btn_create 创建按钮,lv_label_create 创建文字标签)。
  3. 设置属性:调整控件的位置、大小、颜色、文字内容、样式等。
  4. 添加事件:为控件绑定回调函数,例如“点击按钮时 LED 闪烁”。
  5. 循环运行:在主循环中周期性调用 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