在调试期间禁用 STM32 IWDG
Disabling the STM32 IWDG during debugging
我在 STM32F4 微控制器上有一个 ChibiOS 3.x 程序,我在其中使用 IWDG 看门狗在出现如下错误时重置 MCU:
int main() {
iwdgInit();
iwdgStart(&IWDGD, &wd_cfg);
while(true) {
// ... do stuff
}
}
如果我现在附加我的调试器并在任何时候停止程序(手动或通过断点),微控制器将在看门狗配置定义的超时后重置(因此会导致我的调试过程出现问题)
如何禁用此行为,即如何在内核因调试器而停止时禁用 IWDG?
我已经尝试完全禁用它,但是,我需要保留它 运行 捕获不需要的 IWDG 重置。
STM32 MCU 包含一个称为调试冻结 的功能。您可以停止多个外设,包括 I2C 超时、RTC,当然还有看门狗。
在STM32 reference manual中,参考section 38.16.4ff“MCU debug component (DBGMCU)”。
IWDG 在 APB1 总线上 运行。因此,您需要修改 DBGMCU_APB1_FZ
,最具体地说是断言该寄存器中的 DBG_IWDG_STOP
位。
该寄存器的 POR 值(=默认值)为 0x0,即如果您不主动禁用它,IWDG 仍将是 运行。
int main() {
// Disable IWDG if core is halted
DBGMCU->APB1FZ |= DBGMCU_APB1_FZ_DBG_IWDG_STOP;
// Now we can enable the IWDG
iwdgInit();
iwdgStart(&IWDGD, &wd_cfg);
// [...]
}
请注意,当未在软件中启用看门狗时,如果闪存选项字节中的 WDG_SW
位被重置,它可能仍会在硬件中启用。
如果您使用的是 ST HAL(未包含在 ChibiOS 中,请参阅 STM32CubeF4),您还可以使用此宏:
__HAL_DBGMCU_FREEZE_IWDG();
(基本上和我们上面做的完全一样)
此外,在调用__HAL_DBGMCU_FREEZE_IWDG()
之前,您需要在APB2上启用DBGMCU时钟。
__HAL_RCC_DBGMCU_CLK_ENABLE();
使用 ST HAL 时,正确使用的宏是:
__HAL_DBGMCU_FREEZE_IWDG()
根据参考手册,DBGMCU_CR寄存器“可以在系统复位时由调试器写入”,因此,如果调试器支持它,则无需在软件中进行更改。
例如,在 STM32CubeIDE(截至目前的版本 1.6.0)中,只需设置项目 > 属性 > Run/Debug 设置 > [项目名称] 的启动配置:> [项目名称] 调试 > 编辑 > 调试器> 设备设置 > 停止时暂停看门狗计数器:
启用。
我在 STM32F4 微控制器上有一个 ChibiOS 3.x 程序,我在其中使用 IWDG 看门狗在出现如下错误时重置 MCU:
int main() {
iwdgInit();
iwdgStart(&IWDGD, &wd_cfg);
while(true) {
// ... do stuff
}
}
如果我现在附加我的调试器并在任何时候停止程序(手动或通过断点),微控制器将在看门狗配置定义的超时后重置(因此会导致我的调试过程出现问题)
如何禁用此行为,即如何在内核因调试器而停止时禁用 IWDG?
我已经尝试完全禁用它,但是,我需要保留它 运行 捕获不需要的 IWDG 重置。
STM32 MCU 包含一个称为调试冻结 的功能。您可以停止多个外设,包括 I2C 超时、RTC,当然还有看门狗。
在STM32 reference manual中,参考section 38.16.4ff“MCU debug component (DBGMCU)”。
IWDG 在 APB1 总线上 运行。因此,您需要修改 DBGMCU_APB1_FZ
,最具体地说是断言该寄存器中的 DBG_IWDG_STOP
位。
该寄存器的 POR 值(=默认值)为 0x0,即如果您不主动禁用它,IWDG 仍将是 运行。
int main() {
// Disable IWDG if core is halted
DBGMCU->APB1FZ |= DBGMCU_APB1_FZ_DBG_IWDG_STOP;
// Now we can enable the IWDG
iwdgInit();
iwdgStart(&IWDGD, &wd_cfg);
// [...]
}
请注意,当未在软件中启用看门狗时,如果闪存选项字节中的 WDG_SW
位被重置,它可能仍会在硬件中启用。
如果您使用的是 ST HAL(未包含在 ChibiOS 中,请参阅 STM32CubeF4),您还可以使用此宏:
__HAL_DBGMCU_FREEZE_IWDG();
(基本上和我们上面做的完全一样)
此外,在调用__HAL_DBGMCU_FREEZE_IWDG()
之前,您需要在APB2上启用DBGMCU时钟。
__HAL_RCC_DBGMCU_CLK_ENABLE();
使用 ST HAL 时,正确使用的宏是:
__HAL_DBGMCU_FREEZE_IWDG()
根据参考手册,DBGMCU_CR寄存器“可以在系统复位时由调试器写入”,因此,如果调试器支持它,则无需在软件中进行更改。
例如,在 STM32CubeIDE(截至目前的版本 1.6.0)中,只需设置项目 > 属性 > Run/Debug 设置 > [项目名称] 的启动配置:> [项目名称] 调试 > 编辑 > 调试器> 设备设置 > 停止时暂停看门狗计数器:
启用。