STM32 独立看门狗与窗口看门狗
STM32内置两个看门狗:
独立看门狗:LSI驱动,主时钟故障任然有效;需要看门狗作为在主程序之外能够完全独立工作,并且对时间精度要求低的场合
窗口看门狗:APB1分频驱动;适合要求看门狗在精确计时窗口起作用的程序
PS:当程序跑飞,但看门狗程序正常运行,或者是跑飞时间短。在递减到0之前回复正常并正确喂狗时,独立看门狗无法检测到程序异常。所需要规定时间,即需 要窗口看门狗的设定
一:设置独立看门狗步骤:
1. 启动看门狗:键值寄存器(IWDG_KR)写入:0XCCCC
计数器从0XFFF递减;当为0X000时会产生复位信号IWDG_Reset
2.喂狗:键值寄存器(IWDG_KR)写入:0XAAAA
自动重装载寄存器(IWDG_RLR)会重新加载到计数器,从而避免复位
溢出时间计算:Tout=((4×2^prer) ×rlr) /40 (M3) prer:LSI分频系数 rlr:RLR寄存器设定值 //一个看门狗的时钟周期就是最短超时时间

代码实现步骤:
a. 取消寄存器写保护://(IWDG_PR)和(IWDG_RLR)寄存器具有写保护功能,不能正常写入
IWDG_WriteAccessCmd();
b. 设置独立看门狗的预分频系数,确定时钟:
IWDG_SetPrescaler();
c. 设置看门狗重装载值,确定溢出时间:
IWDG_SetReload();
d. 使能看门狗
IWDG_Enable();
e. 应用程序喂狗:
IWDG_ReloadCounter();
二:设置窗口看门狗
喂狗时间有上下限:上限可设置,下限固定0X3F(0X40产生早期唤醒中断EWI)

代码实现步骤:
a.使能看门狗时钟:
RCC_APB1PeriphClockCmd();//------>WWDG_CFR
b.设置分频系数:
WWDG_SetPrescaler();//------>WWDG_CFR
c.设置上窗口值:
WWDG_SetWindowValue();//------>WWDG_CFR
d.开启提前唤醒中断并分组(可选):
WWDG_EnableIT(); //------>WWDG_CFR
NVIC_Init();
e.使能看门狗:
WWDG_Enable();//------>WWDG_CR BYTE7
f.喂狗:
WWDG_SetCounter();//------>WWDG_CR BYTE6:0
g.编写中断服务函数
WWDG_IRQHandler();//------>WWDG_SR获取相关状态,喂狗

浙公网安备 33010602011771号