【定义】
之所以称为窗口就是因为其喂狗时间是一个有上下限的范围内(窗口),你可以通过设定相关寄存器,设定其上限时间(下限固定)。喂狗的时间不能过早也不能过晚。
而独立看门狗限制喂狗时间在0-X内,X由相关寄存器决定。喂狗的时间不能过晚。
【窗口看门狗必要性】
对于一般的看门狗,程序可以在它产生复位前的任意时刻刷新看门狗,但这有一个隐患,有可能程序跑乱了又跑回到正常的地方,或跑乱的程序正好执行了刷新看门狗操作,这样的情况下一般的看门狗就检测不出来了;
如果使用窗口看门狗,程序员可以根据程序正常执行的时间设置刷新看门狗的一个时间窗口,保证不会提前刷新看门狗也不会滞后刷新看门狗,这样可以检测出程序没有按照正常的路径运行非正常地跳过了某些程序段的情况。
【窗口看门狗工作示意图】
T6位:40h二进制:01000000 ,3Fh二进制:00111111,即计数器从40h减到3Fh时,40h的第六位从1跳变为0(二进制的最低位为第0位)
【窗口看门狗内部逻辑】
- PCLK1 时钟过高,会先 / 4096,再进入预分频器,作为递减计数器的时钟。
- 计数器的值在CR寄存器中配置,T7位(WDGA)为启动位,使能串口看门狗。
- 【 当窗口看门狗打开( 即WDGA=1时 ),产生复位的两种方式 】
① 当计数器的值>上窗口值(该设定数值在WWDG_CFR寄存器定义)时,比较器为1,再去喂狗1,1&1=1 进入与比较器,与比较器出来为1 ,再进入或比较器,产生复位。
② 当计数器的值的T6位从1跳变为0时,进入非门运算器变为1,进入或比较器,产生复位。 - 如果启动了看门狗并且允许中断,当递减计数器等于0x40时可以产生早期唤醒中断(EWI),它可以用于喂狗以避免WWDG复位。
【窗口看门狗超时(喂狗)时间】
【注意事项】
- 上窗口值W[6:0]必须大于下窗口值0x40。否则就无窗口了。
- 窗口看门狗时钟来源PCLK1(APB1总线时钟)分频后。
【寄存器】
【配置寄存器WWDG_CFR】
void WWDG_EnableIT(void);//使能提前唤醒中断
void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);
void WWDG_SetWindowValue(uint8_t WindowValue);
【状态寄存器WWDG_SR】
FlagStatus WWDG_GetFlagStatus(void);
void WWDG_ClearFlag(void);
【状态寄存器WWDG_SR】
FlagStatus WWDG_GetFlagStatus(void);
void WWDG_ClearFlag(void);
【窗口看门狗配置过程】
① 使能看门狗时钟:
RCC_APB1PeriphClockCmd();
② 设置分频系数:
WWDG_SetPrescaler();
③ 设置上窗口值:
WWDG_SetWindowValue();
④ 开启提前唤醒中断并分组(可选):
WWDG_EnableIT();
NVIC_Init();
⑤ 使能看门狗:
WWDG_Enable();
⑥ 喂狗:
WWDG_SetCounter();
⑦编写中断服务函数
WWDG_IRQHandler();