跳转到正文
Your Zestful Notions

macOS 配置 STM32 开发环境:STM32CubeMX + VS Code

记录在 macOS 上使用 STM32CubeMX 生成 CMake 工程,再通过 VS Code 和 STM32CubeIDE 扩展完成代码编写、编译、烧录与断点调试的完整流程。

嵌入式系统,开发实践4分钟阅读

在 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 官方页面,下载 macOS 安装包,按照安装器提示完成安装。Apple Silicon Mac 和 Intel Mac 下载时需要关注安装包标注的架构;首次打开 macOS 的安全提示时,在“系统设置”中允许运行来自 STMicroelectronics 的应用。

安装完成后,可以从 Launchpad 或“应用程序”文件夹打开 STM32CubeMX。macOS 下通常通过应用程序入口启动,终端命令路径由具体安装版本决定。

CubeMX 本体提供配置和代码生成能力,具体芯片系列的 HAL、LL、CMSIS 和部分中间件需要通过固件包安装。打开 CubeMX 后执行:

  1. 进入 Help → Manage embedded software packages。
  2. 在列表中找到目标芯片对应的 STM32Cube MCU Package,例如 STM32F1、STM32F4、STM32G4 或 STM32H7。
  3. 选择需要的版本并点击安装。
  4. 等待下载和解压完成,在包管理窗口确认状态为已安装。

固件包的版本需要和目标芯片系列匹配。项目创建后,CubeMX 会从本机的 STM32Cube 固件仓库读取 HAL、LL 和 CMSIS 文件,并把需要的文件加入生成工程。

在 CubeMX 中选择 File → New Project,再按照目标板的实际情况选择 MCU 或 Board:

  1. 搜索芯片型号或开发板型号。
  2. 点击 Start Project。
  3. 在 Pinout & Configuration 中配置 GPIO、时钟、串口、定时器、ADC 等外设。
  4. 在 Clock Configuration 中检查系统时钟和外设时钟。
  5. 进入 Project Manager,填写项目名称和保存位置。
  6. 将 Toolchain / IDE 设置为 CMake。
  7. 在代码生成设置中启用保留用户代码区域的选项。
  8. 点击 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 预设和调试目标。

如果扩展没有自动识别项目:

  1. 点击左侧 Activity Bar 中的 STM32CubeIDE 图标。
  2. 选择 Discover STM32Cube project。
  3. 选择芯片或开发板、工具链以及要构建的项目。
  4. 点击 Save and close。

完成发现后,在 CMake 视图中选择 Debug 配置预设,并执行 Configure。扩展会把工程描述转换为当前预设对应的构建文件。

插件会识别 C、C++、汇编和 STM32 工程文件,并结合 clangd、头文件路径和编译参数提供:

  • C/C++/汇编语法高亮;
  • 函数、宏、类型和结构体成员补全;
  • 跳转到定义、查找引用和调用层级;
  • 悬停查看类型与函数声明;
  • 编译错误和类型错误提示。

代码补全依赖成功的 CMake Configure。首次打开工程时,先选择配置预设并等待配置完成,再观察 main.c 中的 HAL 函数、GPIO 宏和设备类型是否出现补全提示。

开发阶段选择 Debug 配置,编译器会保留调试信息,断点、调用栈、寄存器和变量查看更完整。发布固件时选择 Release 配置,并在烧录前确认当前选择的构建预设。

在 CMake 视图或 STM32CubeIDE 视图中完成以下操作:

  1. 选择 Debug 配置预设。
  2. 执行 Configure。
  3. 选择目标并执行 Build。
  4. 在输出面板查看 arm-none-eabi-gcc、链接过程和生成文件。

成功构建后,工程的构建目录中通常会出现 .elf 文件,也可能根据项目设置生成 .hex 或 .bin 文件。.elf 包含调试符号,适合断点调试;.hex 和 .bin 适合独立烧录工具使用。

可以在终端检查常用工具版本:

Terminal window
cmake --version
ninja --version
arm-none-eabi-gcc --version
arm-none-eabi-gdb --version

Bundle 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,再检查编译命令。

按照开发板说明连接:

  1. 使用 USB 数据线将 ST-LINK 接口连接到 Mac。
  2. 确认目标板已经获得稳定供电。
  3. 目标板使用外置 ST-LINK 时,将 SWDIO、SWCLK、GND 和目标电压按照板卡手册连接。
  4. 在 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 初始化。

依次执行:

  1. 在 VS Code 中选择 Debug 预设并 Configure。
  2. 执行 Build,确认生成 .elf 文件。
  3. 连接 ST-LINK,在 STM32CubeIDE 视图中选择 Run。
  4. 在 HAL_GPIO_TogglePin 行设置断点并按 F5。
  5. 观察 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 接线需要分别检查。先确认探针能被识别,再进行擦除或修改选项字节等操作。

完成这套配置后,日常开发可以固定为“CubeMX 修改硬件配置 → 重新生成 → VS Code 编写应用代码 → CMake 构建 → ST-LINK 下载 → 断点调试”的循环。首次验证建议使用 LED 闪烁工程,再逐步加入串口、定时器、ADC、DMA 和 RTOS 等功能。

© yznn007. 保留所有权利。