2、开发环境搭建:硬件平台选择、工具链安装、模拟器配置
好,咱们正式开始动手了。
做嵌入式GUI,尤其是手表这种资源受限的设备,环境搭建是第一道坎。我见过不少新手,一上来就急着写代码,结果编译不过、烧录失败、模拟器跑不起来……折腾半天,热情全没了。所以这一章,咱们把地基打牢。
2.1 硬件平台怎么选?STM32 还是 ESP32?
这个问题,我几乎每次培训都会被问到。说白了,没有绝对的「最好」,只有「最合适」。
我个人习惯把这两个平台分开看:
- STM32:老牌劲旅,生态成熟。如果你追求极致功耗、实时性要求高,或者需要跑复杂的RTOS,STM32是稳妥之选。我在项目中用过STM32L4系列做手表,待机电流能压到微安级。
- ESP32:自带Wi-Fi和蓝牙,性价比极高。如果你的手表需要联网、OTA升级、或者跟手机频繁通信,ESP32能省下一颗额外的无线芯片。不过要注意,它的功耗比STM32高一些,做手表需要精心优化休眠策略。
我的建议:
- 新手入门,优先选 ESP32。原因很简单:开发资料多、Arduino生态支持好、串口打印方便调试。等你把GUI逻辑跑通了,再移植到STM32做低功耗优化。
- 如果目标是量产低功耗产品,直接上 STM32U5 或 STM32L4 系列。
嗯,这里有个坑。我曾经有个学员,选了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优化。
安装步骤:
- 下载 ESP-IDF 工具安装器(Windows下是exe,Mac/Linux用脚本)。
- 运行安装,它会自动下载Python、交叉编译器、OpenOCD等。
- 设置环境变量。安装器一般会自动配好,但如果你用命令行找不到idf.py,手动执行一下
export.ps1(Windows)或export.sh(Linux/Mac)。
小技巧:安装路径不要带中文和空格。我曾经因为路径里有「Program Files (x86)」导致编译报错,排查了半天……
2.2.2 针对 STM32
STM32的工具链稍微复杂一点,但也很成熟。我一般用这套组合:
- STM32CubeMX:图形化配置时钟、外设、引脚。生成初始化代码。
- ARM GCC (gcc-arm-none-eabi):免费编译器。
- OpenOCD 或 ST-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上都能跑。
配置步骤:
- 从GitHub克隆
lv_port_pc_eclipse仓库。 - 安装SDL2库(Windows下下载SDL2-devel,Linux下
sudo apt install libsdl2-dev)。 - 用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的架构。到时候我会分享一个我自己用过的、经过量产验证的框架设计思路。