独立看门狗介绍
Q:什么是看门狗?
A:可以理解为对于一只修勾的定时投喂,如果不给它吃东西就会狂叫,因此可以通过观察修勾的状态来判断喂它的人有没有正常工作。
在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造 成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会 造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测 的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗” (watchdog) 。 独立看门狗工作在主程序之外,能够完全独立工作,它的时钟是专用的低速时钟(LSI),由 VDD 电压供电, 在停止模式和待机模式下仍能工作。
独立看门狗本质
本质是一个 12 位的递减计数器,当计数器的值从某个值一直减到0的时候,系统就会产生一个复 位信号,即 IWDG_RESET 。
如果在计数没减到0之前,刷新了计数器的值的话,那么就不会产生复位信号,这个动作就是我们 经常说的喂狗。
独立看门狗框图
独立看门狗时钟
独立看门狗的时钟由独立的RC振荡器LSI提供,即使主时钟发生故障它仍然有效,非常独立。启用 IWDG后,LSI时钟会自动开启。LSI时钟频率并不精确,F1用40kHz。
LSI经过一个8位的预分频器得到计数器时钟。
预分频寄存器
低三位有效,因此可以组成8组分频组合
分频系数算法:
prer是IWDG_PR 的值;PSC就是就是预分频因子的值
比如IWDG_PR = 000,值为0,PSC=预分频因子=4*2^0=4*1=4
重装载寄存器
重装载寄存器是一个12位的寄存器,用于存放重装载值,低12位有效,即最大值为4096,这个值 的大小决定着独立看门狗的溢出时间。
键寄存器
键寄存器IWDG_KR可以说是独立看门狗的一个控制寄存器,主要有三种控制方式,往这个寄存器 写入下面三个不同的值有不同的效果。
溢出时间计算公式:
计数一次,经过的时间就是f/PSC
Tout 单位为秒
f 是固定的,为40k赫兹
PSC 是通过预分频寄存器设置的,需要算
RLR 是通过重装载寄存器设置的,需要算
独立看门狗实验
需求
开启独立看门狗,溢出时间为1秒,使用按键1进行喂狗。
设置溢出时间
将PSC = 64; RLR = 625时,Tout为1秒(不止这一种组合,只要能凑成1秒且符合寄存器限制的值都可以)
CubeMX
1. 惯例设置 + 配置按键的GPIO口 + 开一路串口
2. 点击左侧的“IWDG”,然后选择“Activated”
3. 在下侧设置PSC和RLR:
Keil
1. 在main.c中的main函数中,可以看到自动生成的 对于看门狗的初始化:
2. 写代码:
#include "string.h"
int main(void)
{
HAL_UART_Transmit(&huart1, "start start\r\n", strlen("start start\r\n"), 100);
while (1)
{
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET){
HAL_IWDG_Refresh(&hiwdg); //喂狗
}
HAL_Delay(50);
}
}
实现效果
串口助手中:
可见,没有写在WHILE(1)里的串口信息在一直显示,这说明由于没有喂狗,程序在不停的一直重启;此时如果能每秒按一下KEY1,串口就不会再有信息,程序会正常运行,但只要超过一秒没按按钮,看门狗就会使得程序重启。