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屏,从画板子到出样机,一周就搞定了。

我的建议: 如果你是初学者,或者只是想快速体验LVGL,先选ESP32。成本低、资料多、踩坑少。等玩熟了,再上STM32做产品级开发。

2.2 软件工具链安装:IDE、编译器、调试器

硬件选好了,接下来就是装软件。这部分我尽量说得细一点,因为每一步都可能出幺蛾子。

2.2.1 针对STM32的开发环境

我目前最常用的组合是:STM32CubeIDE + ST-Link调试器。为什么?因为CubeIDE集成了CubeMX的图形化配置功能,生成初始化代码非常方便。

安装步骤其实很简单:

  1. 去ST官网下载STM32CubeIDE(建议选最新稳定版)
  2. 双击安装,一路默认就行
  3. 安装过程中会自动下载GCC编译器,不用额外操心
  4. 插上ST-Link,驱动一般会自动装好

嗯,这里要注意一个坑:路径不要有中文。我曾经因为用户名是中文,导致CubeIDE死活编译不过,折腾了一下午才发现是路径问题。

避坑指南: 安装路径、工程路径、源码路径,全部用英文。包括你的Windows用户名,最好也是英文的。别问我怎么知道的……

2.2.2 针对ESP32的开发环境

ESP32这边,我推荐用VS Code + PlatformIO插件。当然,你也可以用乐鑫官方的ESP-IDF,但PlatformIO对新手更友好。

安装流程:

  1. 先装VS Code,这个不用多说了
  2. 在扩展商店里搜“PlatformIO IDE”,安装
  3. 安装完成后,重启VS Code
  4. 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/ —— 官方示例,新手必看
重要提醒: 不要直接修改lvgl源码目录里的文件!正确的做法是:把lvgl作为一个子模块或者库,放在你的工程目录下。这样以后升级LVGL版本时,不会影响你的业务代码。

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目录,移植层代码完全不用动

创建模板的具体步骤:

  1. 在CubeIDE里新建一个STM32工程,配置好时钟、GPIO、FMC(或SPI)
  2. 把下载好的lvgl文件夹复制到工程根目录
  3. 在工程设置里,把lvgl/src下的所有.c文件添加进来
  4. 复制一份 lvgl/lv_conf_template.h 到工程目录,重命名为 lv_conf.h
  5. 打开 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,省去了手动复制的麻烦。

小技巧: 第一次编译LVGL时,时间会比较长(尤其是STM32,GCC编译C++代码本来就慢)。别慌,这是正常的。第二次编译时,只有改动的文件会重新编译,速度会快很多。

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的显示驱动。