2、开发环境搭建:硬件平台选择、工具链安装、模拟器配置

好,咱们正式开始动手了。

做嵌入式GUI,尤其是手表这种资源受限的设备,环境搭建是第一道坎。我见过不少新手,一上来就急着写代码,结果编译不过、烧录失败、模拟器跑不起来……折腾半天,热情全没了。所以这一章,咱们把地基打牢。

2.1 硬件平台怎么选?STM32 还是 ESP32?

这个问题,我几乎每次培训都会被问到。说白了,没有绝对的「最好」,只有「最合适」。

我个人习惯把这两个平台分开看:

  • STM32:老牌劲旅,生态成熟。如果你追求极致功耗、实时性要求高,或者需要跑复杂的RTOS,STM32是稳妥之选。我在项目中用过STM32L4系列做手表,待机电流能压到微安级。
  • ESP32:自带Wi-Fi和蓝牙,性价比极高。如果你的手表需要联网、OTA升级、或者跟手机频繁通信,ESP32能省下一颗额外的无线芯片。不过要注意,它的功耗比STM32高一些,做手表需要精心优化休眠策略。

我的建议:

  • 新手入门,优先选 ESP32。原因很简单:开发资料多、Arduino生态支持好、串口打印方便调试。等你把GUI逻辑跑通了,再移植到STM32做低功耗优化。
  • 如果目标是量产低功耗产品,直接上 STM32U5STM32L4 系列。

嗯,这里有个坑。我曾经有个学员,选了STM32F103C8T6(就是那个著名的「蓝 pills」),结果跑一个320x240的LVGL界面,帧率只有十几帧。为什么?因为F103的SRAM只有20KB,显存都不够用。所以选型时,务必关注两点:RAM大小Flash大小。做GUI,RAM至少64KB起步,推荐128KB以上。

2.2 工具链安装:别怕,一步步来

工具链这东西,说白了就是「编译器 + 调试器 + 烧录工具」。不同平台略有差异,但核心思路一样。

2.2.1 针对 ESP32

我个人最推荐用 ESP-IDF(乐鑫官方框架)。虽然VSCode + PlatformIO也很流行,但IDF的底层控制力更强,适合做GUI优化。

安装步骤:

  1. 下载 ESP-IDF 工具安装器(Windows下是exe,Mac/Linux用脚本)。
  2. 运行安装,它会自动下载Python、交叉编译器、OpenOCD等。
  3. 设置环境变量。安装器一般会自动配好,但如果你用命令行找不到idf.py,手动执行一下 export.ps1(Windows)或 export.sh(Linux/Mac)。

小技巧:安装路径不要带中文和空格。我曾经因为路径里有「Program Files (x86)」导致编译报错,排查了半天……

2.2.2 针对 STM32

STM32的工具链稍微复杂一点,但也很成熟。我一般用这套组合:

  • STM32CubeMX:图形化配置时钟、外设、引脚。生成初始化代码。
  • ARM GCC (gcc-arm-none-eabi):免费编译器。
  • OpenOCDST-Link Utility:烧录和调试。
  • VSCode + Cortex-Debug 插件:写代码和单步调试。

安装顺序建议:先装CubeMX,再装GCC编译器,最后配OpenOCD。为什么?因为CubeMX生成的Makefile工程,默认就支持GCC,省得你手动写链接脚本。

注意:STM32的GCC编译器版本不要追新。我目前用 10.3-2021.10 这个版本,稳定,没出过幺蛾子。太新的版本有时会对某些外设库产生奇怪的优化问题。

2.3 模拟器配置:没开发板也能跑GUI

你想想看,如果每次调试GUI都要烧录到手表上,那效率得多低?所以模拟器是必备的。

我常用的方案有两个:

2.3.1 LVGL 官方模拟器(基于SDL2)

这是最轻量的方式。LVGL官方提供了PC模拟器,在Windows/Linux/Mac上都能跑。

配置步骤:

  1. 从GitHub克隆 lv_port_pc_eclipse 仓库。
  2. 安装SDL2库(Windows下下载SDL2-devel,Linux下 sudo apt install libsdl2-dev)。
  3. 用CMake生成工程,编译运行。

跑起来后,你会看到一个窗口,里面就是你的手表界面。鼠标可以模拟触摸,键盘可以模拟按键。嗯,这里要注意:模拟器的触摸事件和真实硬件有差异,比如多点触控、滑动惯性等,但做UI布局和逻辑验证完全够用。

我的经验:模拟器里调好UI布局后,再烧到硬件上,基本只需要微调触摸校准和背光亮度。这比直接在硬件上盲调快太多了。

2.3.2 使用 QEMU 模拟 STM32

如果你用的是STM32,又不想买开发板,可以用QEMU模拟。不过说实话,QEMU对STM32的支持有限,很多外设(比如DMA、硬件定时器)模拟不完整。我一般只用它来验证RTOS任务调度和GUI框架的初始化流程。

配置方法:

  • 下载 xPack QEMU Arm 版本。
  • 用CubeMX生成工程时,选择「STM32F429-Discovery」模板(QEMU支持这个板子)。
  • 编译后,用QEMU加载elf文件。

避坑指南:我曾经用QEMU模拟STM32F746的LTDC(液晶控制器),结果画面死活不刷新。后来才发现QEMU的LTDC模拟有bug,只支持特定分辨率。所以,如果你要做图形显示,还是老老实实用LVGL的PC模拟器吧。

2.4 验证环境:跑一个「Hello World」

环境搭好了,怎么知道对不对?写个最简单的程序验证一下。

以ESP32 + LVGL为例,核心代码就这几行:

#include <lvgl.h>
#include <esp_lcd_panel_io.h>
#include <esp_lcd_panel_vendor.h>

void app_main(void) {
    lv_init();
    
    // 初始化显示驱动(这里省略具体引脚配置)
    lv_disp_drv_t disp_drv;
    lv_disp_drv_init(&disp_drv);
    disp_drv.flush_cb = my_display_flush;
    lv_disp_drv_register(&disp_drv);
    
    // 创建一个标签
    lv_obj_t *label = lv_label_create(lv_scr_act());
    lv_label_set_text(label, "Hello, Watch GUI!");
    lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);
    
    while(1) {
        lv_timer_handler();
        vTaskDelay(pdMS_TO_TICKS(5));
    }
}

编译烧录后,如果屏幕上出现「Hello, Watch GUI!」,恭喜你,环境搭建成功了。

小提示:第一次烧录时,记得按住开发板的BOOT按钮(ESP32是GPIO0拉低),否则可能进不了下载模式。我刚开始用ESP32时,每次烧录都要按,后来才知道可以设置自动复位电路……嗯,这都是学费。

2.5 本章小结

说白了,环境搭建就是三件事:选对硬件、装好工具链、配好模拟器。别追求一步到位,先让一个小程序跑起来,再慢慢加功能。

下一章,咱们开始真正设计手表GUI的架构。到时候我会分享一个我自己用过的、经过量产验证的框架设计思路。