窗口看门狗
1.窗口看门狗(WWDG):通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。
2.窗口看门狗工作示意图:
T[6:0]就是窗口看门狗的计数器,而 W[6:0]则是窗口看门狗的上窗口,下窗口值是固定的(0X40)。当窗口看门狗的计数器在上窗口值之外被刷新,或者低于下窗口值都会产生复位。上窗口值是自己设定的,根据实际要求来设计窗口值,但是一定要确保窗口值大于0X40。
工作框架:
1.窗口看门狗的必要性
在跑乱的程序正好执行了刷新看门狗的操作,这种情况下独立看门狗检测不出来。而窗口看门狗保证了不会提前或滞后刷新看门狗,即可检测出程序是否非正常跳过某些程序段。
2.相关寄存器
1.控制寄存器(WWDG_CR)
2.配置寄存器(WWDG_CFR)
3.状态寄存器(WWDG_SR)
3.窗口看门狗配置过程:
- 使能看门狗时钟:RCC_APB1PeriphClockCmd();
- 设置分频系数:WWDG_SetPrescaler();
- 设置上窗口值:WWDG_SetWindowValue();
- 开启提前唤醒中断并分组:WWDG_EnableIT();NVIC_Init();
- 使能看门狗:WWDG_Enable();
- 喂狗:WWDG_SetCounter();
- 编写中断服务函数:WWDG_IRQHandler();
实例:
void WWDG_Init(u8 tr,u8 wr,u32 fprer)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);//WWDG时钟使能
WWDG_SetPrescaler(fprer);设置IWDG预分频值
WWDG_SetWindowValue(wr);//设置窗口值
WWDG_Enable(tr);//使能看门狗,设置 counter.
WWDG_ClearFlag();
WWDG_NVIC_Init();//初始化窗口看门狗 NVIC
WWDG_EnableIT();//开启窗口看门狗中断
}
void WWDG_Set_Counter(u8 cnt)//重设置WWDG计数器的值
{
WWDG_Enable(cnt);
}
void WWDG_NVIC_Init()
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=WWDG_IRQn;//WWDG中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占2,子优先级3,组2
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;//抢占2,子优先级3,组2
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);//NVIC初始化
}
void WWDG_IRQHandler(void)
{
WWDG_SetCounter(0x7F);//当禁掉此句后,窗口看门狗将产生复位
WWDG_ClearFlag();//清除提前唤醒中断标志位
LED1=!LED1;
}