江科大STM32入门——看门狗笔记整理
wx:嵌入式工程师成长日记
(一)简介
- WDG(Watchdog)看门狗
- 看门狗可以监控程序的运行状态,当程序因为设计漏洞(无法预料)、硬件故障、电磁干扰等原因,出现卡死或跑飞现象时,看门狗能及时复位程序避免程序陷入长时间的罢工状态,保证系统的可靠性和安全性
- 看门狗本质上是一个定时器,当指定时间范围内,程序没有执行喂狗(重置计数器)操作时,看门狗硬件电路就自动产生复位信号
- STM32内置两个看门狗
- 独立看门狗(IWDG):独立工作,对时间精度要求较高
- 窗口看门狗(WWDG):要求看门狗在精确计时窗口起作用
(二)IWDG框图
1、简介
定时器产生中断,看门狗产生复位。
2、IWDG键寄存器
- 键寄存器本质上是控制寄存器,用于控制硬件电路的工作
- 在可能存在干扰的情况下,一般通过在整个键寄存器写入特定值来代替控制寄存器写入一位的功能,以降低硬件电路受到干扰的概率(恶劣情况)
(三)IWDG超时时间
- 超时时间:TIWDG=TLSI x PR预分频系数 x (RL+1)
- 其中:TLSI =1/FLSI
注:超时时间40k输入时钟会在30~60kHz波动。
(四)WWDG框图
1、简介
【计数器部分最晚界限】如果把T6位看作计数器的一部分,那就是整个计数器值减到0x40之后溢出;而T6当成溢出标志位,低6位当作计数器,数值减到0之后溢出。
【复位信号】程序运行状态下始终保证T6位位1,这样才能避免复位。
【最早界限】首先写入一个最早时间界限计数值到W0~6中,写入WWDG_CR,就是喂狗,一旦它比较,我们当前的计数器T6:0>窗口之W6:0,比较结果就等于1,就可以去申请复位。
也就是为狗的时候,把当前计数值和预设窗口值进行比较,若余粮充足,喂得频繁,就有问题,就会复位。
2、WWDG工作特性
- 递减计数器T[6:0]的值小于0x40时,WDG产生复位
- 递减计数器T[6:0]在窗口W[6:0]外被重新装载时,WDG产生复位
- 递减计数器T[6:01等于0x40时可以产生早期唤醒中断(EWI),死前中断(马上就要溢出复位时,用来执行一些紧急操作,比如保存重要数据,关闭危险操作),用于重装载计数器以避免WWDG复位
- 定期写入WWDG CR寄存器(喂狗)以避免WWDG复位
刷新窗口可以喂狗。
3、WWDG超时时间计算
- 超时时间:TWWDG=TPCLK1x4096xWDGTB预分频系数 x(T[5:0]+ 1)
- 窗口时间:TWIN =TPCLK1x 4096 x WDGTB预分频系数 x(T[5:0] - W[5:0])
- 其中:TPCLK1=1/FPCLK1
但是在使用窗口看门狗的时候需要注意写入WWDG_CR 寄存器时,始终将 1 写入 T6 位,以避免生成立即复位。
(五)IWDG和WWDG对比
窗口看门狗号称警犬,它也有一个递减计数器不断的往下递减计数,当减到一个固定值0x40时还不喂狗的话,就会产生复位,这个值叫窗口的下限,是固定值,不能改变。不同的是,窗口看门狗的计数器在减到某一个数之前喂狗也会产生复位,这个值叫窗口的上限,上限值由用户独立设置。窗口看门狗计数器的值必须在上窗口和下窗口之间才可以喂狗
独立看门狗号称宠物狗,它有一个12位的递减计数器,当计数器的值从某个值一直减到0的时候,系统就会产生一个复位信号,即IWDG_RESET。如果在计数器没有减到0之前,刷新了计数器的值,那么就不会产生复位信号,这个动作就是我们经常说的喂狗。
键寄存器
键寄存器本质上是控制寄存器,用于控制硬件电路的工作在可能存在干扰的情况下,一般通过在整个键寄存器写入特定值来代替控制寄存器写入一位的功能,以降低硬件电路受到干扰的概率
(六)程序代码配置
独立看门狗:
//解除写保护
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
//配置预分频与重装值
IWDG_SetPrescaler(IWDG_Prescaler_16);
IWDG_SetReload(2499); //喂狗时间设置为:1000ms
//喂狗
IWDG_ReloadCounter(); //重装的值就是2499
//启动看门狗
IWDG_Enable();
窗口看门狗
需使用的库函数:
void RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // WWDG 时钟使能
void WWDG_SetWindowValue(uint8_t WindowValue);//设置窗口值的函数
void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);//设置分频数的函数
void WWDG_EnableIT(); //开启窗口看门狗中断
void WWDG_Enable(uint8_t Counter);//设置计数器初始值并使能看门狗
//第二步:配置预分频器与窗口值
WWDG_SetPrescaler(WWDG_Prescaler_8);
WWDG_SetWindowValue(0x40|21); //30~50ms
//第三步:写入控制器CR,控制寄存器包括:看门狗使能位、计数器溢出位、计数器有效位。
WWDG_Enable(0x40|54);//或上0x40
WWDG_SetCounter(0x40|54); //喂狗