首先讲一下独立看门狗和窗口看门狗之间的区别。
独立看门狗Iwdg——独立于系统之外,因为有独立时钟,一般是外部低速时钟。主要用于监视硬件错误。
窗口看门狗wwdg——系统内部的故障探测器,采用内部RCC时钟,时钟与系统相同。如果系统时钟不走了,这个狗也就失去作用了。主要用于监视软件错误
1)独立看门狗没有中断,窗口看门狗有中断
2)独立看门狗有硬件软件之分,窗口看门狗只能软件控制
3)独立看门狗只有下限,窗口看门狗又下限和上限
4)独立看门狗是12位递减的。窗口看门狗是7位递减的
5)独立看门狗是用的内部的大约40KHZ RC振荡器(不受系统时钟限制,即使系统时钟坏了也能工作),窗口看门狗是用的系统时钟APB1ENR(系统时钟要是挂了就完了)
总结起来的区别点大致有如下几点
1:时钟软不同
2:是否产生中断
3:监视功能分工不同
4:喂狗限制不同
接下来我们一起看一下窗口看门狗的相关内容。
1:简介
窗口看门狗通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在 T6 位变成 0 前被刷新,看门狗电路在 达到预置的时间周期时,会产生一个 MCU 复位。如果在递减计数器达到窗口寄存器值之前 刷新控制寄存器中的 7 位递减计数器值,也会产生 MCU 复位。这意味着必须在限定的时间 窗口内刷新计数器。
2:主要特性
● 可编程的自由运行递减计数器
● 复位条件
— 当递减计数器值小于 0x40 时复位(如果看门狗已激活)
— 在窗口之外重载递减计数器时复位(如果看门狗已激活)
● 提前唤醒中断 (EWI):当递减计数器等于 0x40 时触发(如果已使能且看门狗已激活)
3:功能说明
如果激活看门狗(WWDG_CR 寄存器中的 WDGA 位置 1),则当 7 位递减计数器(T[6:0] 位)从 0x40 滚动到 0x3F(T6 已清零)时会引发复位。当计数器值大于窗口寄存器中所存 储的值时,如果软件重载计数器,则会产生复位。
应用程序在正常运行过程中必须定期地写入 WWDG_CR 寄存器以防止 MCU 发生复位。只 有当计数器值低于窗口寄存器值时,才能执行此操作。存储在 WWDG_CR 寄存器中的值必 须介于 0xFF 和 0xC0 之间。在系统复位后,看门狗总是处于关闭状态。可通过设置 WWDG_CR 寄存器中的 WDGA 位 来使能看门狗,之后除非执行复位操作,否则不能再次关闭。
递减计数器处于自由运行状态:即使禁止看门狗,递减计数器仍继续递减计数。当使能看门狗时,必须将 T6 位置 1,以防止立即复位。T[5:0] 位包含了看门狗产生复位之前的计时数目;复位前的延时时间在一个最小值和一个最大 值之间变化,这是因为写入 WWDG_CR 寄存器时,预分频值是未知的。配 置寄存器 (WWDG_CFR) 包含窗口的上限:为防止发生复位
如果在产生实际复位之前必须执行特定的安全操作或数据记录,则可使用提前唤醒中断(EWI)。通过设置 WWDG_CFR 寄存器中的 EWI 位使能 EWI 中断。当递减计数器的值为0x40 时,将生成 EWI 中断。在复位器件之前,可以使用相应的中断服务程序 (ISR) 来触发特定操作(例如通信或数据记录)。在某些应用中,可以使用 EWI 中断来管理软件系统检查和/或系统恢复/功能退化,而不会生 成 WWDG 复位。在这种情况下,相应的中断服务程序 (ISR) 可用来重载 WWDG 计数器以 避免 WWDG 复位,然后再触发所需操作。通过将 0 写入 WWDG_SR 寄存器中的 EWIF 位来清除 EWI 中断。
上图中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=45Mhz,那么可以得到最小-最大超时时间表如表 11.1.1 所示
4:寄存器描述
可以看出,这里我们的 WWDG_CR 只有低八位有效,T[6:0]用来存储看门狗的计数器值,随时更新的,每个窗口看门狗计数周期(4096×2^ WDGTB)减 1。当该计数器的值从 0X40 变为 0X3F 的时候,将产生看门狗复位。WDGA 位则是看门狗的激活位,该位由软件置 1,以启动看门狗,并且一定要注意的是该位一旦设置,就只能在硬件复位后才能清零了。
窗口看门狗的第二个寄存器是配置寄存器(WWDG_CFR),该寄存器的各位及其描述如下图所示
该位中的 EWI 是提前唤醒中断,也就是在快要产生复位的前一段时间(T[6:0]=0X40)来提醒我们,需要进行喂狗了,否则将复位!因此,我们一般用该位来设置中断,当窗口看门狗的计数器值减到 0X40 的时候,如果该位设置,并开启了中断,则会产生中断,我们可以在中断里面向 WWDG_CR 重新写入计数器的值,来达到喂狗的目的。注意这里在进入中断后,必须在不大于 1 个窗口看门狗计数周期的时间(在 PCLK1 频率为 42M 且 WDGTB 为 0 的条件下,该时间为 97.52us)内重新写 WWDG_CR,否则,看门狗将产生复位!
最后我们要介绍的是状态寄存器(WWDG_SR),该寄存器用来记录当前是否有提前唤醒的标志。该寄存器仅有位 0 有效,其他都是保留位。当计数器值达到 40h 时,此位由硬件置 1。它必须通过软件写 0 来清除。对此位写 1 无效。即使中断未被使能,在计数器的值达到 0X40的时候,此位也会被置 1。
最后附上相关代码
WWDG_HandleTypeDef WWDG_Handler; //窗口看门狗句柄
//保存WWDG计数器的设置值,默认为最大
u8 WWDG_CNT=0X7F;
//初始化窗口看门狗
//tr :T[6:0],计数器值
//wr :W[6:0],窗口值
//fprer:分频系数(WDGTB),仅最低2位有效
//Fwwdg=PCLK1/(4096*2^fprer). 一般PCLK1=45Mhz
void WWDG_Init(u8 tr,u8 wr,u32 fprer)
{
WWDG_Handler.Instance=WWDG;
WWDG_Handler.Init.Prescaler=fprer; //设置分频系数
WWDG_Handler.Init.Window=wr; //设置窗口值
WWDG_Handler.Init.Counter=tr; //设置计数器值
HAL_WWDG_Init(&WWDG_Handler); //初始化WWDG
HAL_WWDG_Start_IT(&WWDG_Handler); //开启窗口看门狗
}
//WWDG底层驱动,时钟配置,中断配置
//此函数会被HAL_WWDG_Init()调用
//hwwdg:窗口看门狗句柄
void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg)
{
__HAL_RCC_WWDG_CLK_ENABLE(); //使能窗口看门狗时钟
HAL_NVIC_SetPriority(WWDG_IRQn,2,3); //抢占优先级2,子优先级为3
HAL_NVIC_EnableIRQ(WWDG_IRQn); //使能窗口看门狗中断
}
//窗口看门狗中断服务函数
void WWDG_IRQHandler(void)
{
HAL_WWDG_IRQHandler(&WWDG_Handler);//调用WWDG共用中断处理函数
}
//中断服务函数处理过程
//此函数会被HAL_WWDG_IRQHandler()调用
void HAL_WWDG_WakeupCallback(WWDG_HandleTypeDef* hwwdg)
{
HAL_WWDG_Refresh(&WWDG_Handler,WWDG_CNT);//更新窗口看门狗值
LED1=!LED1;
}