目录
简介
一、窗口看门狗功能
二、窗口看门狗寄存器
三、窗口看门狗配置过程
四、窗口看门狗实验
简介
1、窗口看门狗(
WWDG
)通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序
背离正常的运行序列而产生的软件故障。除非递减计数器的值在
T6
位(
WWDG->CR
的第六位)
变成
0
前被刷新,看门狗电路在达到预置的时间周期时,会产生一个
MCU
复位。在递减计数
器达到窗口配置寄存器
(WWDG->CFR)
数值之前,如果
7
位的递减计数器数值
(
在控制寄存器中
)
被刷新,
那么也将产生一个
MCU
复位。这表明递减计数器需要在一个有限的时间窗口中被刷
新。
2、窗口看门狗?
之所以称为窗口就是因为其喂狗时间是一个有上下限的范围内(窗口),你可以通过设定相关寄存器,设定其上限时间(下限固定)。喂狗的时间不能过早也不能过晚。
而独立看门狗限制喂狗时间在0-x内,x由相关寄存器决定。喂狗的时间不能过晚。
T[6:0]
就是
WWDG_CR
的低七位,
W[6:0]
即是
WWDG->CFR
的低七位。
T[6:0]
就是窗口看门狗的计数器,而
W[6:0]
则是窗口看门狗的上窗口,下窗口值是固定的(
0X40
)。
当窗口看门狗的计数器在上窗口值之外被刷新,或者低于下窗口值都会产生复位。
上窗口值(
W[6:0]
)是由用户自己设定的,根据实际要求来设计窗口值,但是一定要确保
窗口值大于
0X40
,否则窗口就不存在了。
窗口看门狗的超时公式如下:
Twwdg=(4096
×
2^WDGTB
×
(T[5:0]+1)) /Fpclk1;
其中:
Twwdg
:
WWDG
超时时间(单位为
ms
)
Fpclk1
:
APB1
的时钟频率(单位为
Khz
)
WDGTB
:
WWDG
的预分频系数
T[5:0]
:窗口看门狗的计数器低
6
位
根据上面的公式,假设
Fpclk1=36Mhz
,那么可以得到最小
-
最大超时时间表如表
所
示:

一、窗口看门狗功能
1、窗口看门狗框图

2、窗口看门狗工作过程总结
STM32F的窗口看门狗中有一个7位的递减计数器T[6:0],它会
在出现下述2动情况之一时产生看门狗复位:
(1)、当喂狗的时候如果计数器的值大于某一设定数值W[6:1]时,此设定数值在WWDG CFR寄存器定义。
(2)、当计数器的数值从0x40减到0x3F时,【T6位跳变到0】。
如果启动了看门狗并且允许中断,当递减计数器等于0x40时产生早期唤醒中断(EWI)它可以用于喂狗以避免WWBG复位。
3、窗口看门狗超时时间

4、为什么要窗口看门狗?
对于一般的看门狗,程序可以在它产生复位前的任意时刻刷新看门狗,但这有一个隐患,有可能程序跑乱了又跑回到正常的地方,或跑乱的程序正好执行了刷新看门狗操作,这样的情况下一般的看闯狗就检测不出来;
如果使用窗回看门狗,程序员可以根据程序正常执行的时间设置刷新看门狗的一个时间窗口,保证不会提前刷新看门狗也不会滞后刷新看门狗,这样可以检测出程序没有按照正常的路径运行非正常地跳过了某些程序段的情况。
5、窗口看门狗的其他注意事项
(1)上窗口值W[6:0]必须大于下窗口值0x40,否则就无窗口了。
(2)窗口看门狗时钟来源PCLK1(APB1总线时钟)分频后。
二、窗口看门狗寄存器
1、控制寄存器

WWDG_CR
只有低八位有效,
T[6
:
0]
用来存储看门狗的计数器值, 随时更新的,每个窗口看门狗计数周期(4096×2^ WDGTB
)减
1
。当该计数器的值从
0X40
变 为 0X3F
的时候,将产生看门狗复位。
WDGA
位则是看门狗的激活位,该位由软件置
1
,以启动看门狗,并且一定要注意的是该 位一旦设置,就只能在硬件复位后才能清零了。
2、配置寄存器

该位中的
EWI
是提前唤醒中断,也就是在快要产生复位的前一段时间(
T[6:0]=0X40
)来 提醒我们,需要进行喂狗了,否则将复位!因此,我们一般用该位来设置中断,当窗口看门狗 的计数器值减到 0X40
的时候,如果该位设置,并开启了中断,则会产生中断,我们可以在中 断里面向 WWDG_CR
重新写入计数器的值,来达到喂狗的目的。注意这里在进入中断后,必 须在不大于 1
个窗口看门狗计数周期的时间(在
PCLK1
频率为
36M
且
WDGTB
为
0
的条件下, 该时间为 113us
)内重新写
WWDG_CR
,否则,看门狗将产生复位。
3、状态寄存器

状态寄存器(
WWDG_SR
),该寄存器用来记录当前是否有提前唤醒 的标志。该寄存器仅有位 0
有效,其他都是保留位。当计数器值达到
40h
时,此位由硬件置
1
。
它必须通过软件写
0
来清除。对此位写
1
无效。即使中断未被使能,在计数器的值达到 0X40的时候,此位也会被置
1
。
三、窗口看门狗配置过程
1、使能看门狗时钟:
RCC _APB1PeriphClockCmd();
2、设置分频系数:
WWDG_ SetPrescaler();
3、设置上窗口值:
WWDG_ SetWindowValue();
4、开启提前唤醒中断并分组(可选): WWDG _EnablelTO); Nvic Init();
5、使能看门狗:
WWDG Enable();
6、喂狗:
WWDG SetCounter();
7、编写中断服务函数
WWDG IRQHandler();
四、窗口看门狗实验
1、工程

2、main.c主函数

3、wdg.c函数

4、led.c函数
