摆脱商业 IDE:基于 probe-rs 的 STM32F103 烧录与调试全流程实践
前言
Keil、IAR 等商业 IDE 虽然提供了完整的下载与仿真功能,但其商业授权模式在开源项目、自动化构建以及教学场景中均存在限制。随着 RISC-V 及国产 MCU 生态的快速发展,芯片架构日益碎片化,传统的"一款芯片配一款 IDE"的模式已难以为继。掌握通用的底层工具链,构建不依赖商业 IDE 的开发环境,是嵌入式工程师应对架构变迁的核心能力。
本文基于 STM32F103C8T6 平台,详细记录如何利用 probe-rs 这一开源工具完成程序的烧录与调试,并将其无缝集成至 VS Code 中,最终实现从编译、烧录到调试的全链路去 IDE 化。
完整的视频链接:
【MCU probe-rs用法】 https://www.bilibili.com/vide...
一、probe-rs 安装与验证
probe-rs 是一个用 Rust 编写的跨平台嵌入式调试工具集,支持 DAP-Link、J-Link 等常见调试探针。
1. 安装
前往 probe-rs 官网,根据文档指引,在 PowerShell 中执行安装命令:
# 示例命令(请以官网最新文档为准)
irm https://github.com/probe-rs/probe-rs/releases/latest/download/probe-rs-tools-installer.ps1 | iex该脚本会自动完成工具下载并将路径添加至系统环境变量。
2. 验证
安装完成后,通过查看版本号确认环境配置成功:
probe-rs --version二、命令行烧录与基础操作
1. 探测连接
将 DAP-Link 连接至电脑和开发板,使用以下命令列出当前连接的调试探针:
probe-rs list若输出中显示 CMSIS-DAP 或 ST-Link 等设备信息,则说明硬件连接正常。
2. 程序烧录
确保工程已通过 CMake/Ninja/Clang 编译生成 .elf 文件后,执行烧录命令:
probe-rs run --chip STM32F103C8 target/firmware.elf烧录成功后,复位开发板,通过串口助手确认程序正常运行。
3. 芯片支持与配置
若不确定芯片名称,可通过 probe-rs chip list 查看支持列表。即使芯片未被官方明确支持,只要其内核架构(如 Cortex-M3)受支持,仍可通过自定义 probe-rs.yml 配置文件实现烧录(常见于 XIP 或新型号 MCU)。
4. 常用命令解析
- 时钟频率:使用
--speed参数指定 SWD 时钟频率。 内存读写:
probe-rs read和probe-rs write命令通过总线进行直读直写。- 注意:
write命令无法写入 Flash。Flash 编程属于块操作,需遵循特定的擦除与编程算法,必须通过专门的 Flash 下载通道(如run或download命令)进行。
- 注意:
- 版本迭代:
probe-rs更新频繁,建议通过probe-rs help随时查阅最新命令用法。
三、集成至 VS Code Tasks
为了在 VS Code 中实现一键烧录,需配置 tasks.json。
1. 配置 Task
在 .vscode/tasks.json 中添加如下任务:
{
"label": "Download",
"type": "shell",
"command": "probe-rs",
"args": [
"run",
"--chip", "STM32F103C8",
"${workspaceFolder}/build/firmware.elf"
],
"group": "build",
"presentation": {
"echo": true,
"reveal": "always",
"focus": false,
"panel": "shared"
}
}2. 执行
按下 Ctrl+Shift+P,输入 Run Task,选择 Download 即可完成烧录。
四、VS Code 仿真调试配置
probe-rs 本身不提供交互式界面,而是通过 dap-server 将 SWD/JTAG 操作转换为 DAP 协议,供 VS Code 内置的 DAP 客户端调用。
1. 环境准备
- 安装 VS Code 插件:probe-rs-debugger。
- 确保工程已包含调试信息(编译时添加
-g或-g3标志)。
2. 配置 launch.json
创建 .vscode/launch.json,基于 probe-rs 模板进行关键项配置:
{
"version": "0.2.0",
"configurations": [
{
"type": "probe-rs-debug",
"request": "launch",
"name": "Debug (Launch)",
"cwd": "${workspaceFolder}",
"connectUnderReset": false,
"speed": 1000,
"chip": "STM32F103C8",
"flashing": {
"enabled": true,
"verifyBeforeFlashing": true,
"verifyAfterFlashing": true
},
"haltAfterReset": true,
"coreConfigs": [
{
"programBinary": "${workspaceFolder}/build/firmware.elf",
"index": 0
}
],
"consoleLogLevel": "Info"
},
{
"type": "probe-rs-debug",
"request": "attach",
"name": "Debug (Attach)",
"cwd": "${workspaceFolder}",
"connectUnderReset": false,
"speed": 1000,
"chip": "STM32F103C8",
"coreConfigs": [
{
"programBinary": "${workspaceFolder}/build/firmware.elf",
"index": 0
}
]
}
]
}3. 关键参数解析
| 参数 | 说明 |
|---|---|
| connectUnderReset | false:常规连接;true:复位连接。适用于 SWD 引脚被用户代码禁用的情况(如 CubeMX 默认配置)。需确保调试器的 RESET 引脚已连接至 MCU |
| speed | 时钟频率(kHz)。Keil 默认 10MHz 是因为其内部有频率自适应机制,而 probe-rs 设置为多少即固定为多少,建议初始设置为 1000(1MHz)以保证连接稳定性 |
| chip | 选择芯片型号 |
| flashing.enabled | 设为 true 可在调试前自动烧录程序 |
| verifyBeforeFlashing | 烧录前对比 Flash 数据与待下载文件,不一致才进行烧录,减少重复无用操作 |
| verifyAfterFlashing | 烧录后进行校验,防止下载数据出错 |
| haltAfterReset | 设为 true 时,调试启动后会暂停在 Reset Handler 入口 |
| coreConfigs | 指定要调试的程序文件,单核芯片只需一个 index 为 0 的配置项 |
| consoleLogLevel | 控制调试日志等级 |
五、调试实战与问题排查
1. 启动调试
按下 F5 启动调试。由于 haltAfterReset 为 true,程序会暂停在启动文件的汇编代码中。
- 注意:启动文件通常缺乏调试信息,在此处进行单步调试(Step Over)可能导致跳转异常。
- 建议:在
main函数入口设置断点,按下F5(Continue)全速运行至main,再进行单步调试。
2. 调试信息格式问题
在查看局部变量时,若显示 <optimized out> 或解析异常,且确认编译时已添加 -g 标志,通常是因为工具链默认生成了 DWARF 5 调试信息,而当前版本的 probe-rs 或 VS Code 插件对其支持不完善。
- 解决方案:修改 CMake 编译 flags,强制生成 DWARF 4 格式:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -gdwarf-4")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -gdwarf-4")修改后重新编译,变量即可正常显示。
3. 外设寄存器查看(SVD 文件)
为了在不查阅手册的情况下实时查看寄存器状态,可利用 SVD(System View Description)文件:
- 从芯片厂商的 Pack 包中提取
STM32F103xx.svd文件,放置于工程目录。 - 在
launch.json中添加配置:
"svdFile": "${workspaceFolder}/STM32F103xx.svd"- 重新启动调试,VS Code 左侧将显示"Peripherals"面板,可展开查看各外设寄存器实时值。
4. Attach 调试
选择 Debug (Attach) 配置,可在 MCU 正在运行时接入调试器。
- 应用场景:程序跑飞或进入 HardFault 时,无需复位,直接 Attach 即可查看当前的调用栈、寄存器状态和变量值,精准定位问题现场。
六、总结
通过上述配置,我们成功在 Windows + VS Code 环境下,利用开源工具链完成了 STM32F103 的编译、烧录与调试闭环。
这一方案的优势在于:
- 零成本:完全规避商业 IDE 的授权费用。
- 自动化友好:基于 CLI 和 JSON 配置,易于集成至 CI/CD 流水线。
- 架构通用性:无论是 ARM Cortex-M 还是 RISC-V,只需更换对应的
chip参数和工具链,probe-rs均可胜任。
掌握这种工具链思维,能够有效应对未来 MCU 架构碎片化带来的开发环境适配难题。