STM32F103看门狗在需要低功耗的电池供电产品中如何应用
2026/7/31 18:20:01 网站建设 项目流程

STM32系列MCU内部具有独立看门狗(IWDG)和窗口看门狗(WWDG),它们的差别如下:

看门狗开启之后通过软件无法关闭,网上有很多教程说通过系统复位后不再去初始化看门狗就可以了,虽然此方法可行,但总觉得有点多此一举,既然都要通过复位去关闭看门狗了,还不如直接不开启看门狗。

独立看门狗不适用于要进入低功耗的产品,原因是其使用的时钟源为内部40KHz低速时钟,在进入低功耗STOP模式下该时钟还是保持工作,进入低功耗后无法执行喂狗行为,导致复位事件发生;当然也有解决办法,通过RTC定时唤醒然后进行喂狗行为就可以了,但是这样程序变复杂了,功耗增加了,而且还存在逻辑隐患,当刚好RTC唤醒喂狗行为与用户开启工作的中断唤醒行为在同一时间段执行时,需要做很多判断去避免程序逻辑问题。
但其也并不是一无是处,在市电产品或者长期接电源,无需进入低功耗的产品中用起来就非常方便,因为其配置简单,喂狗的时间周期可以较长,所以可以将喂狗行为放在扫描时间较长的主循环里执行。

使用STM32CUBEMX配置独立看门狗的方法如下:

其超时周期计算方式如下:40KHz/64分频=625Hz,使用625Hz进行1250次计数,其周期则为 1/625*1250=2秒

对应生成的Keil程序如下:

调用方法也很简单,在main函数中进行初始化,然后在while主循环中进行喂狗即可:

而窗口看门狗刚好就适用于低功耗产品,因为其时钟使用的是APB1总线时钟,当进入低功耗后该时钟会停止,则窗口看门狗也会停止计数,其使用STM32CUBEMX配置的过程如下:

其超时周期计算方式如下:APB1固定4096倍分频后,再由用户自己配置其时钟再分频系数以及计数值,我的APB1总线时钟为32MHz,进行4096倍分频和8倍再分频后每一个计数值周期为
1/(32000000/4096/8)=1.024ms,计数值的配置主要为了设置喂狗上、下值限制,在限制范围内则称为允许喂狗窗口,提早喂狗或者超时喂狗或者不喂狗都将导致系统复位,其配置参数包括以下两个:

1). 计数初值,只能配置126或者127,然后开启窗口看门狗后它会从这个初值开始累减,喂狗后恢复初值;

2). 窗口值,窗口下限默认为64,而窗口上限在64到127之间由用户自行配置

如我图中所配置的参数,则窗口看门狗会从127开始每1.024ms递减一次,递减到64~126区间内可以进行正常喂狗,若开启后立马喂狗或者递减到小于64之后再喂狗都会触发复位。
窗口看门狗在Keil中的使用方法如下:



在main函数中进行初始化,喂狗行为则在1ms定时器中断进行,为什么这样做呢?因为while主循环里面会有大量程序需要扫描处理,也可能存在一些delay函数,所以时间无法准确判断,且执行到一些程序若存在delay函数容易导致喂狗超时,而放在1ms定时器中断里面,我们不会把delay函数放在中断内去执行;这里程序我累加超过10次,即10ms,而我的看门狗递减10次时间为10*1.024ms,还是落在64~126的窗口值内,可以比较准确把控时间。


然后在进入低功耗之前,我们要把1ms定时器关闭靠近进入低功耗的程序执行,因为如果提前关闭ms定时器,则不再喂狗,此时若不快速进入低功耗,使得APB1时钟停止的话,窗口看门狗还在不断递减,最终会导致复位。

然后我的产品是使用按键触发外部中断进行唤醒,我就把1ms定时器开启直接放在外部中断里面开启,这样可以确保唤醒后及时喂狗:

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询