1、LVGL简介与环境搭建
各位同学好,我是你们这趟LVGL移植之旅的向导。做嵌入式图形界面有些年头了,踩过的坑、熬过的夜,回头看看都成了经验。今天咱们就从零开始,先搞清楚LVGL到底是什么,为什么选它,再把开发环境搭起来。
嗯,别急着敲代码。先把地基打牢,后面才稳当。
1.1 LVGL是什么
LVGL,全称Light and Versatile Graphics Library。说白了,就是一个专为嵌入式系统打造的图形库。
你想想看,MCU资源就那么点——几KB的RAM,几百KB的Flash,还要跑个漂亮的界面。LVGL就是干这个的。它用C语言写的,移植性极强,从几十块钱的STM32到带GPU的高端芯片,都能跑。
我记得2018年第一次接触LVGL v6时,就被它的设计惊艳到了。那时候市面上能用的嵌入式GUI库屈指可数,要么太臃肿,要么功能残缺。LVGL算是把「轻量」和「丰富」平衡得最好的一个。
核心定位:LVGL是为资源受限的嵌入式设备量身打造的开源图形库。最低配置:16KB RAM + 64KB Flash就能跑起来。
1.2 为什么选择LVGL
这个问题我经常被问到。市面上有TouchGFX、emWin、LittlevGL(LVGL前身),为什么偏偏选它?
我列几个关键点,你品品:
- 开源免费——MIT协议,商用无压力。不像emWin,一张License几千块。
- 组件丰富——按钮、滑块、图表、键盘、动画……30多种控件,开箱即用。
- 低资源占用——我曾在STM32F103C8T6(64KB Flash, 20KB RAM)上跑过完整界面,流畅度完全能接受。
- 硬件无关——你只需要实现三个底层函数:显示刷新、触摸输入、时钟滴答。其他全交给LVGL。
- 社区活跃——GitHub上4万多Star,遇到问题基本都能搜到答案。
我曾经在一个工业仪表项目里,客户要求一周出原型。用LVGL的模拟器在PC上先调好界面,再移植到MCU上,三天就搞定了。换做其他库,光配置环境就得两天。
我的建议:如果你做的是消费电子、智能家居、工业HMI,LVGL基本是首选。除非你的MCU连16KB RAM都拿不出来,那才考虑更轻量的u8g2。
1.3 LVGL架构概览
先别急着看代码。理解架构,比背API重要一百倍。
LVGL的架构分三层,我画了张图,你一看就明白:
这张图怎么看?
- 最底层是HAL——硬件抽象层。你负责把屏幕点亮、把触摸数据传进来、给LVGL一个1ms的时钟。就这三件事。
- 中间是Core——LVGL的心脏。所有控件、动画、事件处理都在这里。你不用动它,也尽量别动它。
- 最上面是Application——你的代码。创建页面、绑定数据、处理用户点击。
说白了,LVGL把「画界面」这件事封装得干干净净。你只需要告诉它「我要一个按钮,放在坐标(100,50),点击后打印Hello」,剩下的渲染、触摸检测、动画过渡,它全包了。
注意:千万不要在HAL层里写业务逻辑。我曾经见过有人把页面切换写在触摸驱动里,结果后面改需求时,整个代码乱成一锅粥。HAL层只做一件事:把硬件数据透传给LVGL。
1.4 开发环境准备
环境搭好了,后面才能跑得顺。我按三个维度来讲:MCU选型、IDE配置、模拟器搭建。
1.4.1 MCU选型
选MCU,说白了就是看资源够不够。我整理了一张表,你对照着选:
| 需求等级 | 推荐MCU | Flash | RAM | 适用场景 |
|---|---|---|---|---|
| 入门级 | STM32F103C8T6 | 64KB | 20KB | 128x64单色屏,简单菜单 |
| 进阶级 | STM32F429IGT6 | 1MB | 256KB | 480x272彩屏,带触摸 |
| 高性能 | ESP32-S3 | 8MB | 512KB | 带WiFi/蓝牙,复杂动画 |
| 旗舰级 | i.MX RT1062 | 16MB | 1MB | 带GPU加速,高清大屏 |
我个人习惯是:先定屏幕分辨率,再算RAM。一个简单的公式:帧缓冲大小 = 宽度 × 高度 × 色彩深度 / 8。比如480x272的RGB565屏,一帧需要480×272×2 = 261KB。你的RAM至少得是帧缓冲的2倍,因为LVGL还要跑控件、动画。
避坑指南:我曾经选了一颗STM32F103,RAM只有20KB,硬要跑320x240的彩屏。结果帧缓冲都放不下,最后只能降分辨率、用单色屏。选型时一定先算RAM,别拍脑袋。
1.4.2 IDE配置
IDE这块,我推荐三个:
- STM32CubeIDE——ST官方IDE,免费,集成了CubeMX配置。适合STM32系列。
- Keil MDK——老牌IDE,编译快,调试强。但License不便宜。
- VS Code + PlatformIO——我目前的主力。免费、插件丰富、支持ESP32和STM32。
配置步骤其实大同小异:
- 新建工程,选择你的MCU型号。
- 配置时钟树——LVGL需要一个1ms的定时器中断。
- 配置SPI/I2C/并行接口——用来驱动屏幕。
- 配置GPIO——触摸屏的中断引脚。
- 把LVGL源码包丢进工程目录。
- 在main.c里调用lv_init()和lv_tick_inc()。
嗯,听起来步骤多,但熟练后十分钟就能搞定。
1.4.3 模拟器搭建
这个我必须重点讲。模拟器是LVGL开发的神器——你在PC上写好界面,一键运行,不用反复烧录MCU。我开发流程里,80%的界面工作都是在模拟器上完成的。
LVGL官方提供了模拟器项目,基于SDL2。搭建步骤:
# 1. 克隆LVGL仓库
git clone https://github.com/lvgl/lv_port_pc_eclipse.git
# 2. 安装SDL2库(Ubuntu为例)
sudo apt-get install libsdl2-dev
# 3. 进入目录,用CMake构建
cd lv_port_pc_eclipse
mkdir build && cd build
cmake ..
make
# 4. 运行
./lv_sim
如果你是Windows用户,用VS Studio或者Code::Blocks都行。官方仓库里已经配好了工程文件,打开就能编译。
我的工作流:在模拟器上调UI → 确认效果 → 把代码复制到MCU工程 → 微调驱动参数 → 搞定。整个过程,MCU烧录次数不超过5次。
模拟器跑起来后,你会看到一个窗口,里面就是LVGL的默认界面。你可以用鼠标模拟触摸,用键盘模拟按键。所有控件、动画、样式,和MCU上跑的一模一样。
为什么会这样?因为LVGL的绘图引擎是纯软件渲染,不依赖硬件GPU。你在PC上看到的每一个像素,都是LVGL自己算出来的。移植到MCU上,只是换了个显示驱动,渲染逻辑完全不变。
注意:模拟器上跑得再流畅,也不代表MCU上能跑。PC的CPU是GHz级别的,MCU可能只有几十MHz。所以模拟器只验证功能,性能优化还得在真机上测。