看门狗概述
看门狗定时器是一个计数器,其基本功能是发生软件问题及程序跑飞后使系统重新启动。看门狗正常启动时自动计数,程序定期将其复位清零,如果系统某处跑飞或者卡死,定时器溢出并进入中断,在定时器中断中执行复位操作,使系统恢复正常工作状态。
stm32有两个看门狗,独立看门狗和窗口看门狗,下面会较为详细地分别讲解两者。
独立看门狗
STM32 的独立看门狗由内部专门的 40Khz(因为使用的是内部RC时钟,所以并不是准确的40Khz) 低速时钟驱动,即使主时钟发生故障,它也仍然有效。其限制喂狗时间在0-x内,x由相关寄存器决定。喂狗的时间不能过晚。
独立看门狗主要用到下面几个寄存器:
键值寄存器 IWDG_KR 有效位0-15
预分频寄存器 IWDG_PR 有效位0-2 //具有写保护功能,要操作先取消写保护
重装载寄存器 IWDR_RLR 有效位0-11 //具有写保护功能,要操作先取消写保护
状态寄存器 IWDG_SR 有效位0-1 //读取一些看门狗的状态 重装载值更新,预分频值更新
下面放几个手册里的寄存器描述图(对描述图的理解能帮助我们明白如何使用库函数以及使用哪些)
键值寄存器IWDG_KR
预分频寄存器 IWDG_PR
重装载寄存器
独立看门狗溢出时间计算
Tout =(4*2^prer)*rlr / 40
具体怎么算如果还是没法理解的话可以看看这个博客,讲解的很详细:
stm32系列芯片独立看门狗(IWDG)溢出时间计算原理
独立看门狗操作步骤
取消寄存器写保护
设置独立看门狗的预分频系数,确定时钟
设置看门狗重装载值,确定溢出时间
使能看门狗
应用程序喂狗
程序示例:
iwdg.h文件
#ifndef __IWDG_H__
#define __IWDG_H__
#include "sys.h"
//看门狗初始化
void IWDG_Init(u8 prer, u16 value);
//喂狗
void IWDG_Feed(void);
#endif
iwdg.c文件
#include