2、开发环境搭建:硬件平台选择、工具链安装与工程模板创建
做嵌入式 GUI,第一步不是写代码,而是把「战场」铺好。硬件选什么、用什么 IDE、怎么把 LVGL 源码请进工程——这些事如果没理清楚,后面调试起来会非常痛苦。我见过不少新手卡在编译报错上,折腾半天发现是工具链版本不对。嗯,咱们这一章就把这些基础打扎实。
2.1 硬件平台怎么选?STM32 还是 ESP32?
很多同学会纠结:到底用 STM32 还是 ESP32?我的建议是——看你手头有什么,以及你的目标是什么。
我个人习惯把这两个平台的特点列个表,大家一看就明白:
| 对比项 | STM32(以 F4/H7 为例) | ESP32(以 S3/C3 为例) |
|---|---|---|
| 主频 | 168~480 MHz | 240~480 MHz |
| RAM | 192 KB ~ 1 MB | 512 KB ~ 8 MB(PSRAM) |
| Flash | 512 KB ~ 2 MB | 4 MB ~ 16 MB |
| 内置 Wi-Fi/BT | 无(需外挂) | 有 |
| LVGL 流畅度 | 中高(带 LTDC/DMA2D 更佳) | 高(PSRAM 加持) |
| 开发成本 | 中(调试器贵) | 低(USB 直接烧录) |
| 适合场景 | 工业控制、医疗设备 | 智能家居、物联网屏显 |
说白了,如果你要做带 Wi-Fi 的联网屏,ESP32 是首选。如果你在工业现场,对稳定性要求极高,STM32 更靠谱。我在项目中遇到过用 ESP32 做温控器,Wi-Fi 干扰导致屏幕闪烁,后来换了 STM32 + 外置 Wi-Fi 模块才解决。所以没有绝对的好坏,只有合不合适。
2.2 软件工具链安装
硬件选好了,接下来就是装软件。这里我分两个平台讲,大家按自己的选择来。
2.2.1 如果你选 STM32
我推荐用 STM32CubeIDE。它集成了编辑器、编译器、调试器,开箱即用。安装步骤很简单:
- 去 ST 官网下载 STM32CubeIDE(免费,但需要注册账号)。
- 安装时一路默认,注意勾选「STM32CubeProgrammer」——烧录工具。
- 安装完成后,打开 IDE,它会自动识别你电脑上的 J-Link 或 ST-Link 调试器。
编译器方面,CubeIDE 内置了 arm-none-eabi-gcc,不用额外装。不过我个人习惯单独装一个 GNU Arm Embedded Toolchain,方便在命令行里编译测试。你可以在 ARM 官网下载,选最新稳定版就行。
2.2.2 如果你选 ESP32
ESP32 的开发环境我推荐 VS Code + PlatformIO。为什么?因为 PlatformIO 自动管理工具链和库,省心。
安装步骤:
- 安装 VS Code(微软官网免费下载)。
- 在 VS Code 扩展市场搜索「PlatformIO IDE」,安装。
- 重启 VS Code,PlatformIO 会自动下载 ESP32 的工具链(大约 500 MB,耐心等)。
- 新建项目时,Board 选择「Espressif ESP32-S3-DevKitC-1」或你手头的型号。
如果你喜欢用 ESP-IDF 原生环境,也可以。但说实话,对于 LVGL 开发,PlatformIO 的库管理更方便——直接在 platformio.ini 里写一行 lib_deps = lvgl/lvgl 就搞定了。
2.3 LVGL 源码获取
LVGL 的源码托管在 GitHub 上。获取方式有两种:
- 方式一:直接下载 ZIP —— 去 GitHub 搜索 lvgl/lvgl,点「Code」→「Download ZIP」。适合网络不好的同学。
- 方式二:Git Clone —— 在终端执行
git clone https://github.com/lvgl/lvgl.git。我推荐这种方式,方便后续更新。
下载后,你会看到这样的目录结构:
lvgl/
├── src/ # 核心源码
├── examples/ # 示例工程
├── demos/ # 演示程序
├── docs/ # 文档
├── lv_conf_template.h # 配置文件模板
└── lvgl.h # 主头文件
嗯,这里要注意:lv_conf_template.h 是配置模板,你需要把它复制到工程目录,重命名为 lv_conf.h,然后修改里面的宏定义。比如屏幕分辨率、颜色深度、内存大小等。我刚开始做的时候忘了改这个,结果屏幕一片黑——后来发现是颜色格式没对上。
2.4 创建工程模板
有了源码,接下来就是把它塞进你的工程里。我以 ESP32 + PlatformIO 为例,给大家演示一下。
2.4.1 目录结构
在 PlatformIO 项目根目录下,创建这样的结构:
my_lvgl_project/
├── src/
│ └── main.c
├── lib/
│ └── lvgl/ # 把 lvgl 源码整个复制进来
│ ├── src/
│ ├── lv_conf.h # 配置文件
│ └── lvgl.h
├── platformio.ini
└── include/
└── lv_conf.h # 也可以放这里,看个人习惯
我个人习惯把 lvgl 放在 lib/ 目录下,这样 PlatformIO 会自动编译它。如果你用 STM32CubeIDE,可以把 lvgl 源码放到 Drivers/ 或 Middlewares/ 目录下。
2.4.2 配置 lv_conf.h
打开 lv_conf.h,找到下面几个关键配置:
/* 颜色深度:16位 RGB565 最常见 */
#define LV_COLOR_DEPTH 16
/* 屏幕分辨率 */
#define LV_HOR_RES_MAX 480
#define LV_VER_RES_MAX 320
/* 内存分配:ESP32 建议 64 KB */
#define LV_MEM_SIZE (64U * 1024U)
/* 开启字体和图片支持 */
#define LV_FONT_MONTSERRAT_12 1
#define LV_FONT_MONTSERRAT_16 1
#define LV_USE_IMG 1
2.4.3 编写 main.c 骨架
一个最简单的 LVGL 初始化流程如下:
#include "lvgl.h"
#include "lv_port_disp.h" // 显示驱动
#include "lv_port_indev.h" // 输入设备驱动
int main(void)
{
/* 硬件初始化:时钟、GPIO、SPI/I2C 等 */
hal_init();
/* LVGL 初始化 */
lv_init();
/* 注册显示驱动 */
lv_port_disp_init();
/* 注册触摸或按键驱动 */
lv_port_indev_init();
/* 创建 UI(后续章节会讲) */
lv_obj_t *label = lv_label_create(lv_scr_act());
lv_label_set_text(label, "Hello LVGL!");
/* 主循环 */
while(1)
{
lv_timer_handler(); // 处理 LVGL 任务
my_delay_ms(5); // 延时 5ms
}
}
这个骨架看起来简单,但实际跑起来需要你实现 lv_port_disp.c 和 lv_port_indev.c。这两个文件在 lvgl 的 examples/porting 目录下有模板,复制出来改改就行。
lv_conf.h 里的宏定义有没有打开,再检查显示驱动的 SPI 时序对不对。
2.5 本章知识体系总览
为了让大家更直观地理解整个环境搭建的流程,我画了一张图:
这张图把整个流程串起来了。你从硬件选择开始,走到对应的工具链,然后获取 LVGL 源码,最后创建工程模板。每一步都有坑,但按这个流程走,基本不会迷路。
2.6 小结
这一章我们做了三件事:选了硬件、装了工具链、搭了工程模板。说实话,这些事看起来琐碎,但它们是后面所有 UI 开发的地基。我见过太多人急着写界面,结果编译不过、屏幕不亮,回头查发现是配置没改——白白浪费半天时间。