我在 STM32F4 微 Controller 上有一个 ChibiOS 3.x 程序,我使用 IWDG 看门狗在出现这样的错误时重置 MCU:
int main() {
iwdgInit();
iwdgStart(&IWDGD, &wd_cfg);
while(true) {
// ... do stuff
}
}
如果我现在连接调试器并在任何时候停止程序(手动或通过断点),微 Controller 将在看门狗配置定义的超时后重置(因此会导致调试过程中出现问题)
如何禁用此行为,即如何在内核因调试器而停止时禁用 IWDG?
我曾尝试完全禁用它,但是,我需要让它运行以捕获不需要的 IWDG 重置。
最佳答案
STM32 MCU 包含一项称为调试卡住的功能。您可以停止多个外设,包括 I2C 超时、RTC,当然还有看门狗。
在 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();
关于c - 调试期间禁用STM32 IWDG,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32532916/