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 | 物联网、智能家居、原型验证 |
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 编译器、调试器、代码生成器,开箱即用。
- 去 ST 官网下载 STM32CubeIDE(免费,但需要注册)
- 安装时勾选「GCC for ARM」
- 新建工程时选择你的芯片型号,比如 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
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 远程桌面。
/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 接口,让屏幕亮起来。
到时候见。