公司动态

STM32F103看门狗在需要低功耗的电池供电产品中如何应用

📅 2026/7/31 18:20:12
STM32F103看门狗在需要低功耗的电池供电产品中如何应用
STM32系列MCU内部具有独立看门狗(IWDG)和窗口看门狗(WWDG),它们的差别如下看门狗开启之后通过软件无法关闭网上有很多教程说通过系统复位后不再去初始化看门狗就可以了虽然此方法可行但总觉得有点多此一举既然都要通过复位去关闭看门狗了还不如直接不开启看门狗。独立看门狗不适用于要进入低功耗的产品原因是其使用的时钟源为内部40KHz低速时钟在进入低功耗STOP模式下该时钟还是保持工作进入低功耗后无法执行喂狗行为导致复位事件发生当然也有解决办法通过RTC定时唤醒然后进行喂狗行为就可以了但是这样程序变复杂了功耗增加了而且还存在逻辑隐患当刚好RTC唤醒喂狗行为与用户开启工作的中断唤醒行为在同一时间段执行时需要做很多判断去避免程序逻辑问题。但其也并不是一无是处在市电产品或者长期接电源无需进入低功耗的产品中用起来就非常方便因为其配置简单喂狗的时间周期可以较长所以可以将喂狗行为放在扫描时间较长的主循环里执行。使用STM32CUBEMX配置独立看门狗的方法如下其超时周期计算方式如下40KHz/64分频625Hz使用625Hz进行1250次计数其周期则为 1/625*12502秒对应生成的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定时器开启直接放在外部中断里面开启这样可以确保唤醒后及时喂狗