9

我在 STM32F4 微控制器上有一个 ChibiOS 3.x 程序,我在其中使用 IWDG 看门狗在出现以下错误时重置 MCU:

int main() {
    iwdgInit();
    iwdgStart(&IWDGD, &wd_cfg);
    while(true) {
        // ... do stuff
    }
}

如果我现在连接我的调试器并在任何时候停止程序(手动或通过断点),微控制器将在看门狗配置定义的超时后重置(因此会导致我的调试过程出现问题)

如何禁用此行为,即如何在内核因调试器而停止时禁用 IWDG?

我已经尝试完全禁用它,但是,我需要让它运行以捕获不需要的 IWDG 重置。

4

3 回答 3

13

STM32 MCU 包含一个称为调试冻结的功能。您可以停止多个外设,包括 I2C 超时、RTC,当然还有看门狗。

STM32参考手册中,参考第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();

(基本上和我们上面做的完全一样)

此外,在调用之前,您需要在 APB2 上启用 DBGMCU 时钟__HAL_DBGMCU_FREEZE_IWDG()

 __HAL_RCC_DBGMCU_CLK_ENABLE();
于 2015-09-11T22:18:31.230 回答
7

使用 ST HAL 时,要使用的正确宏是:

__HAL_DBGMCU_FREEZE_IWDG()
于 2016-07-26T11:45:42.233 回答
1

根据参考手册,DBGMCU_CR 寄存器“可以在系统复位下由调试器写入”,因此,如果调试器支持,则无需更改软件。

例如,在 STM32CubeIDE(截至目前版本 1.6.0)中,只需设置 Project > Properties > Run/Debug Settings > Launch configurations for [project name]:> [project name] Debug > Edit > Debugger > Device Settings > Suspend watchdog counters暂停时:

启用。

于 2021-03-31T13:01:48.820 回答