最近使用L0系列开发停止模式RTC定时唤醒的功能,使用了IWDG(独立看门狗)用来确保程序正常运行,但遇到个问题:程序运行只需要20s左右,运行完后进去停止模式。间隔很长一个小时后唤醒,但在进停止模式前无法关闭看门狗,导致程序不断复位。各位大神关闭看门狗的操作本小白也难以理解,随后发现停止模式下WWDG(窗口看门狗)的时钟源为PLCK1。
由此想到是否可以通过停止模式关闭外设时钟源来间接关闭看门狗,唤醒之后重新配置时钟(停止模式唤醒本身也需要重新配置时钟)。因此决定使用WWDG替代IWDG,但是WWDG最大复位需要的计数值最多只有127.分频系数最大也只有8,根据给出的公式计算:
32000000/4096/8=976.5625HZ;
而WWDG窗口下线为0x3F,设定最大窗口计数值为127;则我需要在(127-63)/976.5625s内喂狗,也就是65ms左右。显然对于我的程序需要运行20s这点是不够用的。。。。
因此需要开启早起唤醒中断:
.也就是说,WWDG在计数值为0x40时会进入这个中断,也就是65ms后进入这个中断,我们只需要在回调函数中加入一个计数值,简单设定阈值,就可以实现控制喂狗的时间啦。
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
if(wwdg_Refresh++<400)
{
HAL_WWDG_Refresh(hwwdg);
}
}
这里设定400,也就是26s左右不把wwdg_Refresh清0的话就会复位,所以我们只需要在进入停止模式前将wwdg_Refresh清0即可。因为停止模式不会清除RAM,但待机模式Standby可能就不好实现了,不过Standby模式唤醒后也相当于复位,所以不需要担心在Standby模式下会被复位,因为WWDG的时钟源也会被关了。