打印
[应用相关]

STM32学习之看门狗

[复制链接]
177|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2025-3-24 14:35 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
WDG简介
WDG(Watchdog)看门狗,看门狗可以监控程序的运行状态,当程序因为设计漏洞、硬件故障、电磁干扰等原因,出现卡死或跑飞现象时,看门狗能及时复位程序,避免程序陷入长时间的**状态,保证系统的可靠性和安全性。程序的设计是非常讲究逻辑的,每一种可能,每一种状态,都要在写程序的时候预先注意到,否则,一旦出现了程序没有预料到的地方,程序经常就会出现卡死、跑飞、胡乱运行的状况,看门狗可以在程序卡死或者崩溃的时候帮我们按一下复位,虽然不能解决bug本身,但是可以极大程度的提高程序的健壮性,因为很多bug都是偶然发生的,简单的复位一下可以很大概率的让程序走向正规。

看门狗本质上是一个定时器,当指定时间范围内,程序没有执行喂狗(重置计数器)操作时,看门狗硬件电路就自动产生复位信号。定时器溢出产生中断,而看门狗定时器溢出直接产生复位信号,喂狗操作其实就是重置计数器,递减计数器当减到0之后就执行复位,那程序正常运行时,为了避免复位就得在计数器减到0之前及时把计数值加大,这个操作就是喂狗,如果程序卡死了没有及时加大计数器,那减到0之后就会自动复位。

STM32内置两个看门狗
独立看门狗(IWDG):独立工作,对时间精度要求较低。
独立运行就是独立看门狗的时钟是专用的LSI(内部低速时钟),即使主时钟出问题了看门狗也可以正常工作,对时间精度要求较低就是独立看门狗只有一个最晚时间界限,你喂狗的间隔只要不超过这个最晚界限就可以了。
窗口看门狗(WWDG):要求看门狗在精确计时窗口起作用。
喂狗的时间有个最晚的界限也有个最早的界限,必须在这个界限的窗口内喂狗。因为对于独立看门狗,可能程序卡死在喂狗部分或者程序跑飞了但是喂狗的程序也意外执行了或者程序有时候很快的喂狗,有时候很慢的喂狗,这些状态独立看门狗检测不到,但是窗口看门狗是可以检测到这些问题的。窗口看门狗使用的是APB1的时钟。

IWDG框图



IWDG键寄存器
键寄存器本质上是控制寄存器,用于控制硬件电路的工作。
在可能存在干扰的情况下,一般通过在整个键寄存器写入特定值来代替控制寄存器写入一位的功能,以降低硬件电路受到干扰的概率。看门狗工作的环境是程序可能跑飞,可能受到电磁干扰等,程序做出任何操作都是有可能的,如果只在寄存器中设置一个位,那这一位就有可能在误操作中被改变,这个概率是比较大的,所以单独一位来控制是比较危险的。通过在整个键寄存器写入特定值来代替控制寄存器写入一位的功能,键寄存器是16位的只有在键寄存器中写入0xAAAA这个特定的数才会执行喂狗操作这样就会降低误操作的概率,比如程序跑飞胡乱的设置各个寄存器,键寄存器也受到了影响,但是恰好变为0xAAAA这个数的概率是非常小的。



IWDG超时时间
超时时间:T(IWDG) = T(LSI) × PR预分频系数 × (RL + 1),其中:T(LSI) = 1 / F(LSI)
超时时间,也就是定时器的溢出时间。
超时频率 = LSI的频率/预分频/重装值,对应定时器的话就是72M/(PSC+1)/(ARR+1)
LSI是输入时钟40KHz, F(LSI)就是40K,T(LSI) = 1 / 40K = 0.025ms,也就是每隔0.025ms来一个输入时钟,之后输入时钟进行分频,相当于计数时间加倍,RL就是RLR计数目标。



WWDG框图



时钟来源是PCLK1,也就是APB1的时钟,这个时钟默认是36MHz,在预分频器分频时钟,驱动计数器计数,这个计数器也是递减计数器,每来一个时钟自减一次,不过这个计数器比较特殊,从图上看,是T6到T0总共7位,但是下面写的6位递减计数器,其实这个计数器只有T5到T0这6位是有效计数值,最高位T6这里被用来当做溢出标志位了,T6位等于1时,表示计数器没有溢出,T6位等于0时,表示计数器溢出。WDGA是窗口看门狗的激活位,也就是使能,WDGA写入1启用窗口看门狗。
喂狗的最早界限由图中上面部分实现,将最早喂狗界限的计数值写入到W6到W0,这些值写入后是固定不变的,一旦执行写CR操作时与门开关就会打开,写入CR就是写入计数器也就是喂狗,在喂狗时比较器开始工作,一旦它比较我们当前的T6到0大于W6到0,比较结果就是1,这个1就通过或门也可以申请复位。喂狗太晚6位递减计数器到0了,复位,喂狗太早T6到0大于W6到0,复位。

WWDG工作特性
递减计数器T[6:0]的值小于0x40时,WWDG产生复位
递减计数器T[6:0]在窗口W[6:0]外被重新装载时,WWDG产生复位
递减计数器T[6:0]等于0x40时可以产生早期唤醒中断(EWI),用于重装载计数器以避免WWDG复位
这个中断是在溢出的前一刻发生,所以这个中断也可以称为“死前中断”,马上就要溢出了,再提醒一下要不要做点什么。所以在这个早期唤醒中断(EWI)里面,一般可以用来执行一些紧急的操作,比如保存重要数据、关闭危险设备等,或者还有一种写法,虽然超时喂狗了,但是可以在中断里执行一些代码进行解决或者这个任务不是很危险超时了我就只想做一些提示不想让它复位,这样的话就可以在这个早期唤醒中断(EWI)里面直接执行喂狗阻止系统复位。
定期写入WWDG_CR寄存器(喂狗)以避免WWDG复位



WWDG超时时间

超时时间:
T(WWDG) = T(PCLK1) × 4096 × WDGTB预分频系数 × (T[5:0] + 1)

窗口时间:
T(WIN )= T(PCLK1 )× 4096 × WDGTB预分频系数 × (T[5:0] - W[5:0])

其中:T(PCLK1 )= 1 / F(PCLK1)
超时时间就是喂狗的最晚时间,窗口时间就是喂狗的最早时间,这里乘4096是因为,在PCLK1进来的时候有一个固定的4096分频。WDGTB预分频系数就是2的WDGTB次方。



IWDG和WWDG对比



————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/weixin_45651178/article/details/145929449

使用特权

评论回复
沙发
xuanhuanzi| | 2025-3-25 10:41 | 只看该作者
如果有什么过程阻塞了,会不会就可能导致看门狗复位

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2179

主题

16467

帖子

16

粉丝