第一章:LVGL概述与环境搭建
大家好,我是你们这门课的老朋友。今天咱们来聊聊LVGL——这个在嵌入式圈子里越来越火的图形库。
说实话,我第一次接触LVGL是在一个智能家居项目里。当时客户要求做一块3.5寸的彩色触摸屏,要显示温湿度曲线、设备状态、还要有动画效果。我一开始想用传统的emWin,但那个授权费用...嗯,你懂的。后来同事推荐了LVGL,一试就回不去了。
1.1 LVGL是什么?
LVGL的全称是Light and Versatile Graphics Library,翻译过来就是「轻量且通用的图形库」。它专门为嵌入式系统设计,说白了就是让那些资源有限的MCU也能跑出漂亮的图形界面。
我个人的理解是:LVGL就像嵌入式界的「小程序框架」。你不需要关心底层像素怎么画,只需要调用API就能创建按钮、滑块、图表这些控件。它帮你把底层的脏活累活都干了。
核心定位:面向嵌入式MCU的、开源的、功能丰富的GUI库。
1.2 核心特性
为什么我推荐大家学LVGL?因为它有几个让我特别心动的特性:
- 开源免费——MIT协议,商用也没问题。这点比emWin、TouchGFX香多了。
- 资源占用极低——最低只要16KB RAM、64KB Flash就能跑。我在STM32F103上就跑起来过,你敢信?
- 控件丰富——按钮、标签、图表、滑块、下拉列表...30多种内置控件,基本覆盖了常见需求。
- 支持触摸和输入——触摸屏、鼠标、键盘、编码器,统统支持。
- 内置字体和图片解码——支持UTF-8多语言,还能解码PNG、JPEG、BMP。
- 动画引擎——这个是我最喜欢的。做过渡动画、滑动效果,几行代码就搞定。
- 样式系统——类似CSS,可以灵活定制控件外观。
我的经验:LVGL的动画引擎特别适合做仪表盘。比如指针旋转、数值跳变,用lv_anim做出来效果非常丝滑。我在一个车载仪表项目里,用动画实现了转速表的平滑过渡,客户看了直点头。
1.3 支持平台
LVGL的移植性做得相当好。我列一下它支持的主要平台:
| 平台类型 | 具体例子 | 说明 |
|---|---|---|
| MCU | STM32、ESP32、NXP、瑞萨 | 主流ARM Cortex-M系列都支持 |
| Linux | 树莓派、全志、瑞芯微 | 通过FrameBuffer或DRM驱动 |
| PC模拟 | Windows、macOS、Linux | 用SDL或X11模拟运行 |
| RTOS | FreeRTOS、RT-Thread、uCOS | 多任务环境下也能稳定运行 |
我个人建议:刚开始学的时候,先在PC上搭模拟环境。这样调试方便,不用反复烧录固件。等逻辑调通了,再移植到目标板子上。
1.4 在PC上搭建模拟开发环境
好,接下来咱们动手。我会用VS Code + SDL的方式在Windows上搭建模拟环境。为什么选这个组合?因为VS Code免费、轻量、插件丰富,SDL则能模拟显示和输入。
第一步:安装VS Code
去官网下载安装就行。记得装上这几个插件:
- C/C++(微软官方那个)
- CMake Tools
- GitLens(可选,但看代码历史很方便)
第二步:安装SDL2
SDL2是模拟显示的后端。在Windows上,我建议用vcpkg来安装:
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
.\bootstrap-vcpkg.bat
.\vcpkg install sdl2:x64-windows
如果你不想用vcpkg,也可以直接去SDL官网下载开发包,手动配置include和lib路径。不过我个人觉得vcpkg更省事,一条命令搞定依赖。
第三步:克隆LVGL模拟器项目
LVGL官方提供了一个模拟器模板,咱们直接拿来用:
git clone https://github.com/lvgl/lv_port_pc_eclipse.git
cd lv_port_pc_eclipse
这个项目已经配置好了LVGL源码和SDL驱动。你只需要用VS Code打开它,然后配置CMake即可。
第四步:编译运行
在VS Code里按Ctrl+Shift+P,选择「CMake: Configure」,然后选择「CMake: Build」。编译成功后,按F5运行。如果一切顺利,你会看到一个灰色的窗口,中间有个「Hello World」的标签。
注意:我曾经遇到过SDL2版本不匹配的问题。如果你编译时报错找不到SDL2,检查一下vcpkg安装的版本是不是64位的。另外,CMakeLists.txt里要正确设置vcpkg的toolchain文件路径。
1.5 第一个Hello World程序
环境搭好了,咱们写个真正的Hello World。打开main.c,找到lv_example_get_started_1这个函数,改成这样:
void lv_example_get_started_1(void)
{
// 创建一个标签控件
lv_obj_t * label = lv_label_create(lv_scr_act());
// 设置文本内容
lv_label_set_text(label, "Hello, LVGL!");
// 让标签居中显示
lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);
// 设置字体大小(可选)
lv_obj_set_style_text_font(label, &lv_font_montserrat_20, 0);
}
这段代码做了三件事:
- 在活动屏幕上创建一个标签
- 设置标签的文字为「Hello, LVGL!」
- 把标签居中显示
编译运行后,你会看到窗口中央显示了一行文字。嗯,虽然简单,但这是你踏入LVGL世界的第一步。
我的建议:第一次跑通后,可以试着改改文字内容、换个字体、或者调整对齐方式。多动手试试,比光看文档强多了。我记得我第一次跑通时,兴奋地把文字改成了「I ❤️ LVGL」,然后截图发到了朋友圈...
本章小结
这一章咱们搞定了三件事:
- 知道了LVGL是什么——一个轻量、开源、功能强大的嵌入式GUI库
- 了解了它的核心特性——资源占用低、控件丰富、动画引擎强大
- 亲手搭建了PC模拟环境——VS Code + SDL,跑通了第一个Hello World程序
下一章,咱们会深入LVGL的对象系统,聊聊控件是怎么创建、怎么管理、怎么销毁的。到时候我会分享一些我在项目中踩过的坑,比如内存泄漏的问题——嗯,那都是血泪教训啊。
好了,今天就到这里。如果你在搭建环境时遇到问题,欢迎在评论区留言。咱们下章见!
公众号:蓝海资料掘金营,微信deep3321