前言
本期主要分享的内容是S3C2440平台下的看门狗定时器,它的作用主要是用于当由于噪声和出现系统错误引起的故障时,看门狗定时器会将电路复位;接下来带大家认真学习一下看门狗定时器;
一、WDT
1.1 特点
(1)带中断请求的普通内部定时器模式。
(2)当定时器计数值达到 0 时(超时)激活 128 个 PCLK 周期的内部复位信号。
在系统运行以后也就启动了看门狗的计数器,看门狗就开始自动计数,如果到了一定的时间还不去清看门狗,那么看门狗计数器就会溢出从而引起看门狗中断,造成系统复位。所以在使用有看门狗的芯片时要注意清看门狗。
1.2 WDT的操作流程
由上图可知,看门狗电路使用PCLK作为时钟源,先进行预分频(最大为255),在进行分频(16,32,64,128);
注意:一旦使能了看门狗定时器,看门狗定时器数据寄存器(WTDAT)的值不能被自动重载到定时计数器(WTCNT)中。由于这个原因,必须在看门狗定时器启动前写入一个初始值到看门狗定时器计数寄存器(WTCNT)中。
这里给出关于看门狗定时器的相关寄存器:
二、看门狗复位操作
下面给出使用WDT电路实现的喂狗操作,也就是在程序可能出现问题的地方后进行喂狗操作可以使得系统不进行复位,进而正常工作;
代码如下:
void wdt_init()
{
WTCNT = 1526*3; //设置3s(分频后的结果为50M/256/128 = 1256,以1256的速度把1256*3减为0需要3s)
WTCON = (255<<8)|(0x3<<3)|(1<<5)|0x1; //设置预分频最大为255,分频选择128,最后使能wdt定时器并且复位使能
}
void dog_eat()
{
WTCNT = 1526*3;; 喂狗操作就是让WTCNT不为零即可
}
三、看门狗的定时器功能
看门狗定时器依旧是使用到了中断,当WTCON减为零时,WTDAT会将自己值赋给WTCON,以此在进行定时器的功能;这里给出一个次级中断屏蔽寄存器说明由wdt中断存在;中断配置的流程可以参见中断处理一期的分享;
void wdttimer_init()
{
WTDAT = 1526*3;
WTCNT = 1526*3; //设置3s(初次使能必须手动赋值)
WTCON = (255<<8)|(0x3<<3)|(1<<5)|0x4; //分频值为255,分频值为128,使能看门狗,使能中断
INTSUBMSK &= ~(1<<13);
INTMSK &= ~(1<<9);
}
void do_wdttimer()
{
uprintf("wdt timer ok!\r\n");
SUBSRCPND |= 1<<13;
SRCPND |= 1<<9;
INTPND |= 1<<9;
}
总结
本期和大家分享的是WDT电路下实现的喂狗操作以及定时器的功能,喂狗操作能够使得系统正常进行工作,定时器功能依旧是用到了中断的知识点,因此相对来说还是比较简单的,希望各位小伙伴们加油理解!
最后,各位小伙伴们如果喜欢我的分享可以点赞收藏哦,你们的认可是我创作的动力,一起加油!