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