debugging STM32休眠后OpenOCD调试停止

ni65a41a  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(281)

使用OpenOCD和GDB调试STM32时,当MCU从STOP模式唤醒时,OpenOCD不会继续调试。
我有以下代码,它使MCU休眠10秒,然后将其唤醒:

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():

当我将STM32CubeIDE与意法半导体编程器配合使用时,它按预期工作。MCU唤醒后,调试过程继续到下一行。
使用OpenOCD和GDB,并停留在

Continuing.
halted: PC: 0x080010f0

如何使它的行为类似于ST调试器,在ST调试器中,它在休眠后继续调试?
我使用以下行启动OpenOCD会话:

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

piah890a1#

您必须启用调试器STOP模式支持。引用自参考手册:
内核不允许在调试会话期间关闭FCLK或HCLK。由于这些是调试器连接所必需的,因此在调试期间,它们必须保持活动状态。MCU集成了特殊方法,允许用户在低功耗模式下调试软件。为此,调试器主机必须首先设置一些调试配置寄存器,以更改低功耗模式行为:
·在睡眠模式下,DBGMCU_CR寄存器的DBG_SLEEP位必须事先由调试器设置。这将为HCLK提供与FCLK相同的时钟(系统时钟事先由软件配置)。
·在停止模式下,位DBG_STOP必须事先由调试器设置。这将使内部RC振荡器时钟在停止模式下馈送FCLK和HCLK
来自DBGMCU_CR寄存器的说明。

**位1 DBG_STOP:**调试停止模式
0:(FCLK=Off,HCLK=Off)在STOP模式下,时钟控制器禁用所有时钟(包括HCLK和FCLK)。退出STOP模式时,时钟配置与RESET后的时钟配置相同(CPU由8 MHz内部RC振荡器(HSI)计时)。因此,软件必须重新编程时钟控制器以启用PLL、Xtal等。
1:(FCLK=On,HCLK=On)在这种情况下,当进入STOP模式时,FCLK和HCLK由内部RC振荡器提供,该振荡器在STOP模式下保持活动状态。当退出STOP模式时,软件必须重新编程时钟控制器,以使能PLL、Xtal等(与DBG_STOP=0时的方式相同)

我认为HAL_DBGMCU_EnableDBGStopMode()函数是这个寄存器的责任。但是你可能需要检查你使用的库的确切版本。
STProgrammer可能会静默修改此位。

相关问题