扫码加入

  • 正文
  • 相关推荐
申请入驻 产业图谱

STM32 不复位调试实战:MDK/IAR/CubeIDE 全攻略,保留现场抓偶发 Bug

2025/12/31
2519
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

这个调试技巧太实用了!STM32 不复位调试的核心是 “不覆盖代码 + 不复位 MCU + 加载调试符号”,能完整保留程序运行现场,专门解决测试 / 出厂后才出现、仿真时难复现的偶发性 Bug,适配 MDK、IAR、STM32CubeIDE 三大主流编译器,配置简单且见效快。

资料获取:【应用笔记】调试小技巧之不复位调试

1. 核心原理与适用场景

1.1 核心逻辑

先将与调试工程完全一致的代码烧录到 MCU,调试时仅加载本地工程的调试符号(.axf/.elf 文件),不下载新代码、不触发 MCU 复位,确保寄存器、内存、变量的实时状态不被破坏,还原 Bug 发生时的现场。

1.2 适用场景

  • 偶发性 Bug:比如运行几小时 / 几天才出现的故障,日志无法定位具体位置;
  • 现场故障复现:设备出厂后、测试中出现的问题,需连接仿真器直接排查;
  • 敏感状态保留:依赖实时数据、外设状态的场景,复位后状态丢失无法复现。

2. 三大编译器配置步骤(直接上手)

2.1 MDK(Keil uVision)

步骤 1:创建初始化脚本

新建文本文件,命名为Loader.ini,写入以下内容(加载调试符号,不覆盖代码):

LOAD %L INCREMENTAL

保存后,在 MDK 中打开「Options for Target→Debug→Initialization File」,选择该.ini 文件。

步骤 2:取消复位与自动下载

  • 「Debug→Cortex-M Target Driver Setup→Connect & Reset Options」,取消 “Reset after Connect”;
  • 「Flash→Configure Flash Tools→Debug」,取消 “Update Target before Debugging”。

步骤 3:启动调试

确保 MCU 已烧录与工程一致的代码,点击调试按钮,即可不复位进入调试模式,正常加断点、单步执行。

2.2 IAR Embedded Workbench

无需复杂配置,直接使用自带 “Attach” 功能:

  1. 确保 MCU 已烧录与工程一致的代码,且处于运行状态;
  2. 点击菜单栏「Project→Attach to Running Target」;
  3. 仿真器自动连接 MCU,加载本地工程符号,不复位、不下载,直接进入调试模式。

2.3 STM32CubeIDE

建议复制现有调试配置,避免影响原有设置:

步骤 1:复制调试配置

  • 点击「Run→Debug Configurations」,选中现有调试配置,点击「Duplicate」,命名为 “XXX Debug (Attach)”。

步骤 2:修改复位行为

  • 切换到「Debugger」标签页,「Reset behaviour→Type」选择 “None”(不复位);
  • 取消「Misc」中的 “Verify flash download” 选项。

步骤 3:禁用自动下载

  • 切换到「Startup」标签页,「Load Image and Symbols」中,取消 “Download” 选项(仅加载符号,不下载代码)。

步骤 4:启动调试

选择新复制的配置,点击「Debug」,即可不复位连接 MCU,保留现场调试。

3. 避坑关键要点

  1. 代码一致性:MCU 中运行的代码必须与调试工程完全一致(编译时间、优化等级、代码版本),否则符号定位错误,无法对应源码;
  2. 读保护限制:若 MCU 开启读保护(RDP Level≠0),无法使用该方法,需先关闭读保护;
  3. 仿真器连接:确保 SWD/JTAG 引脚连接稳定,避免连接时触发 MCU 意外复位(建议使用 ST-LINK V3,连接稳定性更高);
  4. 符号加载:调试时若无法定位源码,需检查「Load Image and Symbols」中是否正确选择了工程的.elf/.axf 文件。

不复位调试是定位 “现场型、偶发性”Bug 的 “神器”,核心是 “保留现场 + 符号匹配”,三大编译器配置均无需修改代码,几步即可完成。配置后能像正常调试一样加断点、查看变量 / 寄存器,精准抓出隐藏在现场状态中的 Bug。

相关推荐