1. LVGL 概述与环境搭建

各位工程师朋友,欢迎来到《LVGL界面移植与多平台适配指南》的第一章。今天咱们聊聊 LVGL 是什么,以及怎么把它的模拟器跑起来。

先说说我自己的经历。几年前我接手一个智能家居面板项目,MCU 资源有限,又要做漂亮的动画界面。试了好几个方案,要么太吃内存,要么文档稀烂。后来找到 LVGL,一周就把原型跑起来了。嗯,从那以后我就成了它的忠实用户。

1.1 LVGL 是什么

LVGL(Light and Versatile Graphics Library)是一个开源的嵌入式图形库。说白了,就是给单片机做界面的工具包。它用 C 语言写的,资源占用小,但功能一点不含糊。

你想想看,一个只有几百 KB Flash 的芯片,也能跑出带按钮、滑块、图表、动画的界面。这就是 LVGL 的本事。

核心特点:

  • 纯 C 实现,无硬性依赖
  • 支持 16/32/64 位 MCU 和 MPU
  • 内置 30+ 控件(按钮、标签、图表、键盘等)
  • 硬件加速接口(支持 DMA2D、GPU)
  • 丰富的输入设备支持(触摸、按键、编码器)

1.2 为什么选择 LVGL

市面上嵌入式 GUI 方案不少,比如 emWin、TouchGFX、LittlevGL(LVGL 的前身)。我为什么推荐 LVGL?

对比项 LVGL emWin TouchGFX
开源协议 MIT(免费商用) 商业授权 部分免费
最低 RAM ~8 KB ~16 KB ~32 KB
控件数量 30+ 20+ 25+
社区活跃度 高(GitHub 15k+ star) 中 中
学习曲线 平缓 中等 较陡

我个人最看重两点:一是 MIT 协议,商用不用提心吊胆;二是社区活跃,遇到问题搜一搜就有答案。我曾经在凌晨两点卡在一个触摸校准问题上,发了个 issue,第二天早上就有开发者回复了。这种体验,商业库给不了。

1.3 源码获取

获取 LVGL 源码很简单。官方仓库在 GitHub 上,我习惯直接克隆最新稳定版。

git clone https://github.com/lvgl/lvgl.git --branch v8.3.0

注意,我建议你拉取 release 分支,而不是 master。master 可能包含未稳定的新特性。我在项目里吃过这个亏——用 master 跑了一个月,突然一个 API 变了,编译不过。后来就老实了,只跟 release。

除了核心库,你还需要一个 lv_drivers 仓库,里面封装了常见显示器和触摸芯片的驱动。

git clone https://github.com/lvgl/lv_drivers.git

小技巧: 如果你只想快速体验,可以直接下载 lv_sim_visual_studio 或 lv_sim_eclipse_sdl 模拟器项目,里面已经整合好了核心库和驱动。

1.4 开发环境准备(VS Code + PlatformIO)

我推荐 VS Code + PlatformIO 组合。为什么?因为跨平台、配置简单、插件生态好。你不需要折腾 Keil 或 IAR 的许可证,一个编辑器搞定所有。

安装步骤:

  1. 下载安装 VS Code(code.visualstudio.com)
  2. 在扩展市场搜索 PlatformIO IDE,点击安装
  3. 安装完成后,重启 VS Code
  4. PlatformIO 会自动安装 Python 和核心工具链

注意: PlatformIO 安装过程需要联网下载工具链,如果网络不好,可能会卡在某个步骤。我曾经在公司内网装了一下午没成功,后来用手机热点才搞定。建议提前准备好稳定的网络环境。

1.5 第一个 LVGL 模拟器工程

好,环境准备好了,咱们开始创建第一个工程。这个工程会在你的电脑上模拟 LVGL 界面,不需要任何硬件。

步骤一:创建 PlatformIO 项目

  1. 打开 VS Code,点击 PlatformIO 图标
  2. 选择 New Project
  3. 项目名填 lvgl_simulator
  4. Board 选择 Desktop 下的 Native
  5. Framework 选择 LVGL
  6. 点击 Finish

步骤二:配置 platformio.ini

PlatformIO 会自动生成一个配置文件。我们需要添加 SDL 模拟器依赖。

[env:native]
platform = native
build_flags = 
    -I lib/lvgl
    -I lib/lv_drivers
lib_deps = 
    lvgl/lvgl@^8.3.0
    lvgl/lv_drivers@^8.3.0
    libsdl

步骤三:编写主程序

在 src/main.c 中写入以下代码:

#include "lvgl.h"
#include "lv_drivers/display/monitor.h"
#include "lv_drivers/indev/mouse.h"

int main(void)
{
    lv_init();
    monitor_init();
    mouse_init();

    lv_disp_drv_t disp_drv;
    lv_disp_drv_init(&disp_drv);
    disp_drv.flush_cb = monitor_flush;
    lv_disp_drv_register(&disp_drv);

    lv_indev_drv_t indev_drv;
    lv_indev_drv_init(&indev_drv);
    indev_drv.type = LV_INDEV_TYPE_POINTER;
    indev_drv.read_cb = mouse_read;
    lv_indev_drv_register(&indev_drv);

    /* 创建一个简单的按钮 */
    lv_obj_t *btn = lv_btn_create(lv_scr_act());
    lv_obj_set_pos(btn, 100, 100);
    lv_obj_set_size(btn, 120, 50);

    lv_obj_t *label = lv_label_create(btn);
    lv_label_set_text(label, "Hello LVGL");
    lv_obj_center(label);

    while(1) {
        lv_timer_handler();
        SDL_Delay(5);
    }

    return 0;
}

步骤四:编译运行

点击 PlatformIO 底部的 Build 按钮(对勾图标),编译通过后点击 Run(箭头图标)。你会看到一个窗口弹出来,上面有一个写着 "Hello LVGL" 的按钮。

成功了! 你的第一个 LVGL 模拟器工程已经跑起来了。你可以用鼠标点击按钮,虽然现在它还没有响应事件,但界面已经正常渲染了。

这里我画了一张图,帮你理清整个知识体系:

LVGL 第一章知识体系 LVGL 概述与环境搭建 LVGL 是什么 为什么选择 LVGL 源码获取 环境搭建 嵌入式 GUI 库 MIT 开源协议 GitHub 仓库 VS Code + PIO 核心目标 理解 LVGL 定位 → 掌握源码获取方式 → 搭建模拟器环境 → 运行第一个 LVGL 程序

这张图把本章的知识点串起来了。你看,从中心节点出发,四个分支分别对应四个小节,每个小节下面又有具体的子知识点。这样学起来,思路就清晰多了。

个人建议: 第一次跑模拟器时,别急着改代码。先感受一下 LVGL 的渲染效果,点一点按钮,拖一拖窗口。这能帮你建立对框架的直观认识。我当初就是先玩了半小时 demo,才决定深入学习的。

好了,第一章的内容就到这里。你已经了解了 LVGL 是什么、为什么选它、怎么获取源码、怎么搭建环境,并且成功跑起了第一个模拟器工程。这些基础打牢了,后面学控件、学移植就会轻松很多。