1.关于看门狗,本质上可以把它叫做,设备复位定时器。
设置好频率之后,执行语句后,定时器会在启动一定时间之后,让设备复位。设备复位后重新从main函数开始执行,再次执行到寄存器配置语句后,过一段时间设备会重新复位。
2.看门狗测试函数是一个T0中断延时函数修改的,关于这个T0延时函数,我们这里复习一下,设备的主频是35MHz,周期是1/35000000s,计时器每过一个周期就会加一,累加时间达到1ms之后就会进入interrupt 1中断,
val ++;
if(val == 1000)
每次结果1ms进入函数后加1,进入1000次之后1*1000ms = 1s,然后对LED_RED翻转。
3.关于看门狗寄存器
WDT_CONTR = 0x27; //使能看门狗寄存器,定时2.87s后复位
我们这里使能看门狗,将B5位使能。最后3位设置定时复位的时间,计算公式是
延时时间 = 12 * 32768 *(2的8次方)/ 35000000 ≈ 2.87 s
即2.87s后看门狗溢出,设备复位。
4.在断函数中有个这个 WDT_CONTR |= 0x10;
这个是标志清0操作,置1清0.(置1将定时器进行清0,这。。。。。有点别扭啊)
我们管这个叫做对看门狗进行喂狗操作,如果我们的设备跑飞或者卡死了,看门狗没有喂,它就会把我们的设备进行重启。(不给糖,就要闹,哈哈)
5.关于这个函数
①没有注释掉喂狗语句,程序会一直喂狗,程序会正常运行,绿灯只有在刚上电时才会亮一下。后面会一直执行while(1)循环,绿灯命令不会被执行到
② 注释掉喂狗语句后,到了喂狗时间没有喂狗就会重启,所以会看到绿灯在闪,红灯才开始交替一次,就重启了。每次重启后又开始从main开始执行,绿灯命令会被执行到
#include "delay.h"
#include " intrins.h"
#define LED_RED P05
#define LED_YELLOW P06
sbit LED_GREEN = P0^7 ;
void T0_Lsr(void) interrupt 1
{
static unsigned int val;
val ++;
if(val == 1000)
{
LED_RED = ! LED_RED;
val = 0;
WDT_CONTR |= 0x10; //注释掉就不会喂狗,设备会反复重启。
}
}
void Timer0_Init(void)
{
TMOD = 0x00;//配置工作模式
AUXR |= 0x80; //工作时钟不分频
TL0 = 0x48;
TH0 = 0x77;
TR0 = 1; //启动定时器0计数
ET0 = 1; //使能定时器0中断
EA = 1; //打开总中断
}
void main(void)
{
P0M0 = 0x00;
P0M1 = 0x00;
Timer0_Init();
WDT_CONTR = 0x27; //使能看门狗寄存器,定时2.87s后复位
while(1)
{
}
}