目录
一,简介
1)STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然
有效。独立看门狗的时钟是一个内部 RC 时钟,所以并不是准确的 40Khz,而是
在 30~60Khz 之间的一个可变化的时钟,只是我们在估算的时候,以 40Khz 的频率来计算,看
门狗对时间的要求不是很精确,所以,时钟有些偏差。
2)在键寄存器(IWDG_KR)中写入 0xCCCC,开始启用独立看门狗(第一步,启动看门狗);
此时计数器开始从其复位值 0xFFF 递减计数。当计数器计数到末尾 0x000 时,会产生一个复位信号(IWDG_RESET)。
无论何时,只要键寄存器 IWDG_KR 中被写入 0xAAAA(称为喂狗), IWDG_RLR 中的值就会被重新加载到计数器中从而避免产生看门狗复位。
二,寄存器介绍
健值寄存器IWDG_KR 0~15位有效
预分频寄存器IWDG_PR 0~2位有效 (具有写保护功能)
重装载寄存器IWDG_RLR 0~11位有效(具有写保护功能)
状态寄存器IWDG_SR 0~1位有效
(IWDG_PR 和 IWDG_RLR 寄存器具有写保护功能。要修改这两个寄存器的值,必须先向
IWDG_KR 寄存器中写入 0x5555。 将其他值写入这个寄存器将会打乱操作顺序,寄存器将重新
被保护。重装载操作(即写入 0xAAAA)也会启动写保护功能。)
健值寄存器IWDG_KR
预分频寄存器IWDG_PR
重装载寄存器IWDG_RLR
状态寄存器IWDG_SR
三,溢出时间
Tout=((4× 2^prer) × rlr) /40
其中 Tout 为看门狗溢出时间(单位为 ms); prer 为看门狗时钟预分频值(IWDG_PR 值)范围为 0~7; rlr 为看门狗的重装载值(IWDG_RLR 的值);(注意,由于看门狗时钟不是准确值,所以不能太晚喂狗不然可能会复位!!!)
四,库函数部分
1)取消寄存器写保护(向 IWDG_KR 写入 0X5555)
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
2)设置独立看门狗的预分频系数和重装载值
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //设置 IWDG 预分频值
void IWDG_SetReload(uint16_t Reload); //设置 IWDG 重装载值
3)重载计数值喂狗(向 IWDG_KR 写入 0XAAAA)
IWDG_ReloadCounter(void); //按照 IWDG 重装载寄存器的值重装载 IWDG 计数器(喂狗)
4) 启动看门狗(向 IWDG_KR 写入 0XCCCC)
IWDG_Enable(); //使能 IWDG
注意 IWDG 在一旦启用,就不能再被关闭。想要关闭,只能重启。
五,实验部分
1)硬件部分
使用了指示灯 DS0 ,WK_UP按键和独立看门狗
需要 2 个 IO 口,一个用来输入喂狗信号,另外一个用来指示程序是否重启。WK_UP 键喂狗,DS0 来指示程序重启。
2)软件部分
a)工程文件
b)代码
IWDG.C
#include "IWDG.H"
void IWDG_Init(u8 prer,u16 rlr) //分频和重装载值
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
IWDG_SetPrescaler(prer);
IWDG_SetReload(rlr);
IWDG_ReloadCounter();//喂狗
IWDG_Enable();
}
IWDG.h
#ifndef __IWDG_H__
#define __IWDG_H__
#include "sys.h"
void IWDG_Init(u8 prer,u16 rlr);
#endif
main.c
#include "stm32f10x.h"
#include "delay.h"
#include "sys.h"
#include "key.h"
#include "LED.H"
#include "iwdg.h"
int main(void)
{
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //初始化与按键连接的硬件接口
delay_ms(200);
LED0=0; //点亮LED
IWDG_Init(4,625);
while(1){
if(KEY_Scan(0)==WKUP_PRES)
{
IWDG_ReloadCounter();
}
}
}