1.关看门狗
(1)什么是看门狗?
看门狗就好像你家门口的一条狗,我们必须在规定的时间内去喂狗,如果经过了规定的时间,你还不去喂狗的话,它就会咬死你。
看门狗本质上是一个定时器,首先,你给看门狗设置好一段时间,然后看门狗就开始计时,CPU必须在这段时间过去之前重置看门狗内的时间,好让他重新计时,如果cpu不去重置看门狗内的时间的话,看门狗就会重启整个系统或者产生一个中断,当我们系统正常运行的时候,我们当然不希望重启系统啦,所以,我们就要喂狗(重置它里面的值)。
(2)看门狗的作用:监督,维护好系统,看系统是否正常运转。
在一些比较恶劣的环境的情况下,当我们的系统坏的时候,我们没有办法人工重启的时候,看门狗就可以帮助我们重启系统。因为,系统坏了,CPU就不会去喂狗,不喂狗,看门狗到了那个时间后,就会触发重启,系统就自动重启了。
(3)为什么要关看门狗?
因为现在我们人工用着这机器,当然不需要看门狗了,因为,系统崩溃了,我们会自己重启它,所以,我们现在需要关闭看门狗的功能。
(4)看门狗相关的寄存器
WTCON:看门狗主要功能的设置,如开/关看门狗,使能中断,使能重启,设置时钟分频多少等等。
WTDAT:看门狗重载的计数值
WTCNT:看门狗当前的计数值,看门狗计时时的当前值。
WTCLRINT:清中断,写1进去就清除中断
WTDAT寄存器和WTCNT寄存器的关系:看门狗刚开始启动的时候,WTDAT的值是不会自动重载到WTCNT的(这里WTDAT的值自动重载进WTCNT内是仅发生在中断的情况下的,发生完中断后,WTDAT的值就会自动重载进WTCNT内,然后WTCNT开始自动减1,开始下一次计时。不会发生在重启的原因是:重启的时候,断电,一切寄存器内的值都不存在了,并且重启的时候也不需要自动重载,因为它又经过了一次初始化,用初始化的值就可以了。),因此,在启动看门狗之前,我们必须写一个初始值给WTCNT寄存器。
(5)看门狗时钟分频的介绍
来源是PCLK(66MHz),经过一个预分频器,再经过一个MUX开关,就得到了看门狗的时钟频率了。
计算公式:
以下面代码为例:t_watchdog = 1/(66M/(65+1))/128) = 128us
(6)写相关寄存器的代码示例
1 void wdt_init_interrupt(void) 2 { 3 //首先,我们就设置预分频器(8~15),先清零,然后再设置值为66,因为时钟源是PCLK(66MHz)得到1MHz 4 rWTCON &= ~(0xff<<8); 5 rWTCON |= (65<<8); 6 7 //然后设置分频器(3~4),先清零,然后设置值为128,得到周期是128us 8 rWTCON &= ~(0x3<<3); 9 rWTCON |= (0x3<<3); 10 11 //然后就选择中断模式了(2),关闭复位模式(0) 12 rWTCON |= (1<<2); 13 rWTCON &= ~(1<<0); 14 15 //设置计数值了,就设置为1.28s 16 rWTDAT = 10000; 17 rWTCNT = 10000; 18 19 //最后,都设置好了,就开启看门狗定时器了(5) 20 rWTCON |= (1<<5); 21 } 22 rWTCLRINT = 1; //清中断,这里是设置任意数就可以清零了
还有喂狗的操作是写WTCNT寄存器的:
void feed_dog(void) { rWTCNT= 10000; }
参考来源:朱老师物联网大教程