一、独立看门狗(IWDG)基本知识
1. IWDG简介
- 独立看门狗是由专门的低速总线进行驱动,即LSI总线(时钟频率40KHz),它可以在主时钟故障的情况下仍然可以工作。
- 独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。
2. IWDG功能描述
在键值寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗。此时计数器开始从其复位值0xFFF递减,当计数器值计数到尾值0x000时会产生一个复位信号(IWDG_RESET)。
无论何时,只要在键值寄存器IWDG_KR中写入0xAAAA(通常说的喂狗), 自动重装载寄存器IWDG_RLR中的值就会重新加载到计数器,从而避免产生看门狗复位。
如果程序异常,就无法正常喂狗,从而系统复位。
3. IWDG寄存器
STM32中文参考手册中关于IWDG寄存器的介绍如下:
4. IWDG超时时间
STM32中文参考手册中关于IWDG超时时间的介绍如下:
- 溢出时间计算: Tout=((4*2^prer)*rlr)/40 (ms)
- prer:预分频系数:0~7(只有低3位有效),由预分频寄存器(IWDG_PR)设置。
- rlr:重装载寄存器(IWDG_RLR)值(低11位有效)。
二、独立看门狗(IWDG)程序实现
1. IWDG相关库函数
void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);//取消写保护:0x5555使能
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //设置预分频系数:写PR
void IWDG_SetReload(uint16_t Reload); //设置重装载值:写RLR
void IWDG_ReloadCounter(void); //喂狗:写0xAAAA到KR
void IWDG_Enable(void); //使能看门狗:写0xCCCC到KR
2. IWDG控制程序
iwdg.h
#ifndef __IWDG_H
#define __IWDG_H
#include "stm32f10x.h"
void IWDG_Init(u8 prer,u16 rlr) ;
void IWDG_Feed(void);
#endif
iwdg.c
#include "iwdg.h"
/*******************************************************************************
* 函 数 名 : IWDG_Init
* 函数功能 : IWDG初始化
* 输 入 : pre:预分频系数(0-6)
rlr:重装载值(12位范围0xfff)
独立看门狗复位时间计算公式:t=(4*2^pre*rlr)/40 (ms)
* 输 出 : 无
*******************************************************************************/
void IWDG_Init(u8 prer,u16 rlr)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能对寄存器IWDG_PR和IWDG_RLR的写操作,即取消写保护
IWDG_SetPrescaler(prer); //设置IWDG预分频值
IWDG_SetReload(rlr); //设置IWDG重装载值
IWDG_ReloadCounter(); //按照IWDG重装载寄存器的值重装载IWDG计数器
IWDG_Enable(); //使能IWDG
}
//喂独立看门狗
void IWDG_Feed(void)
{
IWDG_ReloadCounter();//重装载初值
}
main.c
#include "stm32f10x.h"
#include "iwdg.h"
int main()
{
/**
其它初始化省略
**/
IWDG_Init(IWDG_Prescaler_64,625); //独立看门狗初始化,超时时间1s
while(1)
{
/**
其它程序省略
如果其中程序的运行时间超过1s,需要在其中添加喂看门狗函数 IWDG_Feed();
**/
IWDG_Feed(); //喂看门狗
}
}