WWDG
Window watchdog,窗口看门狗。
本质:能产生系统复位信号和提前唤醒中断的计数器。
- 递减的计数器
- 当递减计数器值从0x40减到0x3F时复位(从64减到63)(即T6位跳变到0)
- 当计数器的值大于W[6:0]值时喂狗会复位
- 提前唤醒中断(EWI):当递减计数器减到0x40时可产生中断
- 喂狗:在窗口期内重装载计数器的值,防止复位。
作用:用于监测单片机程序运行时效是否精准,主要检测软件异常。
应用:需要精准监测程序运行时间的场合。
WWDG工作原理
- 计数器最大初始值为:127(0x7f)
- 在计数器初始值~窗口上限值这一区间(非窗口期)喂狗,会产生复位,所以只能减。
- 减到64(固定值)时,可产生中断。
- 减到63(固定值),窗口下限值,产生复位。
- 窗口上限值到窗口下限值这一区间,称为窗口期,可以喂狗,不会产生复位。
W[6:0]≥窗口期>0x3F
窗口上限值W[6:0]必须大于窗口下限值63,否则无窗口期,系统一直复位。
时钟源:
F103:PCLK1(36MHz)
F407:PCLK1(42MHz)
F429:PCLK1(45MHz)
F767:PCLK1(54MHz)
H743:PCLK3(100MHz)
WWDG寄存器
控制寄存器(WWDG_CR)
用于使能窗口看门狗,以及重装载计数器值(即喂狗,直接写寄存器即可)。
配置寄存器(WWDG_CFR)
使能窗口看门狗提前唤醒中断,设置预分频系数,设置窗口上限值。
状态寄存器(WWDG_SR)
用于判断是否发生了WWDG提前唤醒中断。
WWDG超时时间计算
Tout是WWDG超时时间(没喂狗)
Fwwdg是WWDG的时钟源频率
4096是WWDG固定的预分频系数
2^WDGTB是WWDG_CFR寄存器设置的预分频系数值
T[5:0]是WWDG计数器低6位
WWDG配置步骤
- WWDG工作参数初始化:HAL_WWDG_Init()
- WWDG Msp初始化:HAL_WWDG_MspInit(),配置NVIC、CLOCK等
- 设置优先级,使能中断:HAL_NVIC_SertPriority()、HAL_NVIC_EnableIRQ()
- 编写中断服务函数WWDG_IRQHandler()->HAL_WWDG_IRQHandler()
- 重定义提前唤醒回调函数HAL_WWDG_EarlyWakeupCallback()
- 在窗口期内喂狗HAL_WWDG_Refresh()
typedef struct
{
uint32_t Prescaler; //预分频系数
uint32_t Window;//窗口上限值
uint32_t Counter; //计数值
uint32_t EWIMode;//提前唤醒中断使能
}WWDG_InitTypeDef;
typedef struct
{
WWDG_TypeDef *Instance; //WWDG寄存器基地址
WWDG_InitTypeDef Init; //WWDG初始化参数
}WWDG_HandleTypeDef;
验证窗口看门狗功能
预设:计数器值0x7F(127),窗口值0x5F(95),预分频系数为8。
- 初始化窗口看门狗后29.13ms内不能喂狗,否则自动复位。
- 初始化窗口看门狗后过了58.25ms还没有喂狗,就会自动复位。