clion 本身不直接烧录,需依赖 openocd 或 j-link 等外部工具链配合 cmake 生成的 .elf/.bin 文件完成;关键在于正确配置 interface 与 target 的 .cfg 文件、指定准确的可执行路径,并确保芯片调试功能启用且未写保护。

Clion 本身不直接烧录,靠外部工具链(OpenOCD 或 JLinkGDBServer)+ CMake 构建产物(.elf / .bin)配合完成烧录。关键不是“点哪个按钮”,而是让 Clion 正确调用调试服务器并传入正确的镜像和配置。
OpenOCD 烧录必须配对 interface + target 配置文件
OpenOCD 不知道你用的是 ST-Link 还是 J-Link,也不知道芯片是 F1 还是 H7,全靠两个 .cfg 文件指定:
-
interface/stlink.cfg(或jlink.cfg、cmsis-dap.cfg)决定怎么连调试器 -
target/stm32f1x.cfg(或stm32h7x.cfg、stm32g4x.cfg)决定怎么操作芯片内部 ROM/FLASH
常见错误:只写 source [find interface/stlink.cfg],漏掉 target/xxx.cfg,结果 OpenOCD 启动成功但报 Target not examined;或者用了 stm32f4x.cfg 却烧 F1 芯片,导致 flash 擦除失败。
正确做法:在项目根目录建 openocd_stlink.cfg,内容如下(以 STM32F103 为例):
source [find interface/stlink.cfg] transport select hla_swd source [find target/stm32f1x.cfg] adapter speed 1000
Run/Debug Configuration 必须指向生成的 .elf 文件
Clion 的 “OpenOCD Download and Run” 模板默认找 cmake-build-debug/your_project.elf,但 CubeMX 生成的 CMakeLists 默认不输出 .elf 到该路径,也不一定叫 your_project.elf。
检查方式:ls build/*.elf(Linux/macOS)或 dir build\*.elf(Windows),确认实际路径和文件名。
实操建议:
- 在
CMakeLists.txt末尾加set(CMAKE_EXECUTABLE_SUFFIX ".elf"),避免生成.out或其他后缀 - 在 Run Configuration 的 “Executable” 栏填绝对路径,例如:
$ProjectFileDir$/build/STM32F103C8T6_Blink.elf - 不要依赖自动发现——Clion 不会递归扫描
build/下所有.elf
JLink 烧录要绕过 Clion 内置模板,手动写 External Tool
Clion 官方插件对 JLink 支持弱,没有现成的 “JLink Download” 模板。硬套 OpenOCD 模板会失败,因为 JLinkGDBServer 不读 .cfg,也不认 transport select 这类指令。
推荐做法:用 External Tool 调 JLinkExe 直接烧录 .hex 或 .bin:
- Program:
C:/Program Files/SEGGER/JLink/JLinkExe.exe(Windows)或/Applications/SEGGER/JLink/JLinkExe(macOS) - Arguments:
-device STM32F103C8 -if SWD -speed 4000 -autoconnect 1 -CommanderScript "$ProjectFileDir$/jlink_flash.jlink" - Working directory:
$ProjectFileDir$
其中 jlink_flash.jlink 是脚本文件,内容为:
loadfile build/STM32F103C8T6_Blink.hex r g q
注意:-device 参数必须与芯片型号严格匹配(查 JLink 支持列表),错写成 STM32F103CB 会导致连接后无法 halt。
烧录前必须确保芯片未被写保护 & Debug 已启用
这是最隐蔽也最高频的失败原因:CubeMX 里没勾选 Debug → Serial Wire,或者 Flash 选项字节(Option Bytes)被设为 RDP Level 2(永久锁死)。
现象:OpenOCD 报 Unable to halt processor,JLinkExe 报 Could not connect to target,但调试器灯常亮、USB 连接正常。
解决路径:
- 先用 STM32CubeProgrammer 连一次,看能否识别芯片;不能则需用
NRST引脚复位+擦除(按住复位键→点 Connect→Release→Erase) - 在 CubeMX 的
System Core → SYS → Debug中务必勾选Serial Wire(不是 “No debug”) - 生成代码后,检查
Core/Src/syscalls.c是否存在(某些旧模板会删它),缺失会导致printf卡死,误判为烧录失败
真正卡住的地方往往不在 Clion 设置里,而在芯片本身的可访问性上——别急着改 IDE 配置,先拿 STM32CubeProgrammer 过一遍基础连通性。











