使用stm32L4,开启syswatch,设置异常时系统重启。程序中使用低功耗睡眠,syswatch里面使用了看门狗,看门狗在低功耗时继续计数,这样的话开启了syswatch的程序在进入睡眠后看门狗会超时,会将系统重启,无法达到低功耗使用syswatch的目的。
网上收集了一些方法,就是设置stm32L4在睡眠时看门狗不计数,这样syswatch就可以在低功耗睡眠状态时也可以继续使用。
void freedog()
{
uint8_t flag_IWDG;
flag_IWDG = READ_BIT(FLASH->OPTR, FLASH_OPTR_IWDG_STOP) != 0; //设置旗标,避免反复加载flash导致重启
if (flag_IWDG != 0)
{
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,已经上锁再执行一遍问题不大
}
INIT_BOARD_EXPORT(freedog);
将这段代码设置自动初始化,而且是早期自动初始化,必须等syswach起作用之前执行。这样开启syswatch进入低功耗也可以了。
是的,这样的情况睡眠状态是没有保障,只能靠MCU的能力来保障时间一到RTC将MCU唤醒,如果睡眠中有问题了RTC不能将其可靠唤醒,那只能当成另一种故障了。