1、先建立基于STM32L4的低功耗STOP的例程(可以休眠1分钟)
SysTick->CTRL = 0x00;//关闭定时器
SysTick->VAL = 0x00;//清空val,清空定时器
/* Disable all used wakeup source */
HAL_RTCEx_DeactivateWakeUpTimer(&hrtc);
HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, Sample_Interval*60, RTC_WAKEUPCLOCK_CK_SPRE_16BITS);//秒
/* Enter STOP 2 mode */
HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);
2、在低功耗STOP例程的基础上增加IWDG功能(周期可以设置4秒钟)
具体看门狗周期可以按照自己的系统进行设置
hiwdg.Instance = IWDG;
hiwdg.Init.Prescaler = IWDG_PRESCALER_32;
hiwdg.Init.Window = 4095;
hiwdg.Init.Reload = 4000;
if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
//喂狗操作
HAL_IWDG_Refresh(&hiwdg);
3、在进入休眠前设置STOP模式关闭IWDG
参照
以下代码参考了https://blog.csdn.net/jubitl/article/details/99698616的博客,在此谢谢为大家带来方便的博主们。
只是修改了flag_IWDG变量类型。
uint32_t flag_IWDG;
flag_IWDG=READ_BIT(FLASH->OPTR, FLASH_OPTR_IWDG_STOP);//设置旗标,避免反复加载flash导致重启
if(flag_IWDG!=0)
{
printf("系统IWDG使能\r\n");
HAL_FLASH_Unlock();
HAL_FLASH_OB_Unlock();//解锁FLASH
CLEAR_BIT(FLASH->OPTR, FLASH_OPTR_IWDG_STOP);//修改看门狗参数为:休眠时看门狗停止计数
/* Set OPTSTRT Bit */
SET_BIT(FLASH->CR, FLASH_CR_OPTSTRT);//以下3句不可缺少,否则无法修改FLASH->OPTR
/* Wait for last operation to be completed */
FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);
/* If the option byte program operation is completed, disable the OPTSTRT Bit */
CLEAR_BIT(FLASH->CR, FLASH_CR_OPTSTRT);
HAL_FLASH_OB_Launch();//加载flash,会导致重启
HAL_FLASH_OB_Lock();
HAL_FLASH_Lock();//修改完后关闭flash,已经上锁再执行一遍问题不大
}
else
{
printf("系统STOP模式IWDG未使能\r\n");
}
4、系统重启后,STOP模式下IWDG功能即可关闭。
只要根据自己的功能以及代码执行逻辑进行喂狗操作即可。