我在STM32F4微控制器上有一个ChibiOS 3.x程序,其中我使用IWDG watchdog在出现以下错误时重置MCU:
int main() {
iwdgInit();
iwdgStart(&IWDGD, &wd_cfg);
while(true) {
// ... do stuff
}
}如果我现在连接调试器,并在任何时候停止程序(手动或通过断点),微控制器将在看门狗配置定义的超时后重置(因此会在调试过程中导致问题)
如何禁用此行为,例如,当内核因调试器而停止时,如何禁用IWDG?
我已经尝试完全禁用它,但是,我需要让它保持运行,以捕获不需要的IWDG重置。
发布于 2015-09-12 06:18:31
STM32 MCU包含一项称为调试冻结的功能。您可以停止多个外设,包括I2C超时、实时时钟,当然还有看门狗。
在STM32 reference manual中,请参阅第38.16.4ff节"MCU调试组件(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();发布于 2016-07-26 19:45:42
使用ST HAL时,要使用的正确宏是:
__HAL_DBGMCU_FREEZE_IWDG()发布于 2021-03-31 21:01:49
根据参考手册,DBGMCU_CR寄存器“可以在系统复位时由调试器写入”,因此,如果调试器支持它,则不需要对软件进行更改。
例如,在STM32CubeIDE (现在是1.6.0版本)中,只需为项目名称设置项目>属性>运行/调试设置>启动配置:>项目名称调试>编辑>调试器>设备设置>暂停时暂停看门狗计数器:
以启用。
https://stackoverflow.com/questions/32532916
复制相似问题