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 模块才解决。所以没有绝对的好坏,只有合不合适。

我的建议: 初学者优先选 ESP32-S3 + 3.5 寸 480x320 屏幕。成本低、资料多、LVGL 跑起来很顺。等你把 GUI 逻辑摸透了,再移植到 STM32 上也不迟。

2.2 软件工具链安装

硬件选好了,接下来就是装软件。这里我分两个平台讲,大家按自己的选择来。

2.2.1 如果你选 STM32

我推荐用 STM32CubeIDE。它集成了编辑器、编译器、调试器,开箱即用。安装步骤很简单:

  1. 去 ST 官网下载 STM32CubeIDE(免费,但需要注册账号)。
  2. 安装时一路默认,注意勾选「STM32CubeProgrammer」——烧录工具。
  3. 安装完成后,打开 IDE,它会自动识别你电脑上的 J-Link 或 ST-Link 调试器。

编译器方面,CubeIDE 内置了 arm-none-eabi-gcc,不用额外装。不过我个人习惯单独装一个 GNU Arm Embedded Toolchain,方便在命令行里编译测试。你可以在 ARM 官网下载,选最新稳定版就行。

注意: 我曾经因为 CubeIDE 版本太旧,导致生成的代码和 LVGL 的某些宏定义冲突。建议用 2023 年之后的版本,或者直接去 ST 官网下最新的。

2.2.2 如果你选 ESP32

ESP32 的开发环境我推荐 VS Code + PlatformIO。为什么?因为 PlatformIO 自动管理工具链和库,省心。

安装步骤:

  1. 安装 VS Code(微软官网免费下载)。
  2. 在 VS Code 扩展市场搜索「PlatformIO IDE」,安装。
  3. 重启 VS Code,PlatformIO 会自动下载 ESP32 的工具链(大约 500 MB,耐心等)。
  4. 新建项目时,Board 选择「Espressif ESP32-S3-DevKitC-1」或你手头的型号。

如果你喜欢用 ESP-IDF 原生环境,也可以。但说实话,对于 LVGL 开发,PlatformIO 的库管理更方便——直接在 platformio.ini 里写一行 lib_deps = lvgl/lvgl 就搞定了。

小技巧: 安装完 PlatformIO 后,先编译一个空项目,确保工具链没问题。我第一次装的时候卡在 Python 依赖上,后来发现是网络问题——换个源就好了。

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
避坑指南: 我曾经在 STM32F407 上把 LV_MEM_SIZE 设成 128 KB,结果内存溢出,系统直接 HardFault。后来改成 32 KB 就稳了。所以内存大小要根据芯片实际 RAM 来调,别贪多。

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 目录下有模板,复制出来改改就行。

我的经验: 第一次跑通这个骨架,哪怕只显示一个 "Hello LVGL",也值得庆祝。因为后面所有的 UI 开发都建立在这个基础上。如果卡住了,先检查 lv_conf.h 里的宏定义有没有打开,再检查显示驱动的 SPI 时序对不对。

2.5 本章知识体系总览

为了让大家更直观地理解整个环境搭建的流程,我画了一张图:

开发环境搭建流程 开发环境搭建流程 硬件平台选择 STM32 方案 ESP32 方案 STM32CubeIDE + GCC VS Code + PlatformIO LVGL 源码获取与配置 创建工程模板 → 跑通 Hello LVGL 选一个方案,别两个都搞 先跑通再优化

这张图把整个流程串起来了。你从硬件选择开始,走到对应的工具链,然后获取 LVGL 源码,最后创建工程模板。每一步都有坑,但按这个流程走,基本不会迷路。

2.6 小结

这一章我们做了三件事:选了硬件、装了工具链、搭了工程模板。说实话,这些事看起来琐碎,但它们是后面所有 UI 开发的地基。我见过太多人急着写界面,结果编译不过、屏幕不亮,回头查发现是配置没改——白白浪费半天时间。