独立看门狗 IWDG

发布于:2024-04-18 ⋅ 阅读:(24) ⋅ 点赞:(0)

独立看门狗 IWDG介绍

什么是看门狗?

可以理解为对于一只狗的定时投喂,如果不给它吃东西就会狂叫,因此可以通过观察狗的状态来判断喂它的人有没有正常工作。

在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造
成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会
造成整个系统的陷入停滞状态,发生不可预料的后果, 所以出于对单片机运行状态进行实时监测
的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”
(watchdog) 。 独立看门狗工作在主程序之外,能够完全独立工作,它的时钟是专用的低速时钟 (LSI) ,由 VDD (VCC:C=circuit 表示电路的意思, 即接入电路的电压 (2)VDD:D=device 表示器件的意思, 即器件内部的工作电压 ) 电压供电, 在停止模式和待机模式下仍能工作。

独立看门狗本质

本质是一个 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可以说是独立看门狗的一个控制寄存器,主要有三种控制方式,往这个寄存器 写入下面三个不同的值有不同的效果。

 溢出时间计算公式:

计数一次,经过的时间就是PSC/fiwdg

Tout 单位为秒

f 是固定的,为40k赫兹

PSC 是通过预分频寄存器设置的,需要算

RLR 是通过重装载寄存器设置的,需要算

独立看门狗实验

需求

开启独立看门狗,溢出时间为1秒,使用按键1进行喂狗。

设置溢出时间

PSC = 64RLR = 625时,Tout为1秒不止这一种组合,只要能凑成1秒且符合寄存器限制的值都可以)(64*625/40=1000ms=1s)

CubeMX

1.常规配置

SYS->Debug->Serial Wire

RCC->High Speed Clock(HSE)->Crystal/Ceramic Resonator

时钟树HSE、PLLCLK打开,HCLK设置成72MHz

2.打开串口1,打开IWDG(独立看门狗),设置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_UART_Transmit(&huart1,"喂狗成功……\n",strlen("喂狗成功……\n"),100);
		}
		HAL_Delay(50);
  }
}
实现效果

串口助手中:

可见,没有写在WHILE(1)里的串口信息在一直显示,这说明由于没有喂狗,程序在不停的一直重启;此时如果能每秒按一下KEY1,串口就显示“喂狗成功”,程序会正常运行,但只要超过一秒没按按钮,看门狗就会使得程序重启。{由于用的是轮询法检测按键,所以按键会有抖动,故显示多次“喂狗成功”}