3、开发环境搭建:硬件平台选择、LVGL源码获取、编译工具链配置、模拟器环境搭建

好,咱们正式开始动手了。

这一章,说白了就是「把家伙事儿备齐」。你想想看,做嵌入式图形开发,光有理论不行,得真刀真枪地跑起来。我见过不少新手,代码写了一大堆,结果环境没搭对,一编译全是红字,心态直接崩了。嗯,咱们今天就把这事彻底理清楚。

3.1 硬件平台怎么选?STM32 还是 ESP32?

这个问题,几乎每个学员都会问我。我的回答很简单:看你的项目需求

我个人习惯把这两个平台比作「轿车」和「SUV」。STM32 是轿车,稳、省油、生态好;ESP32 是 SUV,能越野、自带 WiFi 和蓝牙,但油耗高一点。

咱们直接看对比表:

特性 STM32(以F4/H7为例) ESP32(以S3为例)
主频 168MHz ~ 480MHz 240MHz
RAM 192KB ~ 1MB+ 512KB(可外扩PSRAM)
Flash 1MB ~ 2MB(通常外挂) 4MB ~ 16MB(内置)
无线功能 无(需外挂模块) WiFi + BLE 5.0
LVGL性能 流畅(带LTDC/DSI) 流畅(带SPI LCD)
开发成本 中等偏高
适合场景 工业、医疗、高端HMI 物联网、智能家居、原型验证
我的建议:如果你是初学者,或者只是做原型验证,优先选 ESP32。便宜、好买、资料多。我当年用 STM32F429 做第一个 LVGL 项目,光画板子就花了两周,心疼啊。后来换 ESP32,三天就跑起来了。
注意:如果你的项目需要跑复杂的动画,或者屏幕分辨率超过 480x320,建议上 STM32H7 或者带硬件 2D 加速的芯片。ESP32 的 PSRAM 延迟较高,动画多了会卡。

3.2 LVGL 源码获取:别去官网瞎翻

很多同学一上来就去 lvgl.io 点「Download」,结果下了一堆看不懂的文件夹。其实没必要。

我推荐的方式就一个:GitHub 克隆

# 克隆主仓库
git clone https://github.com/lvgl/lvgl.git

# 克隆示例工程(强烈推荐)
git clone https://github.com/lvgl/lv_port_pc_eclipse.git

# 或者用 ESP32 的
git clone https://github.com/lvgl/lv_port_esp32.git

为什么我推荐克隆示例工程?因为 LVGL 本身只是一个图形库,它需要和具体的硬件平台绑定。示例工程里已经把 lv_conf.h、显示驱动、触摸驱动都搭好了框架,你只需要改改引脚配置就行。

嗯,这里有个坑。我曾经直接拿主仓库的源码,自己从头写移植代码,结果折腾了三天,发现示例工程里早就写好了。所以,别重复造轮子

3.3 编译工具链配置:别怕,就三步

工具链配置,说白了就是让电脑能听懂你写的 C 代码。不同平台,工具链不同。

3.3.1 针对 STM32

我建议用 STM32CubeIDE,它集成了 GCC 编译器、调试器、代码生成器,开箱即用。

  1. 去 ST 官网下载 STM32CubeIDE(免费,但需要注册)
  2. 安装时勾选「GCC for ARM」
  3. 新建工程时选择你的芯片型号,比如 STM32F429ZIT6

如果你喜欢命令行,也可以用 arm-none-eabi-gcc + Makefile。我个人习惯用 CubeIDE,因为调试方便,看变量值、看寄存器,一目了然。

3.3.2 针对 ESP32

ESP32 的工具链更简单,用 ESP-IDF 或者 Arduino IDE 都行。

我推荐 ESP-IDF,因为 LVGL 官方对 ESP-IDF 的支持最好。

# 安装 ESP-IDF(以 v5.0 为例)
git clone -b v5.0 https://github.com/espressif/esp-idf.git
cd esp-idf
./install.sh
. ./export.sh

安装完以后,你可以在终端里直接编译 LVGL 示例工程:

cd lv_port_esp32
idf.py set-target esp32s3
idf.py menuconfig
idf.py build
idf.py flash monitor
关键点:第一次编译会很慢,因为要下载很多依赖包。别急,去泡杯咖啡。我当年第一次编译 ESP32 的 LVGL 工程,等了快 10 分钟,还以为死机了。

3.4 模拟器环境搭建:没硬件也能跑 LVGL

这是我最喜欢的一步。你想想看,如果每次调试 UI 都要烧录到开发板上,那效率得多低?

模拟器,就是在你的电脑上直接跑 LVGL。鼠标当触摸,键盘当按键,爽得很。

3.4.1 基于 SDL 的模拟器(推荐 Windows/Linux/Mac)

SDL 是一个跨平台的多媒体库,LVGL 官方提供了 SDL 的移植。

# 克隆 SDL 模拟器工程
git clone https://github.com/lvgl/lv_port_pc_eclipse.git
cd lv_port_pc_eclipse

# 安装 SDL2(以 Ubuntu 为例)
sudo apt-get install libsdl2-dev

# 编译
make

# 运行
./build/bin/main

运行起来后,你会看到一个窗口,里面就是 LVGL 的 demo。鼠标点击就是触摸,键盘方向键可以模拟按键。

小技巧:lv_conf.h 里把 LV_USE_DEMO_WIDGETS 设为 1,就能看到 LVGL 所有控件的展示效果。我经常用这个来测试新版本的兼容性。

3.4.2 基于 FrameBuffer 的模拟器(适合 Linux 嵌入式)

如果你用的是树莓派或者带 Linux 的开发板,可以用 FrameBuffer 方式。它不依赖 X11 或 Wayland,直接在 /dev/fb0 上画图。

# 确保你的 Linux 内核支持 FrameBuffer
ls /dev/fb*

# 编译 LVGL 的 FrameBuffer 示例
git clone https://github.com/lvgl/lv_port_linux.git
cd lv_port_linux
make

# 运行(需要 root 权限)
sudo ./build/bin/demo

嗯,这里要注意。FrameBuffer 模式下,如果你在 SSH 终端里运行,是看不到画面的。必须接上 HDMI 显示器或者用 VNC 远程桌面。

我曾经踩过的坑:在树莓派上跑 FrameBuffer 模拟器,结果屏幕一直黑。查了半天,发现是 /boot/config.txt 里没有启用 dtoverlay=vc4-fkms-v3d。加上以后,重启就好了。

3.5 验证环境是否搭建成功

环境搭好了,怎么知道对不对?很简单,跑一个「Hello World」级别的 LVGL 程序。

#include "lvgl.h"

void my_gui_init(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);
}

int main(void)
{
    lv_init();
    
    // 初始化显示驱动和触摸驱动(这里省略具体代码)
    // ...
    
    my_gui_init();
    
    while(1) {
        lv_timer_handler();
        usleep(5000);
    }
}

如果你能在屏幕上看到「Hello, LVGL!」这几个字,恭喜你,环境搭建成功了。

如果看不到,别慌。先检查 lv_conf.h 里的宏定义是否正确,再检查显示驱动的回调函数是否注册了。我遇到过最离谱的一次,是忘记调用 lv_timer_handler(),结果屏幕一直黑着。

3.6 本章小结

好,咱们捋一捋今天干了什么:

  • 硬件平台:STM32 稳,ESP32 快,看需求选
  • 源码获取:别下主仓库,直接克隆示例工程
  • 工具链:STM32 用 CubeIDE,ESP32 用 ESP-IDF
  • 模拟器:SDL 适合 PC 开发,FrameBuffer 适合 Linux 嵌入式

下一章,咱们就要开始真正写代码了——显示驱动的移植与优化。我会手把手教你配置 LTDC 和 SPI 接口,让屏幕亮起来。

到时候见。