【LVGL】LVGL简介
1. 核心定义
LVGL 是现代嵌入式 GUI开发领域的一个强大,灵活且资源高效的选择。它凭借其轻量级、高性能、丰富的功能集、出色的可移植性和活跃的社区支持,成为众多工程师为嵌入式设备创建专业级用户界面的首选库。无论你的项目是基于低成本的微控制器还是功能更强的微处理器,LVGL 都值得考虑。
LVGL 是一个免费、开源的嵌入式图形库,用于为各种嵌入式设备创建美观、流畅的图形用户界面。它的设计目标是为任何具有微控制器(MCU)或微处理器(MPU)的设备提供高性能、低资源消耗且易于使用的 GUI 解决方案。
LVGL(Light and Versatile Graphics Library)是一个轻量级开源嵌入式图形库,用于为微控制器和微处理器设备创建高效美观的GUI界面。它具有轻量高效(核心库仅100-300KB)、高度可移植(支持多种MCU/MPU和RTOS)、功能丰富(提供100+组件和高级图形效果)等特性。LVGL采用模块化设计,包含对象系统、样式系统和事件系统,支持硬件加速和多种缓冲策略。该库广泛应用于物联网、工业控制、消费电子等领域,凭借其MIT许可证和活跃社区成为嵌入式GUI开发的首选解决方案。
2. 关键特性与优势
- 轻量级 & 高效:
● 核心库占用空间小(通常在 100KB 至 300KB ROM 左右,具体取决于配置和使用的功能)。
● 对 RAM 需求低(主缓冲区 + 对象开销,可通过配置优化)。
● 经过高度优化,即使在资源有限的低端 MCU(如 Cortex-M0+)上也能实现流畅的动画效果(通常 30-60 FPS)。
● 支持使用硬件加速(如 GPU、DMA2D)进一步提升性能。 - 高度可移植:
● 硬件无关: 本身不依赖特定硬件。通过提供简单的底层驱动接口(显示、输入设备、文件系统等)可以轻松移植到几乎任何具有显示功能的嵌入式平台(8/16/32位 MCU、MPU)。
● 操作系统无关: 自带轻量级实时操作系统(RTOS)所需功能(任务、定时器、信号量),也可以无缝集成到 FreeRTOS、Zephyr、Linux 等任何 RTOS 或裸机环境中运行。 - 功能丰富:
● 强大的组件库: 提供超过 100 种即用型、高度可定制的小部件(Widgets),如按钮、标签、滑块图表、列表、表格、窗口、仪表盘、键盘、动画、图片、画布等。
● 先进的图形效果: 支持抗锯齿(Anti-aliasing)、透明度(Opacity)、阴影、平滑滚动、图层、混合模式等。
● 多种输入设备支持: 触摸屏(电阻、电容)、鼠标、键盘、编码器、按钮等。
● 多语言支持: 内置 UTF-8 解码,支持中文等非 ASCII 字符。
● 主题引擎: 支持创建和切换不同视觉风格的主题(Material, Monochrome 等),轻松改变 UI 外观。
● 强大的事件系统: 灵活处理用户交互(点击、长按、拖动等)和系统事件。
● 文件系统支持: 方便加载图片、字体等资源。
● 硬件加速支持: 可充分利用 GPU 或 2D 加速器(如 STM32 LTDC/DMA2D,NXP PXP/VGLite,ESP32师LCD/CAM 等)提升染性能。 - 灵活 & 可定制:
● 几乎所有视觉属性(颜色、大小、位置、字体、动画效果等)都可以在运行时动态修改。
● 小部件可以通过样式(Styles)进行深度定制。
● 支持使用C或 Micropython 脚本创建复杂的 UI 逻辑。
5.开源 & 活跃社区:
● MIT 许可证:允许免费用于商业和闭源项目
● 庞大且活跃的社区: 提供丰富的文档、示例、教程、移植指南和论坛支持。
● 持续开发: 版本更新迭代快,功能不断增强,Bug修复及时。 - 开发友好:
● 完善的文档: 官方文档详尽,包含快速入门、移植指南、API参考和示例。
● 强大的模拟器: 提供 PC 模拟器(Windows,Linux,macOS),允许在桌面环境开发和调试 UI,无需硬件,极大提高开发效率。
● 丰富的工具: 如 SquareLine studio(官方可视化 UI设计器,付费但有免费版)、NuttX RTOS 集成、LVGL Builder 等。
- LVGL 在 Linux 系统中的角色:在 Linux 系统中,通常分为三个层次:
-
- 内核态驱动
● 显示:DRM/KMS、FrameBuffer、DirectFB 等。
● 触摸/输入:I2C/SPI 驱动结合 Input 子系统,上报 input_event。
- 内核态驱动
-
- 用户态适配层(LVGL 驱动)
● LVGL 运行在用户空间,通过“显示驱动(display driver)”与“输入驱动(input driver)”回调对接内核驱动或图形栈。
- 用户态适配层(LVGL 驱动)
-
- 应用层
● 使用 LVGL API 创建界面、控件、动画等。
- 应用层
-
LVGL 本质上不是 Linux 内核驱动,它位于用户态,但需要与内核驱动协同工作,共同完成显示与输入的流程。
- LVGL 的核心模块:
| 模块 | 作用 | 关键概念 |
|---|---|---|
| Display driver | 将 LVGL 绘制好的像素刷入屏幕 | flush_cb、buffer |
| Input driver | 将触摸/按键数据喂给 LVGL | read_cb |
| HAL (Hardware Abstraction Layer) | 初始化 LVGL 时注册 display/input 驱动 | lv_disp_drv_t、lv_indev_drv_t |
| Tick & Task Handler | LVGL 的心跳与任务调度 | lv_tick_inc、lv_timer_handler |
| Draw engines | 软件渲染、GPU/加速接口 | LV_USE_GPU, draw_ctx |
显示驱动适配:关键回调与缓冲策略:
2.1. 基本步骤
- 创建显示缓冲区
static lv_color_t buf1[LV_HOR_RES_MAX * 50]; // 行缓冲
static lv_color_t buf2[LV_HOR_RES_MAX * 50]; // 可选第二缓冲
lv_disp_draw_buf_t draw_buf;
lv_disp_draw_buf_init(&draw_buf, buf1, buf2, LV_HOR_RES_MAX * 50);
- 初始化并注册
lv_disp_drv_
lv_disp_drv_t disp_drv;
lv_disp_drv_init(&disp_drv);
disp_drv.draw_buf = &draw_buf;
disp_drv.flush_cb = my_flush_cb;
disp_drv.hor_res = 1024;
disp_drv.ver_res = 600;
// 可选:disp_drv.rounder_cb/dpi/antialiasing 等
lv_disp_drv_register(&disp_drv);
- 实现
flush_cb
static void my_flush_cb(lv_disp_drv_t *disp_drv,
const lv_area_t *area,
lv_color_t *color_p)
{
// 将 color_p 指向的像素数据写入 framebuffer/DRM BO
fb_blit(area, color_p);
lv_disp_flush_ready(disp_drv); // 告知 LVGL 当前刷帧完成
}
2.2. 缓冲策略
在 Linux 上,多数 SoC 使用 DRM/KMS,推荐为 LVGL 提供整帧缓冲区,并在 flush_cb 中调用 DRM 原语(drmModeAtomicCommit / page flip)或直接写 /dev/fb0。
| 模式 | 描述 | 适用场景 |
|---|---|---|
| 单缓冲(Single Buffer) | 只用一个缓冲,flush 后等待复制完成 | RAM 紧张、刷新率低 |
| 双缓冲(Double Buffer) | 两个缓冲轮换,提高吞吐 | 常规配置 |
| 全帧缓冲(Full Frame) | 缓冲大小=整屏,memcpy到显示设备 | 显示控制器支持整帧 DMA |
| 局部刷新(Partial Refresh) | LVGL 根据脏区增量刷新 | 常见于内存受限 MCU/嵌入式 |
| DMA/GPU 协助 | LVGL 输出到 DMA 或 GPU buffer,再由硬件渲染/缩放/Alpha | 高性能平台 |
3. 典型应用场景
LVGL 广泛应用于需要嵌入式 GUI的领域,包括但不限于:
- 物联网设备: 智能家居控制面板、传感器显示终端。
- 工业控制: HMI(人机交互界面)、PLC 触摸屏、仪器仪表。
- 医疗设备:便携式监护仪、诊断设备界面,
- 消费电子:智能手表、健身追踪器、家电控制面板、玩具。
- 汽车电子: 车载信息娱乐系统辅助显示、仪表盘。
- 教育开发板: Raspberry Pi Pico,ESP32,STM32 等开发板的 GUI 应用。
- 任何需要用户友好界面的嵌入式屏幕设备。
4. 核心架构概念
- 对象系统: UI 元素(按钮、标签等)都是对象( 1v_objt ),具有层级关系(父子、兄弟)。
- 样式系统:定义对象的外观(颜色、字体、边距等)。样式可以继承和级联。
- 事件系统: 处理用户输入和对象状态变化(如点击、按下、值改变)。
- 动画系统: 为对象属性(位置、大小、颜色等)创建平滑过渡效果。
- 驱动层: 提供接口供用户实现具体的显示刷新、输入设备读取、文件系统访问等底层操作。
4.1. 典型项目结构
project/
├── drivers/ # 内核驱动(DRM、Touch)
├── rootfs/
│ ├── usr/bin/lvgl_app # LVGL 应用
│ └── etc/systemd/... # 自动启动
└── lvgl_app/
├── main.c # LVGL 初始化、任务循环
├── lv_drivers/ # display/input 适配层
├── CMakeLists.txt
└── configs/
4.2. LVGL 在 Linux 上的整体架构
+---------------------------+ +----------------------------+
| 用户空间 | | 内核空间 |
| | | |
| +---------------------+ | | +----------------------+ |
| | 应用: lvgl GUI | | <-->| | DRM/KMS 或 FB 驱动 | |
| | (main.c) |<-+ | | SPI/LCD, DSI, HDMI 等 | |
| +---------------------+ | | +-----------+----------+ |
| ↑ ↑ | | | |
| | | | | +-----v-----+ |
| +---+--+ | | | | 显示控制器 | |
| |lvgl| | | | +-----------+ |
| +---+--+ | | | |
| |lv_drivers| | +----------------------------+
| ↓ ↓ |
| evdev /dev/fb0|DRM |
+---------------------------+
- LVGL 核心:提供对象系统、渲染、动画、主题等功能。
- 显示驱动(
display driver):用户空间回调,用于把 LVGL 渲染结果写到 Linux 提供的显示缓冲(framebuffer、DRM dumb buffer、DMA-BUF、自定义 char 驱动等)。 - 输入驱动(
input device driver,indev):将触摸、按键、编码器等事件从 evdev 或自定义接口转换为 LVGL 输入事件。 - Tick / 任务处理:需要定时调用
lv_timer_handler()和lv_tick_inc(),可由 POSIX 线程或信号实现。
核心认知: LVGL 运行在用户空间,与内核驱动通过标准设备节点(/dev/fb*, /dev/dri/card*, /dev/input/event*)交互;驱动工程师的任务是确保内核显示/输入驱动正确提供这些接口,并在用户空间实现 LVGL 的回调 glue 代码。
5. 学习资源
官方网站:https://lvgl.io/(文档、示例、下载、社区链接)
GitHub 仓库:https://github.com/lvgl/lvgl
在线模拟器: https://sim.lvgl.io/
SquareLine Studio: https://squareline.io/
LVGL 论坛:https://forum.lvgl.io/
以上,欢迎有从事同行业的电子信息工程、互联网通信、嵌入式开发的朋友共同探讨与提问,我可以提供实战演示或模板库。希望内容能够对你产生帮助!
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)