2、开发环境搭建:硬件平台选择(STM32/ESP32)、软件工具链安装(IDE、编译器、调试器)、LVGL源码获取与工程模板创建
好,咱们正式开始动手了。
这一章我带你把开发环境搭起来。说白了,就是先把“锅”支好,后面才能炒菜。很多新手朋友一上来就急着写代码,结果编译报错、下载失败、屏幕不亮……折腾半天,心态直接崩了。我当年也干过这种事,后来学乖了——环境搭建这一步,宁可慢一点,也要稳一点。
2.1 硬件平台怎么选?STM32 还是 ESP32?
这是第一个要面对的问题。我个人习惯是:看项目需求选芯片,别盲目跟风。
咱们做LVGL显示方案,核心需求就三个:算力够、内存足、外设全。我整理了一个对比表,你一看就明白:
| 对比项 | STM32(以F4/H7系列为例) | ESP32(以ESP32-S3为例) |
|---|---|---|
| 主频 | 168MHz ~ 480MHz | 240MHz |
| SRAM | 192KB ~ 1MB+ | 512KB(可外扩PSRAM) |
| Flash | 1MB ~ 2MB(片内) | 16MB(片外,通过SPI) |
| 显示接口 | FSMC / FMC(并口) | SPI / RGB(需额外硬件) |
| WiFi/蓝牙 | 无(需外挂模块) | 内置 |
| 开发成本 | 中等偏高 | 较低 |
| 适合场景 | 工业控制、高性能UI | 物联网、智能家居、原型验证 |
你看,没有绝对的“谁更好”。
如果你做的是工业仪表,要求高刷新率、高可靠性,那STM32 H7系列是首选。我在一个医疗设备项目里用过STM32H743,配合FMC接口驱动800x480的RGB屏,刷LVGL的动画非常流畅。
但如果你做的是智能家居面板,需要联网、OTA升级,那ESP32就香多了。我记得有一次帮朋友做个温控器,ESP32-S3加一块SPI屏,从画板子到出样机,一周就搞定了。
2.2 软件工具链安装:IDE、编译器、调试器
硬件选好了,接下来就是装软件。这部分我尽量说得细一点,因为每一步都可能出幺蛾子。
2.2.1 针对STM32的开发环境
我目前最常用的组合是:STM32CubeIDE + ST-Link调试器。为什么?因为CubeIDE集成了CubeMX的图形化配置功能,生成初始化代码非常方便。
安装步骤其实很简单:
- 去ST官网下载STM32CubeIDE(建议选最新稳定版)
- 双击安装,一路默认就行
- 安装过程中会自动下载GCC编译器,不用额外操心
- 插上ST-Link,驱动一般会自动装好
嗯,这里要注意一个坑:路径不要有中文。我曾经因为用户名是中文,导致CubeIDE死活编译不过,折腾了一下午才发现是路径问题。
2.2.2 针对ESP32的开发环境
ESP32这边,我推荐用VS Code + PlatformIO插件。当然,你也可以用乐鑫官方的ESP-IDF,但PlatformIO对新手更友好。
安装流程:
- 先装VS Code,这个不用多说了
- 在扩展商店里搜“PlatformIO IDE”,安装
- 安装完成后,重启VS Code
- PlatformIO会自动下载Python和编译工具链,等它跑完就行
我第一次装PlatformIO的时候,下载工具链花了快一个小时。别急,喝杯咖啡,或者去干点别的。它后台在下载GCC、OpenOCD、ESP-IDF框架,东西不少。
2.2.3 调试器怎么配?
调试器这东西,说白了就是让你能看到程序跑到了哪一行、变量值是多少。
- STM32: 用ST-Link。CubeIDE里默认配置好了,你只需要在Debug Configurations里选一下“ST-Link (SWD)”就行。
- ESP32: 用板载的USB转串口(CP2102或CH340)。PlatformIO里选好端口号,点“Upload and Monitor”就能看到串口打印了。
我个人习惯是:调试器一定要配好再写代码。哪怕只是点个灯,也要用调试器跑一遍,确认环境通不通。
2.3 LVGL源码获取与工程模板创建
环境搭好了,接下来就是请LVGL这位主角登场。
2.3.1 获取LVGL源码
LVGL的源码托管在GitHub上,获取方式有两种:
- 方式一:直接下载ZIP包 —— 去GitHub搜“lvgl”,点“Code” -> “Download ZIP”。简单粗暴,适合一次性使用。
- 方式二:用Git克隆 —— 在终端里执行
git clone https://github.com/lvgl/lvgl.git。这种方式方便后续更新,我推荐用这个。
下载下来后,你会看到一堆文件夹。核心的就两个:
src/—— LVGL的源码,所有核心功能都在这里examples/—— 官方示例,新手必看
2.3.2 创建工程模板
这一步很关键。一个好的模板,能让你后续开发省一半的力气。
我以STM32为例,给你看看我的模板结构:
my_lvgl_project/
├── Core/ # 用户代码(main.c, 中断等)
│ ├── Inc/
│ └── Src/
├── Drivers/ # 硬件驱动(HAL库)
├── lvgl/ # LVGL源码(不要动这里)
│ ├── src/
│ └── lv_conf.h # LVGL配置文件(这个要改)
├── lv_port/ # 移植层代码(显示、触摸、文件系统)
│ ├── lv_port_disp.c
│ ├── lv_port_disp.h
│ ├── lv_port_indev.c
│ └── lv_port_indev.h
└── .cproject # IDE工程文件
看到没?我把LVGL源码和移植层代码分开了。这样做的目的是:LVGL升级时,我只替换lvgl目录,移植层代码完全不用动。
创建模板的具体步骤:
- 在CubeIDE里新建一个STM32工程,配置好时钟、GPIO、FMC(或SPI)
- 把下载好的lvgl文件夹复制到工程根目录
- 在工程设置里,把lvgl/src下的所有.c文件添加进来
- 复制一份
lvgl/lv_conf_template.h到工程目录,重命名为lv_conf.h - 打开
lv_conf.h,把第一行的#if 0改成#if 1,启用配置
对于ESP32,流程类似,但用的是PlatformIO的库管理功能。你可以在 platformio.ini 里直接添加依赖:
[env:esp32-s3-devkitc-1]
platform = espressif32
board = esp32-s3-devkitc-1
framework = arduino
lib_deps =
lvgl/lvgl@^8.3.0
这样PlatformIO会自动帮你下载LVGL,省去了手动复制的麻烦。
2.4 验证环境:跑一个Hello World
环境搭好了,模板也建了,怎么知道一切正常?跑一个最简单的例子呗。
在 main.c 里,加上这几行:
#include "lvgl.h"
#include "lv_port_disp.h"
#include "lv_port_indev.h"
int main(void)
{
// 硬件初始化(HAL_Init, SystemClock_Config等)
HAL_Init();
SystemClock_Config();
// LVGL初始化
lv_init();
lv_port_disp_init(); // 显示驱动初始化
lv_port_indev_init(); // 触摸驱动初始化(如果有)
// 创建一个简单的标签
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);
// 主循环
while(1)
{
lv_timer_handler(); // LVGL心跳
HAL_Delay(5);
}
}
编译、下载。如果屏幕上出现了“Hello LVGL!”,恭喜你,环境搭建成功了!
如果没显示,别急。先检查硬件连接(屏幕排线松了?背光没开?),再检查配置(lv_conf.h里的颜色深度对不对?分辨率设对了没?)。
我记得第一次移植LVGL到STM32F429时,屏幕死活不亮。查了两天,最后发现是FMC的时序参数配错了。从那以后,我每次都会先拿逻辑分析仪抓一下波形,确认时序没问题再往下走。
好了,环境搭建就到这里。下一章,咱们开始真正玩转LVGL的显示驱动。