1、软件包准备,下载自己对应的版本
Clion :Clion下载地址
STM32CubeMX:STM32CubeMX下载地址

STM32Cube CLT:STM32Cube CLT下载地址

2、安装
2.1 安装Clion 默认安装就行
2.2安装STM32CubeMX默认安装就行
2.3安装STM32Cube CLT 默认安装就行
STM32Cube CLT解压出来有STM32Cube CLT和st-link,两个都安装
安装目录一般在/opt/ST/STM32Cube CLT+版本号

2.4安装openocd
可以直接通过homebrew安装
bash
brew install openocd
在终端输入which openocd查看命令可以查看安装位置
2.5安装ST-link
可以直接通过homebrew安装
bash
brew install stlink
#以下命令应该能检测到该stlink
st-info --probe
2.5安装ARM-GCC工具链
安装完STM32Cube CLT会自带,根据实际情况自行验证是否需要安装。
可以直接通过homebrew安装(需科学上网)
bash
brew tap ArmMbed/homebrew-formulae
brew install arm-none-eabi-gcc
#查看版本信息
arm-none-eabi-gcc -v
有信息则安装成功
3、软件环境配置
3.1 Clion配置
3.1.1 CLion 工具链配置
打开 CLion -> Settings (Cmd+,) -> Build, Execution, Deployment -> Toolchains,点击 + 添加一个 Custom 工具链,命名为 STM32CubeCLT,填入以下路径:
C Make:
/opt/ST/STM32CubeCLT_1.22.0/CMake/bin/cmake
Make:
/opt/ST/STM32CubeCLT_1.22.0/Make/bin/make (可不用配置,STM32 的 CMake 工程实际用的是 Ninja 构建,Make 字段可以直接留空。CLion 只需要 CMake + Ninja + 编译器就够了。留空不会影响任何编译和调试功能。)
Ninja:
/opt/ST/STM32CubeCLT_1.22.0/Ninja/bin/ninja
C Compiler:
/opt/ST/STM32CubeCLT_1.22.0/GNU-tools-for-STM32/bin/arm-none-eabi-gcc
C++ Compiler:
/opt/ST/STM32CubeCLT_1.22.0/GNU-tools-for-STM32/bin/arm-none-eabi-g++
Debugger:
/opt/ST/STM32CubeCLT_1.22.0/GNU-tools-for-STM32/bin/arm-none-eabi-gdb
如果 CubeCLT 没有自带 gdb,用 Homebrew 装一个:brew install arm-none-eabi-gdb,路径在 /opt/homebrew/bin/arm-none-eabi-gdb。
填完后所有项前面应该出现绿色勾号。同时去 Settings -> Plugins 确认 Embedded Development 和 STM32CubeMX 插件是启用状态(CLion 2026 默认内置)。
问题一:Debugger "Not found" + "deprecated"
arm-none-eabi-gdb 文件确实在 /opt/ST/STM32CubeCLT_1.22.0/GNU-tools-for-STM32/bin/ 下,版本 15.2.90,可以正常运行。报错原因是 CLion 2026 废弃了工具链级别的 Debugger 字段,改用新的 "Debug Profiles" 机制。
解决办法:直接忽略这个报错。 工具链里的 Debugger 字段在 CLion 2026 中已经不使用了。调试器会在后面配置 Embedded GDB Server 运行配置时单独指定,到那里填 gdb 路径即可正常工作。
如果你想消除红色提示,也可以在工具链里把 Debugger 字段留空,反正它已经不生效了。
问题二:"Test CMake run finished with errors"
这是 交叉编译工具链的正常现象,不是错误。CLion 检测工具链时会跑一个 CMake 测试编译,但 arm-none-eabi-gcc/g++ 是交叉编译器,编出来的是 ARM 架构的二进制,无法在 Mac 上直接运行,所以 CMake 的 try_run 步骤必然失败。
关键结论:这个报错可以安全忽略。 你实际的 STM32 工程构建不会受影响,因为 STM32CubeMX 生成的 CMakeLists.txt 会指定正确的交叉编译工具链文件(arm-none-eabi-gcc.cmake),编译目标也是 ARM elf,不需要在宿主机上运行。
验证方式很简单:直接用 CubeMX 生成一个工程导入 CLion,Cmd + F9 编译,如果能正常生成 .elf 文件就说明工具链完全没问题。
总结:两个提示都不影响实际使用。 工具链配好后,接下来走正常流程------CubeMX 生成 CMake 工程 -> CLion 打开 -> 编译 -> 配置 Embedded GDB Server 调试。你现在已经可以进入第二步,用 STM32CubeMX 创建工程了。
3.1.2打开软件 点击 new project 创建新项目
基础配置

1- 选择STM32CubeMX
2 - STM32CubeMX/STM32CubeCLT配置
根据实际情况填入安装路径

openocd配置

3-启动STM32CubeMX配置项目
3.2 STM32CubeMX配置
bash
大致步骤
打开 STM32CubeMX -> File -> New Project -> 搜索 STM32F103C8T6 -> Start Project
配置外设(在 Pinout 视图):
- SYS -> Debug -> 选 Serial Wire(SWD 调试,ST-Link 必须开这个)
- RCC -> High Speed Clock (HSE) -> 选 Crystal/Ceramic Resonator
- 点击 PA5 -> 选 GPIO_Output(板载 LED)
- USART1 -> Mode -> Asynchronous(串口调试用)
【在 STM32CubeMX 界面的左侧栏操作,具体步骤:
1. 确认你在 Pinout & Configuration 标签页(顶部第一个标签)
2. 左侧面板找到 Categories 分组
3. 展开找到 Connectivity 分类
4. 点击里面的 USART1
5. 在芯片图下方的配置区域,会看到 Mode 下拉框,默认是 Disable
6. 点开下拉框,选 Asynchronous
选完后右侧 PA9 会自动变成 USART1_TX,PA10 变成 USART1_RX,不需要手动点引脚。
如果左侧列表太长找不到,可以切到 A-Z 视图(左侧面板顶部有 Categories / A-Z 两个切换标签),按字母顺序更快定位到 USART1。
配置完波特率的话,在下面 Parameter Settings 子标签里,把 Baud Rate 改成 115200(默认通常就是 115200,确认一下即可)。】
时钟配置:进入 Clock Configuration 标签,HCLK 输入 72 回车,自动算好分频。
工程设置(关键):进入 Project Manager 标签:
- Toolchain / IDE 必须选 CMake(不是 STM32CubeIDE)
- 勾选 Generate peripheral initialization as a pair of '.c/.h' files
- 勾选 Keep User Code 区域
【勾选 Keep User Code 后,你在这些 BEGIN / END 标记之间写的所有代码,在重新生成工程时会被完整保留。CubeMX 只会更新标记外面的 HAL 初始化代码。
实际场景: 比如你写了一半的串口通信逻辑,突然想给 PA0 加个外部中断。回到 CubeMX 配好引脚,点 GENERATE CODE,重新生成后你的串口代码还在,只是多出来一个 EXTI 的初始化函数。如果不勾选,重新生成时标记之间的代码也会被清空。
核心原则: 你自己的业务代码永远写在 USER CODE BEGIN 和 USER CODE END 之间,不要写在标记外面,否则一律会被覆盖掉。】
点击 GENERATE CODE,完成后关闭,不要用 CubeMX 直接打开。
启动后点击ACCESS TO MCU SELECTOR或者ACCESS TO BOARD SELECTOR

选择芯片
1 选择自己的芯片
2 确定具体型号
3 可视化配置项目

Debuge模式调整
STM32系列芯片通常使用ST-link,设置一下Debuge模式

RCC时钟选择
根据自己需要设置

引脚始化配置(根据自己需求设置)

配置Project Manager
从上往下分别是项目名、保存路径、IDE类型


3.3 CLion 打开工程并编译
- CLion -> Open -> 选 CubeMX 生成的工程目录(含 CMakeLists.txt)
- 弹出工具链选择时选 STM32CubeCLT
- Cmd + F9 编译,第一次会慢一些(编译 HAL 库),后续增量编译很快
问题一:CLion 给交叉编译器传了 macOS 原生的 -arch arm64 参数
工程里有 CubeMX 生成的工具链文件 cmake/gcc-arm-none-eabi.cmake,它设置了 CMAKE_SYSTEM_NAME=Generic 来告诉 CMake 这是交叉编译。但 CLion 没有用它,而是直接传了 -DCMAKE_C_COMPILER=...,导致 CMake 以为是 macOS 原生编译,自动加了 -arch arm64 参数。
修复方法(二选一):
方法一:让 CLion 使用 CMake Presets(推荐)
CubeMX 已经生成了 CMakePresets.json,里面配好了工具链文件。让 CLion 直接用它: - Settings -> Build, Execution, Deployment -> CMake
- 点击顶部切换按钮,从 Profiles 模式切到 Presets 模式
- CLion 会自动读取 CMakePresets.json,显示 Debug 和 Release 两个预设
- 选 Debug 预设即可
这样 CLion 不会再自己传 -DCMAKE_C_COMPILER,而是完全使用 CubeMX 配好的工具链文件。
方法二:手动加 Toolchain File
如果找不到 Presets 切换按钮: - Settings -> Build, Execution, Deployment -> CMake
- 编辑你的 STM32CubeCLT profile
- 在 CMake options 字段里加一行:
-DCMAKE_TOOLCHAIN_FILE=/Users/替换工程地址/cmake/gcc-arm-none-eabi.cmake - 删掉旧的构建目录 cmake-build-debug-stm32cubeclt,让 CMake 干净地重新配置
改完后重新加载 CMake,编译命令里就不会再出现 -arch arm64 了。工具链文件里的 CMAKE_SYSTEM_NAME=Generic 和 CMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY 两行会同时解决"交叉编译器无法运行测试程序"的问题。
3.4 Clion 的 Embedded GDB Server设置

参考
第一步:打开配置界面
菜单栏 Run -> Edit Configurations...,弹出配置窗口。左上角点 +,在弹出的列表里找 Embedded GDB Server。如果列表里没有这个选项,说明 Embedded Development 插件没启用,去 Settings -> Plugins 里开启。
第二步:填写 Name
顶部 Name 字段填:
bash
Flash & Debug (OpenOCD)
第三步:Target(构建目标)
Target 下拉框点开,选择你的 CMake 构建目标。你的工程名叫 light,所以选 light 这个选项。选完后 Executable Binary 会自动指向 light.elf。
如果下拉列表为空,先确认 CLion 已经成功加载了 CMake(底部状态栏不报错)。CMake 配置成功后目标才会出现在列表里。
第四步:Debugger
Debugger 字段填完整路径(不要只写名字,CLion 2026 不一定自动从工具链找):
/opt/ST/STM32CubeCLT_1.22.0/GNU-tools-for-STM32/bin/arm-none-eabi-gdb
第五步:GDB Server
GDB Server type 下拉选 OpenOCD(选完之后下面的 GDB Server 路径字段会自动出现)。
在 GDB Server 可执行路径字段填:
bash
/opt/homebrew/bin/openocd
第六步:GDB Server arguments
在 GDB Server arguments 字段填:
bash
-f interface/stlink.cfg -f target/stm32f1x.cfg
这两个路径是相对于 OpenOCD 的 scripts 目录的,OpenOCD 会自动在 /opt/homebrew/share/openocd/scripts/ 下找到它们,不需要写全路径。
第七步:Target remote args
在 Target remote args 字段填:
bash
localhost:3333
这是 OpenOCD 启动后监听的 GDB 端口,CLion 通过这个地址连接调试器。
第八步:Before launch(调试前动作)
窗口底部 Before launch 区域:
- 点 + -> 选 Build,确保选中的 target 是 light。这样每次点 Debug 时会先编译最新的代码。
- 可选:再点 + -> 选 External Tool -> Create New,配置烧录步骤(如果希望调试前单独烧录固件):
bash
- Name: OpenOCD Flash
- Program: /opt/homebrew/bin/openocd
- Arguments: -f interface/stlink.cfg -f target/stm32f1x.cfg -c "program $CMakeCurrentBuildsDir$/light.elf verify reset exit"
- Working directory: $ProjectFileDir$
不过通常 Embedded GDB Server 模式下 CLion 会自动加载 elf 到芯片,这一步不是必须的。
第九步:保存并验证
- 右下角点 Apply 再点 OK
- 接好 ST-Link 和板子(SWD 四线 + 供电)
- 点工具栏绿色虫子图标启动调试
如果一切正常,CLion 会先编译,然后终端里看到 OpenOCD 输出类似:
bash
Info : Listening on port 3333 for gdb connections
随后 GDB 连接成功,程序停在 main() 入口处。
4 ST-Link 下载与调试配置
快速验证:LED 闪烁
在 main.c 的 while(1) 循环中加入:
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); (板子上 LED 在 PA5,不在这个引脚的需要根据板子情况进行修改,修改后STM32CubeMX引脚设置也要修改,并重新生成代码)
HAL_Delay(500);
编译烧录后,板载 LED 应每秒闪烁一次,说明全链路通了。