学习笔记———解决STM32停止模式下IWDG无法关闭导致不停复位

        最近使用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的时钟源也会被关了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值