macOS 配置 STM32 开发环境:STM32CubeMX + VS Code
记录在 macOS 上使用 STM32CubeMX 生成 CMake 工程,再通过 VS Code 和 STM32CubeIDE 扩展完成代码编写、编译、烧录与断点调试的完整流程。
在 macOS 上配置 STM32 开发环境,可以把整条工作流拆成三个相互配合的部分:STM32CubeMX 负责选择芯片、配置引脚和外设、安装对应的固件包,并生成初始化代码;Visual Studio Code 加上 STM32CubeIDE for Visual Studio Code 扩展负责日常编辑、代码补全、编译和调试;ST-LINK负责让电脑与芯片之间建立 SWD 连接,完成下载和断点调试。
整体流程如下:
STM32CubeMX │ 配置芯片、外设和固件包 ▼.ioc + CMake 工程 + HAL/LL 初始化代码 │ ▼VS Code + STM32CubeIDE for Visual Studio Code │ 代码补全、CMake 构建、GDB 调试 ▼.elf / .hex / .bin │ ▼ST-LINK / SWD │ ▼STM32 开发板本文采用 CubeMX 生成 CMake 工程的路线,适用于 Apple Silicon 和 Intel Mac。界面名称会随着 CubeMX 与 VS Code 扩展版本更新,安装时以当前窗口显示的名称为准。
准备以下内容:
| 项目 | 用途 |
|---|---|
| macOS 64 位电脑 | 运行 CubeMX、VS Code 和 STM32 工具 |
| STM32 开发板或目标板 | 运行生成的固件 |
| ST-LINK 或开发板自带的 ST-LINK | 通过 SWD 下载程序、暂停 CPU、查看寄存器和变量 |
| USB 数据线 | 连接 Mac 与 ST-LINK;充电线可能缺少数据功能 |
| 网络连接和管理员权限 | 下载 CubeMX、固件包以及 VS Code 工具组件 |
STM32 的断点调试需要调试探针和目标板之间的 SWD 连接。USB-TTL 可以用于 UART 日志和串口通信,ST-LINK 用于 SWD 下载与调试,两者在开发环境中的职责不同。
官方入口:
- STM32CubeMX
- Visual Studio Code
- STM32CubeIDE for Visual Studio Code
- STM32CubeIDE for Visual Studio Code 在线文档
打开 STM32CubeMX 官方页面,下载 macOS 安装包,按照安装器提示完成安装。Apple Silicon Mac 和 Intel Mac 下载时需要关注安装包标注的架构;首次打开 macOS 的安全提示时,在“系统设置”中允许运行来自 STMicroelectronics 的应用。
安装完成后,可以从 Launchpad 或“应用程序”文件夹打开 STM32CubeMX。macOS 下通常通过应用程序入口启动,终端命令路径由具体安装版本决定。
CubeMX 本体提供配置和代码生成能力,具体芯片系列的 HAL、LL、CMSIS 和部分中间件需要通过固件包安装。打开 CubeMX 后执行:
- 进入 Help → Manage embedded software packages。
- 在列表中找到目标芯片对应的 STM32Cube MCU Package,例如 STM32F1、STM32F4、STM32G4 或 STM32H7。
- 选择需要的版本并点击安装。
- 等待下载和解压完成,在包管理窗口确认状态为已安装。
固件包的版本需要和目标芯片系列匹配。项目创建后,CubeMX 会从本机的 STM32Cube 固件仓库读取 HAL、LL 和 CMSIS 文件,并把需要的文件加入生成工程。
在 CubeMX 中选择 File → New Project,再按照目标板的实际情况选择 MCU 或 Board:
- 搜索芯片型号或开发板型号。
- 点击 Start Project。
- 在 Pinout & Configuration 中配置 GPIO、时钟、串口、定时器、ADC 等外设。
- 在 Clock Configuration 中检查系统时钟和外设时钟。
- 进入 Project Manager,填写项目名称和保存位置。
- 将 Toolchain / IDE 设置为 CMake。
- 在代码生成设置中启用保留用户代码区域的选项。
- 点击 Generate Code。
生成后的工程通常包含以下内容,具体目录名称会随芯片系列和 CubeMX 版本变化:
Blink/├── Blink.ioc├── CMakeLists.txt├── CMakePresets.json├── Core/│ ├── Inc/│ └── Src/├── Drivers/├── cmake/└── build/.ioc 保存 CubeMX 的配置,CMakeLists.txt 和 CMakePresets.json 描述构建方式,Core 通常包含应用入口和初始化文件,Drivers 保存 HAL、LL 和 CMSIS 相关内容。
CubeMX 生成的文件中带有 USER CODE BEGIN 和 USER CODE END 标记。应用代码应放在这些用户代码区域中,重新生成代码时可以继续保留。修改引脚、时钟或外设配置后,先保存 .ioc,再重新生成并检查用户代码区域。
从 Visual Studio Code 官网 下载 macOS 版本并完成安装。首次打开后,可以通过 Code → Check for Updates 保持编辑器处于较新的版本。
在 VS Code 中打开扩展面板,搜索 STM32,选择发布者为 STMicroelectronics 的 STM32CubeIDE for Visual Studio Code。这就是图片中的插件名称。
当前版本以扩展包形式组织功能,安装或首次启动时可能会同时提供以下组件:
| 组件 | 作用 |
|---|---|
| STM32Cube Core | STM32 项目发现、设备和工作区相关功能 |
| STM32Cube CMake Support | CMake 配置、预设和构建集成 |
| STM32Cube Debug STLink GDB Server | 通过 ST-LINK 启动 GDB 调试会话 |
| STM32Cube Build Analyzer | 查看构建结果和资源使用情况 |
| STM32Cube Bundles Manager | 管理编译器、CMake、Ninja 和调试工具等依赖 |
按照扩展的安装提示完成依赖组件和工具包安装。工具链通常由扩展的 Bundle Manager 管理;使用独立终端或 CI 时,可以另外安装 STM32CubeCLT,它提供 Arm GNU 工具链、GDB、STM32CubeProgrammer 和芯片描述文件。
在 VS Code 中选择 File → Open Folder,打开包含 .ioc、CMakeLists.txt 和 CMakePresets.json 的工程根目录。Core、Drivers 或 Src 都属于源码子目录,工程根目录才能让扩展同时发现 CubeMX 配置、CMake 预设和调试目标。
如果扩展没有自动识别项目:
- 点击左侧 Activity Bar 中的 STM32CubeIDE 图标。
- 选择 Discover STM32Cube project。
- 选择芯片或开发板、工具链以及要构建的项目。
- 点击 Save and close。
完成发现后,在 CMake 视图中选择 Debug 配置预设,并执行 Configure。扩展会把工程描述转换为当前预设对应的构建文件。
插件会识别 C、C++、汇编和 STM32 工程文件,并结合 clangd、头文件路径和编译参数提供:
- C/C++/汇编语法高亮;
- 函数、宏、类型和结构体成员补全;
- 跳转到定义、查找引用和调用层级;
- 悬停查看类型与函数声明;
- 编译错误和类型错误提示。
代码补全依赖成功的 CMake Configure。首次打开工程时,先选择配置预设并等待配置完成,再观察 main.c 中的 HAL 函数、GPIO 宏和设备类型是否出现补全提示。
开发阶段选择 Debug 配置,编译器会保留调试信息,断点、调用栈、寄存器和变量查看更完整。发布固件时选择 Release 配置,并在烧录前确认当前选择的构建预设。
在 CMake 视图或 STM32CubeIDE 视图中完成以下操作:
- 选择
Debug配置预设。 - 执行 Configure。
- 选择目标并执行 Build。
- 在输出面板查看
arm-none-eabi-gcc、链接过程和生成文件。
成功构建后,工程的构建目录中通常会出现 .elf 文件,也可能根据项目设置生成 .hex 或 .bin 文件。.elf 包含调试符号,适合断点调试;.hex 和 .bin 适合独立烧录工具使用。
可以在终端检查常用工具版本:
cmake --versionninja --versionarm-none-eabi-gcc --versionarm-none-eabi-gdb --versionBundle Manager 管理的工具可能由 VS Code 扩展使用独立路径。终端命令是否出现在当前 Shell 的 PATH 中,取决于工具安装方式;扩展输出面板、CMake 配置日志和工具包状态可以作为实际判断依据。
STM32 工程需要使用面向 Arm Cortex-M 的交叉编译器。配置完成后,可以在当前构建目录的 CMakeCache.txt 或 compile_commands.json 中搜索:
arm-none-eabi-gcc-mcpu=cortex--mthumb/usr/bin/cc、AppleClang 或 -arch arm64 表示 CMake 仍然选中了 macOS 主机编译器。此时在 Bundle Manager 中检查 Arm GNU 工具链,回到 CMake 视图选择正确的工具链和预设,清理当前 CMake 缓存后重新 Configure,再检查编译命令。
按照开发板说明连接:
- 使用 USB 数据线将 ST-LINK 接口连接到 Mac。
- 确认目标板已经获得稳定供电。
- 目标板使用外置 ST-LINK 时,将 SWDIO、SWCLK、GND 和目标电压按照板卡手册连接。
- 在 STM32CubeIDE 视图或 Board Manager 中检查 ST-LINK 是否被识别。
开发板自带的 ST-LINK 通常已经连接好 SWD 信号,外置探针需要额外确认接口方向和电压。上电前检查 GND、SWDIO、SWCLK 和 VCC 的对应关系,避免把信号线接到电源脚。
下载前先选择 Debug 或目标发布配置并完成构建,然后在 STM32CubeIDE 视图中选择 Run。扩展会启动对应的 ST-LINK GDB Server,将生成的固件写入目标芯片并运行程序。
STM32CubeProgrammer 也可以作为独立的下载和验证工具。它支持通过 ST-LINK/SWD、UART、USB DFU 等接口读取、擦除、写入和校验 STM32 存储器,适合在 VS Code 工作流之外确认探针和芯片连接状态。详见 STM32CubeProgrammer 官方页面。
在 main.c 或应用源文件的代码行号左侧点击,出现红色圆点后按 F5,或从 Run and Debug 面板启动调试:
F5:继续运行或启动调试;F10:单步跳过;F11:单步进入;Shift + F5:停止调试;- Variables:查看变量;
- Call Stack:查看调用栈;
- Registers / SFR:查看 CPU 寄存器和外设寄存器。
首次调试时,根据扩展提示选择 ST-LINK、SWD、目标芯片和调试配置。程序运行到断点后,编辑器会高亮当前语句,左侧面板可以同步查看局部变量、调用栈、寄存器和内存。
LED 闪烁可以一次验证 CubeMX 配置、HAL 代码、CMake 编译、ST-LINK 下载和断点调试。
在 Pinout 页面把板载 LED 对应的引脚设置为 GPIO_Output,并给它设置一个清晰的 User Label,例如 LED。不同开发板的 LED 引脚和宏名称不同,最终代码以 CubeMX 生成的 LED_GPIO_Port 和 LED_Pin 为准。
打开生成的 Core/Src/main.c,在 while 循环对应的用户代码区域写入:
/* USER CODE BEGIN 3 */while (1){ HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); HAL_Delay(500);}/* USER CODE END 3 */如果生成的宏名称为 LD2_GPIO_Port、LD2_Pin 或其他名称,按当前工程中的定义替换。HAL_Delay(500) 依赖已经配置好的 HAL 时间基准,CubeMX 默认会为常见工程生成 SysTick 初始化。
依次执行:
- 在 VS Code 中选择
Debug预设并 Configure。 - 执行 Build,确认生成
.elf文件。 - 连接 ST-LINK,在 STM32CubeIDE 视图中选择 Run。
- 在
HAL_GPIO_TogglePin行设置断点并按F5。 - 观察 LED 以约 500 毫秒的间隔翻转,单步执行时查看程序计数器和 GPIO 相关变量。
验证标准如下:
| 环节 | 成功表现 |
|---|---|
| CubeMX | .ioc 保存成功,工程包含目标 GPIO 初始化代码 |
| CMake | 输出中出现 arm-none-eabi-gcc,构建生成 .elf |
| ST-LINK | Run 或 Debug 能识别目标芯片并加载程序 |
| 运行时 | LED 按设定周期闪烁 |
| 调试 | 断点命中,F10/F11 可以控制程序执行 |
| 现象 | 检查方向 |
|---|---|
| STM32CubeIDE 视图中没有项目操作 | 打开包含 .ioc 和 CMakeLists.txt 的根目录,再执行 Discover STM32Cube project |
| C 代码有红色波浪线,补全为空 | 选择 CMake 预设并完成 Configure;检查 clangd、头文件路径和 compile_commands.json |
构建调用 /usr/bin/cc 或 AppleClang |
在 Bundle Manager 中选择 Arm GNU 工具链,清理 CMake 缓存后重新 Configure,并检查 CMakeCache.txt |
arm-none-eabi-gcc 找不到 |
安装并启用对应的工具包;同时查看扩展输出面板显示的实际工具路径 |
Unable to get core ID 或找不到目标芯片 |
检查 USB 数据线、目标板供电、ST-LINK 固件、SWDIO/SWCLK 接线、复位状态和目标芯片选择;再使用 CubeProgrammer 检查探针连接 |
| 重新生成后应用代码消失 | 将应用逻辑放入 USER CODE BEGIN/END 区域,并在重新生成前保存一次 Git 提交 |
| 断点灰色或始终无法命中 | 使用 Debug 构建,确认调试信息存在,检查当前下载的 .elf 与当前源码属于同一次构建 |
Unable to get core ID 属于目标连接链路问题,软件配置、USB 连接、目标供电和 SWD 接线需要分别检查。先确认探针能被识别,再进行擦除或修改选项字节等操作。
- STM32CubeMX 产品页:安装程序、固件包和用户手册。
- STM32CubeMX 用户手册:项目创建、软件包管理和代码生成说明。
- STM32CubeIDE for Visual Studio Code 安装指南:VS Code 扩展安装步骤。
- STM32CubeIDE for Visual Studio Code 在线文档:项目发现、CMake、构建和调试工作流。
- STM32CubeCLT:Arm GNU 工具链、GDB、CMake、Ninja 和 STM32CubeProgrammer 命令行工具。
- STM32CubeProgrammer:独立烧录、擦除、读取和校验工具。
完成这套配置后,日常开发可以固定为“CubeMX 修改硬件配置 → 重新生成 → VS Code 编写应用代码 → CMake 构建 → ST-LINK 下载 → 断点调试”的循环。首次验证建议使用 LED 闪烁工程,再逐步加入串口、定时器、ADC、DMA 和 RTOS 等功能。