WDG(Watchdog)看门狗
- 看门狗可以监控程序的运行状态,当程序因为设计漏洞、硬件故障、电磁干扰等原因,出现卡死或跑飞现象时,看门狗能及时复位程序,避免程序陷入长时间的罢工状态,保证系统的可靠性和安全性
- 看门狗本质上是一个定时器,当指定时间范围内,程序没有执行喂狗(重置计数器)操作时,看门狗硬件电路就自动产生复位信号
- STM32内置两个看门狗
独立看门狗(IWDG):
- 独立工作:就是独立看门狗的专用LSI(内部低速时钟)
- 对时间精度要求较低:独立看门狗只有一个最晚时间期限
窗口看门狗(WWDG):
- 要求看门狗在精确计时窗口起作用:意思是喂狗的时间有个最晚的界限也有个最早的界限,必须在这个界限内喂狗
- 窗口看门狗用的是APB1时钟,没有专用时钟,所以不算独立工作
IWDG框图:
输入时钟:LSI,内部低速时钟。频率为40KHz
预分频器:八位(256分频)
预分频寄存器(IWDG_PR):可以配置分频系数。
12位递减计数器:最大值40s95,自减到0时产生复位
键寄存器:
- 键寄存器本质上是控制寄存器,用于控制硬件电路的工作
- 在可能存在干扰的情况下,一般通过在整个键寄存器写入特定值来代替控制寄存器写入一位的功能,以降低硬件电路受到干扰的概率
IWDG超时时间(定时器的溢出时间):
- 超时时间:
TIWDG = TLSI × PR预分频系数 × (RL (重装值(最大4095))+ 1)
- 其中:TLSI = 1 / FLSI..
WWDG(窗口看门狗)
时钟源:PCLK1(36MHz)
递减寄计数器和CR控制寄存器合二为一了。窗口看门狗没有重装寄存器。
看门狗配置寄存器(WWDG_CR):就是喂狗的最早时间界限
工作流程:
先从PCLK1(36MHz)进来,先经过一个预分频器进行分频,这个和独立看门狗的预分频器,定时器的预分频值都是一个作用,就是灵活地调节后面计数器的时钟频率,同时预分频系数也是计算计数器溢出时间的重要参数。
然后经过递减计数器,每来一个脉冲就自减一次,在图中有T6~T0一共七位,但是实际只有六位是有效位,最高位T6用来当做溢出标志位,由1变为0(或自减到0)表示计数器溢出。
就是如果把T6位看做计数器的一部分,那减到0X40之后就溢出了,但如果把T6位当初溢出标志位,那就是低六位数字减到0之后溢出。
左边的复位信号输出部分:
WDGA,窗口看门狗的激活位(使能),WDGA写1,启用窗口看门狗,使能位作用于这个与门
然后与门的右边用或门连接,也就是与门两个来源任意来一个,都可以复位,其中下面的一位来自于T6
WWDG工作特性:
- 递减计数器T[6:0]的值小于0x40时,WWDG产生复位
- 递减计数器T[6:0]在窗口W[6:0]外被重新装载时,WWDG产生复位
- 递减计数器T[6:0]等于0x40时可以产生早期唤醒中断(EWI),用于重装载计数器以避免WWDG复位
- 定期写入WWDG_CR寄存器(喂狗)以避免WWDG复位
WWDG超时时间:
- 超时时间(喂狗最晚时间):
TWWDG = TPCLK1 × 4096 × WDGTB预分频系数 × (T[5:0] + 1)
- 窗口时间(喂狗最早时间):
TWIN = TPCLK1 × 4096 × WDGTB预分频系数 × ( T[5:0] - W[5:0](这里是计数器减到窗口值的时间))
- 其中:TPCLK1 = 1 / FPCLK1
IWDG和WWDG对比:
看门狗函数的配置:
- 开启时钟:开启LSI时钟,不过LSI不用我们写代码
配置,具体可在手册6-2-9里有说明。
2. 写入0x5555这个键值解除写保护
3. 配置预分频器和重装寄存器,就是写入预分频和重装值。
具体参数给多少可以在上面的IWDG超时时间来计算。
4. 写入键值0xcccc来启用独立看门狗
注:在主函数里可以写入键值0xAAAA来执行喂狗操作,就是将IWDG_RLR中的值重新加载到计数器。
独立/窗口看门狗的库函数:
7. FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG);
8. void RCC_ClearFlag(void);
- 写使能控制;其中参数有enable(对应0x5555(解除写保护))和disable(0x0000(除了上面的固定几个值其他都是开启写保护)) ,
- 配置预分频器,就是写PR寄存器
- 配置重装值,就是写RLR寄存器
- 重新装载寄存器,就是喂狗
- 启动独立看门狗
- 获取标志位状态
- 查看标志位,这个函数主要查看其中的独立、窗口看门狗复位。
- 清除标志位
窗口看门狗(WWDG) 库函数:
- 恢复缺省配置.
- 写入预分频器
- 写入窗口值
- 使能中断,IT是中断
- 写入计数器(喂狗就是用这个参数)
- 使能窗口看门狗;
- 获取标志位
- 清除标志位