在 STOP 模式之前禁用 STM32 HAL IWDG 或 WWDG(看门狗)

问题描述 投票:0回答:4

我使用 STM32 (L0 5) HAL,我需要在进入 STOP 模式之前禁用 IWDG 或 WWDG。在 IWDG 将 MCU 从 STOP 模式重置之前,以下代码可以正常工作。对于 WWDG 使用,这要快得多,并且在调用 HAL_PWR_EnterSTOPMode 之前重置,尽管 HAL_WWDG_Refresh 在每行之后调用。我也在 Nucleo L05 上测试了这些场景。

iwdgHandle.Instance = IWDG;
iwdgHandle.Init.Prescaler = IWDG_PRESCALER_64;
iwdgHandle.Init.Window = 4095;
iwdgHandle.Init.Reload = 4095;
if (HAL_IWDG_Init(&iwdgHandle) != HAL_OK) // almost 7secs until refresh has to be called
{
 _Error_Handler(__FILE__, __LINE__);
}

HAL_PWR_EnableWakeUpPin(WakeSpi_Pin);
HAL_PWREx_EnableUltraLowPower(); // Enable Ultra low power mode
HAL_PWREx_EnableFastWakeUp(); // Enable the fast wake up from Ultra low power mode

HAL_SuspendTick();
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
stm32 watchdog hal
4个回答
6
投票

独立看门狗在任何处理器模式下都无法停止。您必须定期醒来以重新加载看门狗。您可以做的是将预分频器更改为最大值,以便看门狗缓慢计数。

只有当您断开控制器的电源时,IWDG 才会停止。


1
投票

我有(不知何故)同样的问题,所以这就是我所做的:

我使用HAL库,它首先初始化

HAL_Init();
,然后调用
SystemClock_Config();
,然后开始初始化外围设备,包括
iwdg
。 (无需 HAL 也可以实现)。

因此,当我想进入停止模式时,我使用

HAL_NVIC_SystemReset();
重新启动系统,当微重新启动时,在
SystemClock_Config();
之后,我检查之前的系统重新启动原因(检查此)。如果是软件重置,我会进入停止模式并且不让 IWDG 初始化。

简单,容易。

伪代码:

1. instead of directly going to STOP mode -> make a software restart using HAL_NVIC_SystemReset();

//After restart and configuring system clocks (before initializing other peripherals)
2. if(previous restart reason == software restart) { 
        goto stop mode /* we don't init iwdg */
    } else {
        continue initializing peripherals.
    }

1
投票

有一个闪存选项字节可以清除,它将阻止 IWDG 或 WWDG 定时器在停止模式下计数。


0
投票

如前所述,有一个涉及选项字节的解决方案。我使用了 STM32Cube Programmer 应用程序并禁用了用户选项中的 IWDG_STOP 选项。当进入停止模式时,此操作会冻结看门狗定时器。

© www.soinside.com 2019 - 2024. All rights reserved.