加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 在调试期间禁用STM32 IWDG

发布时间:2020-12-16 07:50:13 所属栏目:百科 来源:网络整理
导读:我在STM32F4微控制器上有一个ChibiOS 3.x程序,我使用IWDG看门狗来重置MCU,如下所示: int main() { iwdgInit(); iwdgStart(IWDGD,wd_cfg); while(true) { // ... do stuff }} 如果我现在连接我的调试器,并且在任何时候停止程序(手动或通过断点),微控制器将在
我在STM32F4微控制器上有一个ChibiOS 3.x程序,我使用IWDG看门狗来重置MCU,如下所示:
int main() {
    iwdgInit();
    iwdgStart(&IWDGD,&wd_cfg);
    while(true) {
        // ... do stuff
    }
}

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

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

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

解决方法

STM32 MCU包含一个称为调试冻结的功能.您可以停止多个外设,包括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();

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读