目录
在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造 成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会 造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测 的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗” (watchdog)。
独立看门狗工作在主程序之外,能够完全独立工作,它的时钟是专用的低速时钟(LSI),由 VDD 电压供电, 在停止模式和待机模式下仍能工作。
本质是一个 12 位的递减计数器,当计数器的值从某个值一直减到0的时候,系统就会产生一个复 位信号,即 IWDG_RESET 。
如果在计数没减到0之前,刷新了计数器的值的话,那么就不会产生复位信号,这个动作就是我们 经常说的喂狗。
独立看门狗的时钟由独立的RC振荡器LSI提供,即使主时钟发生故障它仍然有效,非常独立。启用 IWDG后,LSI时钟会自动开启。LSI时钟频率并不精确,F1用40kHz。
LSI经过一个8位的预分频器得到计数器时钟。
分频系数算法:
prer是IWDG_PR 的值
重装载寄存器是一个12位的寄存器,用于存放重装载值,低12位有效,即最大值为4096,这个值 的大小决定着独立看门狗的溢出时间。
键寄存器IWDG_KR可以说是独立看门狗的一个控制寄存器,主要有三种控制方式,往这个寄存器 写入下面三个不同的值有不同的效果。
溢出时间计算公式:
实验需求:
开启独立看门狗,溢出时间为1秒,使用按键1进行喂狗,不定时喂狗程序重新启动,通过串口检验是否喂狗
硬件接线:
溢出时间计算:
编程实现思路:
打开cubemax
配置SYS:
配置RCC:
配置时钟:
配置IWDG:
配置串口和PA0引脚:
打开工程管理生成代码:
生成代码之后打开keil5,加入下部分代码:
- #include
-
- int main()
- {
- //串口发送函数
- HAL_UART_Transmit(&huart1, "程序重新启动\r\n", strlen("程序重新启动\r\n"), 100);
- while(1)
- {
- if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)
- HAL_IWDG_Refresh(&hiwdg);//喂狗函数
- HAL_Delay(50);
- }
- }
编译烧录代码,打开串口助手,按下key1键时,喂狗,不喂狗串口输出程序重新启动:
对比点 | 独立看门狗 | 窗口看门狗 |
时钟源 | 独立时钟,LSI (40KHz) ,不精确 | PCLK1或PCLK3,精确 |
复位条件 | 递减计数到0 | 窗口期外喂狗或减到0x3F |
中断 | 没有中断 | 计数值减到0x40可产生中断 |
递减计数器位数 | 12位(最大计数范围:4096~0) | 7位(最大计数范围:127~63) |
应用场合 | 防止程序跑飞,死循环,死机 | 检测程序时效,防止软件异常 |