我在STM32F4微控制器上有一个ChibiOS 3.x程序,我使用IWDG看门狗来重置MCU,如下所示:
int main() {
iwdgInit();
iwdgStart(&IWDGD, &wd_cfg);
while(true) {
// ... do stuff
}
}
如果我现在连接我的调试器,并且在任何时候停止程序(手动或通过断点),微控制器将在看门狗配置定义的超时后重置(因此导致我的调试过程出现问题)
如何禁用此行为,即如何在核心因调试器而停止时禁用IWDG?
我尝试完全禁用它,但是,我需要让它保持运行以捕获不需要的IWDG重置。
答案 0 :(得分:10)
STM32 MCU包含一个名为 debug freeze 的功能。您可以停止多个外设,包括I2C超时,RTC,当然还有看门狗。
在STM32 reference manual中,请参阅第38.16.4ff节。
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()
(基本上和我们上面完全一样)
此外,您需要在APB2上启用DBGMCU时钟。
__HAL_RCC_DBGMCU_CLK_ENABLE();
答案 1 :(得分:3)
使用ST HAL时,使用的右边是:
__HAL_DBGMCU_FREEZE_IWDG()
答案 2 :(得分:1)
根据参考手册,DBGMCU_CR寄存器“可以在系统复位下由调试器写入”,因此,如果调试器支持它,则无需在软件中进行更改。
例如,在 STM32CubeIDE(截至目前版本 1.6.0)中,只需设置 Project > Properties > Run/Debug Settings > Launch settings for [project name]:> [project name] Debug > Edit > Debugger > Device Settings >暂停时暂停看门狗计数器:
启用。