一、看门狗(Watchdog)
看门狗可以监控程序的运行状态,当程序因为设计漏洞、硬件故障、电磁干扰 等原因,出现卡死或跑飞 现象时,看门狗能及时复位程序,避免程序陷入长时间的罢工状态,保证系统的可靠性和安全性
看门狗本质上是一个定时器,当指定时间范围内,程序没有执行喂狗(重置计数器)操作时,看门狗硬件电路就自动产生复位信号
STM32内置两个看门狗:
独立看门狗(IWDG):独立工作,对时间精度要求较低(LSI)
窗口看门狗(WWDG):要求看门狗在精确计时窗口起作用(APB1)
1.1 独立看门狗IWDG
在键寄存器(IWDG_KR) 中写入 0xCCCC,开始启用 独立看门狗;此时计数器开始 从其复位值
0xFFF递减计数 。当计数器计数到末尾 0x000 时,会产生一个复位信号 (IWDG_RESET) 。
无论何时,只要在键寄存器IWDG_KR 中写入 0xAAAA , IWDG_RLR 中的值就会被重新加载到计数器,从而避免产生看门狗复位 。
如果用户在 选择字节中启用了"硬件看门狗" 功能,在系统上电复位后,看门狗会 自动开始运
行 ;如果在计数器计数结束前,若软件没有向键寄存器写入相应的值,则系统会产生复位
正因为独立看梦狗处于VDD供电区,在任一低功耗模式下,仍能正常运行,所以也是待机模式唤醒条件之一
键寄存器:
键寄存器本质上是控制寄存器,用于控制硬件电路的工作
在可能存在干扰的情况下,一般通过在整个键寄存器写入特定值来代替控制寄存器写入一位的功能,以降低硬件电路受到干扰的概率
IWDG_PR和IWDG_RLR寄存器具有写保护功能 。要修改这两个寄存器的值,必须先向IWDG_KR寄存器中写入 0x5555
IWDG溢出时间:
超时时间:T(IWDG) = T(LSI )× PR预分频系数 × (RL + 1)
其中:T(LSI) = 1 / F(LSI)
1.2 窗口看梦狗 WWDG
当T6位看作计数器的一部分 ,当减到0x40之后溢出
当T6位看作标志位 ,低6位 的值减到0之后溢出
控制寄存器的T6位:为0时表示计数器溢出;为1时表示计数器没溢出
在程序运行时要始终保持T6位为1,这样才能避免复位
WWDG工作特性:
WWDG溢出时间:
1.3 区别
在系统复位后,看门狗总是处于关闭状态, 当开启看 门狗,随后它不能再被关闭,除非发生复位
二、看门狗配置
RCC_GetFlagStatus():可以查看是由看门狗复位还是上电复位
调用之后,需要软件清除标志位
2.1 独立看门狗配置
(1)开启LSI
对于时钟而言:如果独立看门狗已经由硬件选项或软件启动,LSI振荡器将被强制在打开状态 ,并且不能被关 闭。在LSI****振荡器稳定后,时钟供应给IWDG
(2)解除写保护
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //0x55,解除写保护
(3)配置预分频器和重装寄存器
IWDG_SetPrescaler(IWDG_Prescaler_16); //LSI的16分频
IWDG_SetReload(2499); //重装值
(4)喂狗:将重装值送到自减计数器中
IWDG_ReloadCounter(); //喂狗
(5)使能看门狗
IWDG_Enable();
2.2 窗口看门狗配置
(1)开启PCLK1(APB1)窗口看门狗的时钟
对于时钟而言:如果独立看门狗已经由硬件选项或软件启动,LSI振荡器将被强制在打开状态 ,并且不能被关 闭。在LSI****振荡器稳定后,时钟供应给IWDG
(2)配置预分频器和窗口值
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);
(3)配置控制寄存器(窗口看门狗使能位、计数器溢出标志位、计数器有效位)
WWDG_SetPrescaler(WWDG_Prescaler_8); //设置预分频系数
WWDG_SetWindowValue(0x40 | 21); //设置窗口值:30ms 0x40:W6位为1,与T6位保持一致
(4)使能看门狗:第一次使能顺便将值写入自减计数器中
WWDG_Enable(0x40 | 54); //0x40:T6位为1 50ms
定时喂狗:
WWDG_SetCounter(0x40 | 54); //30ms ~ 50ms
使能(第一喂狗)与下一次喂狗要处于设置的时间之内,不能相隔太近