1、LVGL初探:什么是LVGL、LVGL的架构与设计哲学、LVGL在嵌入式领域的地位
1.1 什么是LVGL?
LVGL,全称 LittlevGL,现在官方叫 LVGL(Light and Versatile Graphics Library)。说白了,它是一套为嵌入式系统量身打造的开源图形库。你想想看,我们做嵌入式开发,尤其是带屏幕的产品,总不能每次都从画像素点开始吧?LVGL 就是帮你把按钮、滑块、图表、列表这些东西都封装好了,你直接调用就行。
我记得第一次接触 LVGL 是在一个智能家居项目里。当时客户要求一周内出一个带触摸屏的控制面板原型。如果用传统方式,光是写一个滑动条控件就得三天。后来我用了 LVGL,半天就把界面搭起来了。嗯,从那以后我就成了它的忠实用户。
LVGL 的核心特点可以归纳为以下几点:
- 轻量级:最低配置只需要 16KB RAM 和 64KB Flash,Cortex-M3 级别的 MCU 就能跑起来。
- 硬件无关性:你只需要提供显示器的驱动(画点函数)和输入设备驱动(触摸/按键),LVGL 就能工作。
- 丰富的控件库:内置 30+ 种控件,从基础的按钮、标签到高级的图表、日历、动画,应有尽有。
- MIT 开源协议:商业项目可以直接用,不用公开源码,这点对产品开发非常友好。
1.2 LVGL 的架构与设计哲学
LVGL 的架构设计非常清晰,我习惯把它分成三层来看:
这种分层设计的好处很明显:你换硬件平台,只需要改最底层的驱动层,核心代码和应用代码完全不用动。我在一个项目里把 STM32F4 换成了 ESP32,移植 LVGL 只花了半天时间,改的就是显示驱动和触摸驱动那几十行代码。
1.3 LVGL 的设计哲学
LVGL 的设计哲学,我个人总结为三个关键词:
- 对象化:一切皆对象(lv_obj_t)。按钮是对象,标签是对象,屏幕也是对象。对象之间有父子关系,子对象会继承父对象的样式和属性。这跟 Web 前端的 DOM 树非常像。
- 事件驱动:用户触摸、按键按下、定时器触发,都是事件。你只需要注册回调函数,LVGL 会在合适的时机调用它。这种模式写 UI 逻辑非常自然。
- 样式分离:控件的视觉表现(颜色、边框、阴影)和逻辑行为(点击、滑动)是分开的。你可以给同一个按钮换不同的样式主题,而不用改它的业务代码。
避坑指南:我曾经犯过一个错误——在事件回调里直接调用 lv_obj_del() 删除对象。结果程序跑飞了。后来才知道,LVGL 的事件系统里,删除对象要用 lv_event_send() 或者延迟删除。这个坑很多新手都会踩,后面章节我会详细讲。
1.4 LVGL 在嵌入式领域的地位
现在嵌入式 GUI 方案不少,我列个对比表,你一看就明白 LVGL 的位置了:
| 方案 | 资源需求 | 控件丰富度 | 开源协议 | 社区活跃度 | 典型场景 |
|---|---|---|---|---|---|
| LVGL | 极低(16KB RAM) | ★★★★★ | MIT | 极高 | MCU 产品、智能家居、仪器仪表 |
| emWin | 低 | ★★★★ | 商业收费 | 低 | 工业控制、医疗设备 |
| TouchGFX | 中等 | ★★★★ | 商业/免费 | 中等 | STM32 高端产品 |
| Qt for MCU | 较高 | ★★★★★ | 商业收费 | 中等 | 高端嵌入式、汽车仪表 |
| uGFX | 低 | ★★★ | 商业/免费 | 低 | 简单界面、低端 MCU |
从这张表能看出来,LVGL 在「资源需求」和「功能丰富度」之间取得了最好的平衡。它既能跑在几十块钱的 STM32F103 上,也能跑在带 Linux 的高端平台上。我见过有人用 LVGL 做智能手表,也见过用它做工业 HMI 的。
为什么 LVGL 能这么火?说白了,它解决了嵌入式开发者的一个核心痛点:用最少的资源,做出最漂亮的界面。而且它的社区生态非常完善,GitHub 上有 1.6 万+ Star,遇到问题基本都能搜到答案。
1.5 本章小结
这一章我们聊了 LVGL 是什么、它的三层架构、设计哲学,以及它在嵌入式 GUI 领域的地位。说白了,LVGL 就是嵌入式开发者的「UI 加速器」——你不用从零造轮子,直接站在巨人的肩膀上干活。