大目熊 · 9月11日 · 广东

MCU probe-rs下载和仿真调试

摆脱商业 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-DAPST-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 readprobe-rs write 命令通过总线进行直读直写。

    • 注意write 命令无法写入 Flash。Flash 编程属于块操作,需遵循特定的擦除与编程算法,必须通过专门的 Flash 下载通道(如 rundownload 命令)进行。
  • 版本迭代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. 关键参数解析

参数说明
connectUnderResetfalse:常规连接;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指定要调试的程序文件,单核芯片只需一个 index0 的配置项
consoleLogLevel控制调试日志等级

五、调试实战与问题排查

1. 启动调试

按下 F5 启动调试。由于 haltAfterResettrue,程序会暂停在启动文件的汇编代码中。

  • 注意:启动文件通常缺乏调试信息,在此处进行单步调试(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)文件:

  1. 从芯片厂商的 Pack 包中提取 STM32F103xx.svd 文件,放置于工程目录。
  2. launch.json 中添加配置:
"svdFile": "${workspaceFolder}/STM32F103xx.svd"
  1. 重新启动调试,VS Code 左侧将显示"Peripherals"面板,可展开查看各外设寄存器实时值。

4. Attach 调试

选择 Debug (Attach) 配置,可在 MCU 正在运行时接入调试器。

  • 应用场景:程序跑飞或进入 HardFault 时,无需复位,直接 Attach 即可查看当前的调用栈、寄存器状态和变量值,精准定位问题现场。

六、总结

通过上述配置,我们成功在 Windows + VS Code 环境下,利用开源工具链完成了 STM32F103 的编译、烧录与调试闭环。

这一方案的优势在于:

  1. 零成本:完全规避商业 IDE 的授权费用。
  2. 自动化友好:基于 CLI 和 JSON 配置,易于集成至 CI/CD 流水线。
  3. 架构通用性:无论是 ARM Cortex-M 还是 RISC-V,只需更换对应的 chip 参数和工具链,probe-rs 均可胜任。

掌握这种工具链思维,能够有效应对未来 MCU 架构碎片化带来的开发环境适配难题。


附录:相关参考

推荐阅读
关注数
1
文章数
7
业余开发者
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息