c - 在调试期间禁用 STM32 IWDG

标签 c stm32 watchdog chibios

我在 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/

相关文章:

c - 程序跳过 switch case 中的所有 case 并转到 default

c++ - C++ 中的 C 库

C 函数指针调用语法

c - 有人有带有 TLC59116 I2C 示例代码的 STM32L0xx 吗?

c - STM32,读取ADC值并使用UART传输(HAL库)

python - 无法在 C 程序中链接 Python 库

c - 为什么 STM32 I2C 从机返回不需要的 NACK 或无限期延长时钟?

Python看门狗应用程序

php - 如何遍历Drupal的看门狗表?

linux - 如何测试网络内核模块的 tx_timeout 操作?