1、独立看门狗的介绍
2、独立看门狗的使用
3、代码段
1、独立看门狗的介绍
独立看门狗利用系统内部的低速时钟提供机械周期,这个低速时钟与系统的工作时钟不是一个时钟,所以看门狗的运行和系统的运行是互不干扰的。独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然 有效。这里需要注意独立看门狗的时钟是一个内部 RC 时钟,所以并不是准确的 40Khz,而是 在 30~60Khz 之间的一个可变化的时钟,只是我们在估算的时候,以 40Khz 的频率来计算。看门狗的主要的作用是防止程序跑飞或者死机。具体工作原理是系统正常工作时会定时喂狗,就是会隔一段时间给相应的寄存器装入设定好的值,然后寄存器从给定的值开始计数,直至到0的时候产生一个复位信号,如果在计数到0之前,进行喂狗,则重新从指定的数开始计数。如果在计数到0的时候没有进行喂狗,则认为程序跑飞,产生一个复位的信号,让程序重新开始执行。
2、独立看门狗的使用
时间计算(大概):Tout=((4*2^prer)*rlr)/40 (ms).
?配置步骤
1、取消预分频计数器和重装载寄存器的写保护IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable)
2、设置预分频值 IWDG_SetPrescaler(prer) 这个prer是预分频系数,是一个形参。在主函数调用的时候传进来。
3、设置重装载值 IWDG_SetReload(rlr) 这个rlr是重装载值,也是一个形参,由主函数调用时传进来。
4、喂狗,IWDG_ReloadCounter() ,对DR寄存器写入0xaaaa
5、使能看门狗IWDG_Enable()
3、代码段
iwdg函数
#include "iwdg.h"
#include "sys.h"
void IWDG_Init(u8 prer,u16 rlr)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//取消寄存器写保护
IWDG_SetPrescaler(prer);//设置预分频系数
IWDG_SetReload(rlr);//设置重装载值
IWDG_ReloadCounter();//喂狗
IWDG_Enable();//使能独立看门狗
}
main函数
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "beep.h"
#include "iwdg.h"
int main(void)
{
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //初始化与按键连接的硬件接口
IWDG_Init(4,625);
delay_ms(500);
LED0=0; //先点亮红灯
while(1)
{
if(KEY_Scan(0)==KEY1_PRES)//得到键值
{
IWDG_ReloadCounter();
}
delay_ms(10);
}
}
|