You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32从STOP模式唤醒后OpenOCD+GDB调试停滞求助

STM32 STOP模式唤醒后OpenOCD+GDB调试停滞的解决方法

问题场景

  • 使用OpenOCD+GDB调试STM32时,MCU从STOP模式唤醒后调试无法继续执行后续代码;但STM32CubeIDE搭配ST Programmer调试时,唤醒后可正常运行到下一行。

休眠唤醒代码

uint32_t seconds = 10;
uint32_t counter = (uint32_t)(seconds * 1000) / 0.488;
HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, counter,
                              RTC_WAKEUPCLOCK_RTCCLK_DIV16);
HAL_SuspendTick();
HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI);
SystemClock_Config();
HAL_ResumeTick();
do_stuff();

异常现象

使用OpenOCD+GDB调试时,执行到休眠唤醒代码后会停滞在以下输出:

Continuing.
halted: PC: 0x080010f0

当前OpenOCD启动命令:

openocd -f interface/stlink-v2.cfg -f target/stm32f4x.cfg

解决方法

1. 修改OpenOCD启动命令,开启低功耗调试支持

在启动命令中添加低功耗调试配置,让OpenOCD正确处理MCU从STOP模式唤醒后的调试状态:

openocd -f interface/stlink-v2.cfg -f target/stm32f4x.cfg -c "set ENABLE_LOW_POWER_DEBUG 1"

ENABLE_LOW_POWER_DEBUG选项会禁用OpenOCD在低功耗模式下的自动halt行为,确保唤醒后调试器能继续跟踪执行。

2. 配置GDB超时与调试同步

连接GDB后,执行以下命令调整调试器参数:

set remotetimeout 30
monitor reset_config srst_only srst_nogate connect_assert_srst
  • set remotetimeout 30:延长GDB与OpenOCD的通信超时时间,适配10秒的休眠时长,避免超时断开
  • monitor reset_config...:重置调试器的复位配置,确保唤醒后能正确识别MCU运行状态

3. 代码层面添加调试同步点(可选)

在唤醒后的时钟配置完成后,添加空操作指令并设置断点,让调试器在唤醒后能停在明确位置,方便手动继续执行:

SystemClock_Config();
HAL_ResumeTick();
__NOP(); // 在此处设置断点
do_stuff();

原因说明

STM32CubeIDE自带的ST Programmer默认启用了低功耗模式下的调试支持,而OpenOCD默认配置未适配这种场景,需要手动开启相关选项来匹配ST调试器的行为。

内容的提问来源于stack exchange,提问作者Movieboy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 04:05:19