1. 为什么在 macOS 上折腾 STM32 开发环境
如果你手里是一台 Mac,又想玩 STM32,第一反应大概率是「装个 Keil 或者 STM32CubeIDE 不就完了」。但真装过就知道,STM32CubeIDE 在 macOS 上启动慢、吃内存,而且它把编辑器和工具链绑死,你想换个顺手的编辑器都难。我自己的做法是把三件事拆开:STM32CubeMX 负责图形化生成初始化代码,STM32CubeCLT 提供命令行工具链(编译器、调试器、烧录器),VS Code 负责写代码和跑任务。这样每一层都能单独替换,环境也更干净。
这套组合的核心检索词就是macOS 上 STM32CubeMX + STM32CubeCLT + VS Code 搭建嵌入式开发环境。它能做什么?简单说,你在 CubeMX 里点几下配置好时钟和引脚,生成工程;然后在 VS Code 里按一个快捷键,就能编译、烧录、进调试。适合谁?适合已经会一点 C 语言、想摆脱笨重 IDE 的嵌入式初学者,也适合从 Windows 迁到 Mac 的老玩家。
另外这篇文章还会多做一件事:把 VS Code 里跟 AI 相关的 API endpoint 统一改到 TaoToken,用一个 Key 管理多个模型的调用。这样你写代码时用的 AI 补全、代码解释,和嵌入式工具链本身互不干扰,但配置集中在一处,换机器时复制一份 settings.json 就行。下面从零开始,每一步都给可复制的命令和配置。
2. 前置准备:安装 STM32CubeMX、STM32CubeCLT 与 VS Code 插件
这一节把三个基础软件装好。顺序建议是先装 STM32CubeCLT,再装 STM32CubeMX,最后配 VS Code。原因是 CubeMX 生成工程后需要调用 CLT 里的工具链,先装 CLT 能少一次路径排查。
STM32CubeCLT 是 ST 官方出的命令行工具链合集,里面包含 arm-none-eabi-gcc、CMake、Ninja、OpenOCD、ST-LINK GDB Server 等。以前这些东西要一个个去 GitHub 找,现在一个安装包搞定。去 ST 官网搜 STM32CubeCLT,下载 macOS 版本(.dmg),双击安装。默认路径是/Applications/STM32CubeCLT_1.x.x/,记住这个路径,后面 tasks.json 要用。
STM32CubeMX 是图形化配置工具,同样在 ST 官网下载 macOS 版。它依赖 Java 运行环境,新版安装包一般自带,如果启动报 Java 相关错误,去装一个 Temurin JDK 17 即可。安装完打开,第一次会让你选芯片型号,先随便选一个 STM32F103C8T6(蓝板常用),后面演示点灯就用它。
VS Code 本身不用多说,重点是插件。打开扩展面板,搜索并安装STM32 VS Code Extension,这是 ST 官方维护的插件,装完它会自动检测 STM32CubeCLT 的路径。如果没检测到,在插件设置里手动填/Applications/STM32CubeCLT_1.x.x。另外建议装 C/C++ 扩展(微软官方)和 CMake Tools,前者提供代码跳转和补全,后者方便你直接跑 CMake 工程。
装完后验证一下工具链是否可用。打开终端,执行:
export PATH="/Applications/STM32CubeCLT_1.16.0/GNU-tools-for-STM32/bin:$PATH" arm-none-eabi-gcc --version如果输出了 gcc 版本号,说明工具链就绪。注意版本号1.16.0要换成你实际安装的版本。为了避免每次开终端都手动 export,可以把这行加到~/.zshrc里。
这一步做完,你已经有了一套完整的命令行编译能力。接下来用 CubeMX 生成一个能编译的工程。
3. 可复制配置:CubeMX 生成工程 + VS Code 的 settings.json 与 tasks.json
先在 STM32CubeMX 里新建工程。选芯片 STM32F103C8T6,进入引脚配置界面。把 PC13 设为 GPIO_Output,这是蓝板上自带的 LED 引脚。然后在 Clock Configuration 里,把 HCLK 设成 72MHz(F103 的常见主频)。接着切到 Project Manager 标签,重点改三个地方:Project Name 填blink_test,Project Location 选一个你放代码的目录,Toolchain/IDE 选CMake。选 CMake 是关键,因为 STM32CubeCLT 用的是 CMake + Ninja 构建,选 Makefile 也能用,但 CMake 更顺。
点 Generate Code,CubeMX 会生成一整套工程,包括Core/、Drivers/、CMakeLists.txt、cmake/等目录。用 VS Code 打开这个工程目录。
现在配置 VS Code。在工程根目录建.vscode文件夹,里面放两个文件。第一个是settings.json,用来告诉 C/C++ 插件头文件在哪,同时把 AI 相关的 API endpoint 统一到 TaoToken:
{ "C_Cpp.default.includePath": [ "${workspaceFolder}/Core/Inc", "${workspaceFolder}/Drivers/STM32F1xx_HAL_Driver/Inc", "${workspaceFolder}/Drivers/STM32F1xx_HAL_Driver/Inc/Legacy", "${workspaceFolder}/Drivers/CMSIS/Device/ST/STM32F1xx/Include", "${workspaceFolder}/Drivers/CMSIS/Include" ], "C_Cpp.default.defines": [ "USE_HAL_DRIVER", "STM32F103xB" ], "cmake.generator": "Ninja", "cmake.buildDirectory": "${workspaceFolder}/build", "taotoken.endpoint": "https://taotoken.net/api", "taotoken.apiKey": "sk-你的TaoTokenKey" }这里taotoken.endpoint和taotoken.apiKey是给支持自定义 endpoint 的 AI 插件读的,不同插件字段名可能不同,但思路一致:Base URL 填https://taotoken.net/api,Key 填你在 TaoToken 控制台生成的。这样你所有 AI 辅助功能都走同一个 Key,不用每个插件单独配。
第二个文件是tasks.json,定义编译、烧录、调试三个任务:
{ "version": "2.0.0", "tasks": [ { "label": "build", "type": "shell", "command": "cmake", "args": ["--build", "${workspaceFolder}/build"], "options": { "env": { "PATH": "/Applications/STM32CubeCLT_1.16.0/GNU-tools-for-STM32/bin:/Applications/STM32CubeCLT_1.16.0/Ninja/bin:${env:PATH}" } }, "group": { "kind": "build", "isDefault": true }, "problemMatcher": ["$gcc"] }, { "label": "flash", "type": "shell", "command": "STM32_Programmer_CLI", "args": [ "-c", "port=SWD", "-w", "${workspaceFolder}/build/blink_test.elf", "-v", "-rst" ], "dependsOn": ["build"], "problemMatcher": [] } ] }注意blink_test.elf这个名字要跟你 CubeMX 里填的 Project Name 一致。STM32_Programmer_CLI在 CLT 的bin目录下,如果终端找不到,把它的绝对路径写进 command。
配置完这两个文件,按Cmd+Shift+B就能触发 build 任务。第一次构建前需要先跑一次 CMake 配置:
cd /你的工程路径/blink_test cmake -B build -G Ninja \ -DCMAKE_TOOLCHAIN_FILE=cmake/gcc-arm-none-eabi.cmake \ -DCMAKE_BUILD_TYPE=Debug这条命令生成 build 目录和 Ninja 构建文件。之后每次改代码,直接cmake --build build就行。
4. 验证请求:编译点灯工程并烧录到开发板
配置写完了,现在验证整条链路。先改一下Core/Src/main.c,在while (1)循环里加两行:
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); HAL_Delay(500);保存后按Cmd+Shift+B,终端会输出类似:
[build] [1/3] Building C object CMakeFiles/blink_test.dir/Core/Src/main.c.obj [build] [2/3] Linking C executable blink_test.elf [build] [3/3] Built target blink_test看到Built target就说明编译通过。如果报arm-none-eabi-gcc: command not found,检查 tasks.json 里的 PATH 是否指向你实际的 CLT 版本目录。
接下来烧录。把 ST-LINK 调试器插上,开发板供电。运行 flash 任务,或者手动执行:
STM32_Programmer_CLI -c port=SWD -w build/blink_test.elf -v -rst成功的话会看到:
Memory Programming ... Download verified successfully Software reset is performed板子上的 PC13 LED 应该开始以 1Hz 闪烁。到这一步,编译、烧录链路就通了。
再验证一下 TaoToken 的 Key 是否生效。如果你用的 AI 插件支持自定义 endpoint,在插件里发一条测试请求,比如让它解释HAL_GPIO_TogglePin的作用。请求会发到https://taotoken.net/api,带上你的 Key。返回正常就说明统一 Key 配置成功。这一步的意义在于:以后你换模型、换插件,只要改 settings.json 里的 endpoint 和 Key,不用每个工具重新登录。
调试部分,VS Code 里可以配 launch.json 走 OpenOCD 或 ST-LINK GDB Server。因为本文重点是环境搭建和编译烧录,调试配置留到下一篇展开。你先把编译和烧录跑通,这已经能覆盖大部分日常开发。
5. 本篇常见错排查:401、local proxy failed、reading choices 与 OAuth
环境搭建过程中最容易卡在几个报错上,这里逐个对照。
401 Unauthorized:这个通常出现在 AI 插件请求 TaoToken 时。原因一般是 Key 没填对,或者 Key 前面多了空格。检查 settings.json 里taotoken.apiKey的值,确保是sk-开头、没有换行。另外确认 endpoint 是https://taotoken.net/api,不要漏掉/api后缀。如果还报 401,去 TaoToken 控制台重新生成一个 Key 替换。
local proxy failed:这个报错说明插件尝试走本地代理但失败了。先检查系统代理设置,把无关的代理关掉。然后在插件配置里确认没有填http://127.0.0.1:xxxx这类本地地址。TaoToken 的 endpoint 是直连的 HTTPS 地址,不需要本地代理。如果插件默认开了代理选项,关掉它。
reading choices 相关报错:这通常出现在请求返回格式不符合预期时,比如插件期望 OpenAI 格式的choices数组,但返回了别的结构。检查你用的模型 ID 是否跟插件兼容。在 TaoToken 的模型对话页面可以先用同一个 Key 测一下模型是否正常返回。如果模型对话正常但插件报错,多半是插件版本旧了,升级插件。
OAuth 相关报错:有些 AI 插件默认走 OAuth 登录,而不是 API Key。如果你看到 OAuth 回调失败或者 token 过期,去插件设置里把认证方式从 OAuth 改成 API Key,填入 TaoToken 的 Key。这样就不依赖第三方登录流程了。
编译报错No such file or directory: cmake/gcc-arm-none-eabi.cmake:这是 CubeMX 生成工程时 Toolchain 没选 CMake,或者你手动删了 cmake 目录。重新用 CubeMX 生成一次,Toolchain 选 CMake。
烧录报错No ST-LINK detected:检查 USB 线是否支持数据传输(有些线只能充电),检查 ST-LINK 驱动,macOS 上一般免驱。如果用的是板载 ST-LINK,确认跳线帽位置正确。
排查思路就是:先确认工具链路径对不对,再确认 Key 和 endpoint 对不对,最后确认硬件连接。大部分问题出在前两步。
6. 统一 Key 之后:把 AI 辅助接入日常嵌入式开发
环境跑通后,你可以把 TaoToken 的 Key 用在更多地方。比如在 VS Code 里装一个支持自定义 endpoint 的 AI 编程插件,把 Base URL 填https://taotoken.net/api,Key 填同一个,Model ID 填你常用的模型。这样写代码时遇到不认识的 HAL 函数,直接选中问 AI,不用切浏览器。
如果你长期做嵌入式开发,建议了解一下 Coding Plan,它适合需要频繁调用模型做代码生成、解释、重构的场景。配置入口在 TaoToken 控制台的 API Keys 页面,生成 Key 后回到插件里填就行。接入文档里有不同插件的详细字段说明,遇到字段名对不上时查一下。
模型对话页面可以用来快速验证 Key 是否有效,也可以对比不同模型对同一段 C 代码的解释质量。我一般先用模型对话测通,再配到插件里,这样出问题能快速定位是 Key 的问题还是插件的问题。
最后提醒一点:settings.json 和 tasks.json 建议纳入版本管理,但 Key 不要提交到 Git。可以把 Key 放在环境变量里,settings.json 里引用${env:TAOTOKEN_API_KEY},这样换机器时只需设置一次环境变量。整套环境搭好后,你在一台新 Mac 上从零到点灯,大概 20 分钟就能搞定。