stm32看门狗
总结 stm32 看门狗的使用方法
概述
看门狗
stm32中有两中看门狗,一种是独立看门狗、一种是窗口看门狗。独立看门狗的时间精度较低,适用于对时间没有要求的任务。可以将独立 看门狗看作是宠物狗,将窗口看门狗看作是警犬。
独立看门狗(IWDG)
之所以称之为“独立”是因为:独立看门狗的时钟由独立的RC振荡器LSI提供,即使主时钟发生故障它仍然有效。
独立看门狗的计数器是一个12位的递减计数器,最大值为0XFFF,当计数器减到0时,会产生一个复位信号:IWDG_RESET, 让程序重新启动运行,如果在计数器减到0之前刷新了计数器的值的话,就不会产生复位信号,重新刷新计数器值的这个动作我们俗称喂狗。
独立看门狗的简图:
其中键寄存器就相当于控制寄存器一样。
设置多久之内需要喂狗(即重新刷新计数器值):
重装载寄存器是一个12位的寄存器,里面装着要刷新到计数器的值,这个值的大小决定着独立看门狗的溢出时间。 超时时间Tout = (4*2^prv) / 40 * rlv (s)
,prv是预分频器寄存器的值,rlv是重装载寄存器的值。
使用范围
独立看门狗一般用来检测和解决由程序引起的故障,比如一个程序正常运行的时间是50ms, 在运行完这个段程序之后紧接着进行喂狗,我们设置独立看门狗的定时溢出时间为60ms,比我们需要监控的程序50ms多一点, 如果超过60ms还没有喂狗,那就说明我们监控的程序出故障了,跑飞了,那么就会产生系统复位,让程序重新运行。如果我们需要设置[n m]时间段之内是否喂狗的话则需要使用过窗口看门狗。
编程
1 |
|
查看是否喂狗了
1 |
|
窗口看门狗
可以设置一个时间段,而不单单是在某个时间之前。独立看门狗是当计数寄存器中的值减到0的话就会产生复位信号。但是窗口是变成0x40
,而不是0
,这被称之为窗口的下限,这个是固定的。上限是可以更改的,只要在上下限之间喂狗了就不会复位。这就是为什么称之为“窗口”。所以窗口看门狗需要在窗口中间将计数器的值进行刷新,就不会产生复位。
RLR是重装载寄存器,用来设置独立看门狗的计数器的值。TR是窗口看门狗的计数器的值,由用户独立设置,WR是窗口看门狗的上窗口值,由用户独立设置。
窗口看门狗时钟
这个外设的时钟是由PCLK1提供的,PCLK1最大是36M,由RCC时钟控制器开启。
计数器时钟
我们知道看门狗实际上就是一个计数器构成的,那么计数器改变一次需要多久的时间?
计数器时钟由CK计时器时钟经过预分频器分频得到,分频系数由配置寄存器CFR的位8:7 WDGTB[1:0]配置,可以是[0,1,2,3],其中CK计 时器时钟=PCLK1/4096,除以4096是手册规定的,没有为什么。所以计数器的时钟CNT_CK=PCLK1/4096/(2^WDGTB),
这就可以算出计数器减一个数的时间T= 1/CNT_CK = PCLK1 * 4096 * (2^WDGTB)
。
这个WDGTB
是预分频数,可以是[0,1,2,3],后面会讲到一个设置预分频数的函数WWDG_SetPrescaler()
可以设置这个值,但是其参数是[1,2,4,8]这里我们将它们一一对应即可。
死前中断
窗口看门狗的计数器是一个递减计数器,共有7位,其值存在控制寄存器CR的位6:0,即T[6:0],当7个位全部为1时是0X7F,这个是最大值,当递减到T6位变成0时,即从0X40变为0X3F时候,会产生看门狗复位。这个值0X40是看门狗能够递减到的最小值,所以计数器的值只能是:0X40~0X7F之间,实际上真正用来计数的是T[5:0]。当递减计数器递减到0X40的时候,还不会马上产生复位,如果使能了提前唤醒中断:CFR位9 EWI 置1,则产生提前唤醒中断,如果真进入了这个中断的话,就说明程序肯定是出问题了。
那么在中断服务程序里面我们就需要做最重要的工作,比如保存重要数据,或者报警等,这个中断我们也叫它死前中断。
具体使用
上面我们知道,使用窗口看门狗的话必须要在窗口中间进行复位,不可以是窗口之前也不可以是窗口之后。
所以我们需要知道程序的具体执行时间,才好设置上窗口的值。
窗口看门狗函数
在标准库中提供了以下函数, 我们具体来说明每一个函数的作用.
1 |
|
实例
1 |
|
由上可以看到窗口看门狗在发生中断后可以留有一定的时间来让程序做好保存的工作,那么这个时间是多久这个是位WDGTB
来决定的。
具体的计算公式为;
- Twwdg:WWDG超时时间(单位为ms)
- Fpclk1:APB1的时钟频率(单位为Khz)
- WDGTB:WWDG的预分频系数
- T[5:0]:窗口看门狗的计数器低6位