我使用 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);
独立看门狗在任何处理器模式下都无法停止。您必须定期醒来以重新加载看门狗。您可以做的是将预分频器更改为最大值,以便看门狗缓慢计数。
只有当您断开控制器的电源时,IWDG 才会停止。
我有(不知何故)同样的问题,所以这就是我所做的:
我使用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.
}
有一个闪存选项字节可以清除,它将阻止 IWDG 或 WWDG 定时器在停止模式下计数。
如前所述,有一个涉及选项字节的解决方案。我使用了 STM32Cube Programmer 应用程序并禁用了用户选项中的 IWDG_STOP 选项。当进入停止模式时,此操作会冻结看门狗定时器。