窗口看门狗一般用于监测,由外部干扰或者不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。
在IWDG中,如果程序正在运行的时候,被人揍了一拳把程序打懵了,IWDG就会过来让程序扶起来继续运行。但是如果程序运行的时候,被人揍了一拳,然后这个人又把程序扶起来继续运行。把程序和IWDG整不会了怎么办?
这时候就要用到WWDG,WWDG是怎么应对的?举个例子,家长让小明准时回家,不准早退,不准出去玩,但是又考虑到有时候会有下雨,堵车之类的意外事情发生,就规定小明6点30到6点45之间到家,如果6点30之前到家,代表小明早退!没上完课,如果6点45之后到家,代表小明偷偷出去玩了!
程序也是一样的,执行的时间有一个限制,最早多久,最晚多久,不在这个范围内,就是程序跑偏了。
Refresh not allowed:不允许刷新。
Refresh Window:刷新窗口。
Reset:复位。
在不允许刷新的时候,去喂狗会产生复位。
Watchdog Configuration Register:看门狗配置计时器。
CMP:比较器。
Watchdog Control Register:看门狗控制寄存器。
6-bit downcounter:6位递减计时器。
WDG prescaler:看门狗预分频器。
WWDG_CFR(看门狗配置寄存器)就是上一张图的W[6:0](上窗口值),当WWDG_CR(看门狗控制寄存器)在被递减计数器递减时,会一直和上窗口值比较。当你的计数器T[6:0]大于上窗口值W[6:0]时 结果comparator = 1。把comparator和WWDG_CR一起进入一个与门,只有两路输入都为1的时候,与门才输出1。把与门的值和T6的取反的值放入或门,把或门和WDGA的值放入新的与门中,最后确认要不要复位。
结论:
1.当计数器的值大于上窗口的值的时候,如果此时尝试去喂狗,将立刻产生CPU复位。
2.当递减计数器T[6:0]到达下线窗口0x3F的值时,会立刻触发CPU复位。
bsp_wwdg.c
#include "bsp_wwdg.h"
unsigned char WWDG_CNT = 0x7F;
void WWDG_NVIC_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void WWDG_Configuration(unsigned char tr, unsigned char wr, unsigned int pr)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
WWDG_CNT = tr & WWDG_CNT;
WWDG_SetPrescaler(pr);
WWDG_SetWindowValue(wr);
WWDG_Enable(WWDG_CNT);
WWDG_NVIC_Init();
WWDG_ClearFlag();
WWDG_EnableIT();
}
bsp_wwdg.h
#ifndef __BSP_WWDG_H__
#define __BSP_WWDG_H__
#include "stm32f10x.h"
extern unsigned char WWDG_CNT;
void WWDG_Configuration(unsigned char tr, unsigned char wr, unsigned int pr);
#endif