一、什么是看门狗?
看门狗本身是一个定时器,如果你在定时器完成之前未重置计时器的值那么它就会重启整个系统。但是我们
系统正常运行下并不希望他重启,所以就需要“喂狗“这个操作(即每次定时结束之前给定时器值重置)。
二、什么时候会用到看门狗?
假设我们将一些设备放在环境恶劣的情况下,如果设备出现了问题可能需要一个复位就好了,这时候人不可
能再去一次这种地方去复位它,这时候你要是开启了看门狗,但是由于系统故障并未及时喂狗,这时候看门
狗就会复位设备。
三、为什么需要关闭看门狗?
现在我们在人工使用这个设备当然不需要看门狗的这种在系统故障下自动复位的功能。
四、与看门狗相关的寄存器
WTCON:看门狗主要功能的设置,如开/关看门狗,使能中断,使能重启,设置时钟分频多少等等。
WTDAT:看门狗重载的计数值
WTCNT:看门狗当前的计数值
WTCLRINT:清中断,写1进去就是清除中断
五、WTDAT寄存器和WTCNT寄存器的关系:看门狗刚刚启动时,WTDAT的值是不会自动重载到WRCNT的
(这里WTDAT的值自动重载进WTCNT内是仅发生中断的情况下的,发生完中断后,WTDAT的值就会自动
重载进WTCNT内,然后WTCNT开始自动减一,开始下一次计时。不会发生在重启的原因是:重启时,断电,
一切寄存器内的值都不存在了,并且重启的是后也不需要自动重载,因为它又进过了一次初始化,用初始化
的值就可以了),因此,在启动看门狗之前,我们必须写一个初始值给WTCNT寄存器。
六、看门狗时钟分频的介绍
七、代码实现
void wdt_init_interrupt(void) { //首先,我们就设置预分频器(8~15),先清零,然后再设置值为66,因为时钟源是PCLK(66MHz)得到1MHz rWTCON &= ~(0xff<<8); rWTCON |= (65<<8); //然后设置分频器(3~4),先清零,然后设置值为128,得到周期是128us rWTCON &= ~(0x3<<3); rWTCON |= (0x3<<3); //然后就选择中断模式了(2),关闭复位模式(0) rWTCON |= (1<<2); rWTCON &= ~(1<<0); //设置计数值了,就设置为1.28s rWTDAT = 10000; rWTCNT = 10000; //最后,都设置好了,就开启看门狗定时器了(5) rWTCON |= (1<<5); } rWTCLRINT = 1;
还有喂狗操作
//清中断,这里是设置任意数就可以清零了 void feed_dog(void) { rWTCNT= 10000; }欢迎各位指出不足之处