这个调试技巧太实用了!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,写入以下内容(加载调试符号,不覆盖代码):
保存后,在 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” 功能:
- 确保 MCU 已烧录与工程一致的代码,且处于运行状态;
- 点击菜单栏「Project→Attach to Running Target」;
- 仿真器自动连接 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. 避坑关键要点
- 代码一致性:MCU 中运行的代码必须与调试工程完全一致(编译时间、优化等级、代码版本),否则符号定位错误,无法对应源码;
- 读保护限制:若 MCU 开启读保护(RDP Level≠0),无法使用该方法,需先关闭读保护;
- 仿真器连接:确保 SWD/JTAG 引脚连接稳定,避免连接时触发 MCU 意外复位(建议使用 ST-LINK V3,连接稳定性更高);
- 符号加载:调试时若无法定位源码,需检查「Load Image and Symbols」中是否正确选择了工程的.elf/.axf 文件。
不复位调试是定位 “现场型、偶发性”Bug 的 “神器”,核心是 “保留现场 + 符号匹配”,三大编译器配置均无需修改代码,几步即可完成。配置后能像正常调试一样加断点、查看变量 / 寄存器,精准抓出隐藏在现场状态中的 Bug。
2519