1. 课程导入

各位同学好,我是你们这趟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的架构分三层,我画了张图,你一看就明白:

LVGL 三层架构图 应用层(Application) 你的业务逻辑:页面切换、数据刷新、事件处理 LVGL核心层(Core) 控件库 | 事件系统 | 动画引擎 | 样式管理 绘图API | 字体渲染 | 内存管理 硬件抽象层(HAL) 显示驱动 | 触摸驱动 | 时钟滴答 | 文件系统接口 你只需要实现HAL层,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。

配置步骤其实大同小异:

  1. 新建工程,选择你的MCU型号。
  2. 配置时钟树——LVGL需要一个1ms的定时器中断。
  3. 配置SPI/I2C/并行接口——用来驱动屏幕。
  4. 配置GPIO——触摸屏的中断引脚。
  5. 把LVGL源码包丢进工程目录。
  6. 在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。所以模拟器只验证功能,性能优化还得在真机上测。