S5PV210 看门狗定时和复位
第一节 S5PV210的看门狗定时器
S5PV210上的看门狗定时器相当于一个普通的16bit的定时器,它与PWM定时器的区别是看门狗定时器可以产生reset信号而PWM定时器不能,S5PV210看门狗定时器的结构图如下:
第二节 程序相关讲解
完整代码见目录见详细代码下载链接。
1. main.c
共4个步骤:
第一步 初始化串口;
第二步 中断相关初始化;
第三步 测试看门狗,调用函数wtd_test(),其定义位于wtd.c中;
第四步 死循环,等待看门狗中断的发生;
2. wtd.c
wtd_test()的内容包括4个步骤:
第一步 VIC相关的中断设置,包括设置WTD中断的处理函数为isr_wtd()和使能中断;
第二步 测试看门狗定时的功能,调用了函数wtd_operate(),这里我们只是使能了看门狗定时器的定时功能,而并没有使能reset功能;
wtd_operate()的完整代码如下:
void wtd_operate(unsigned long uenreset, unsigned long uenint, unsigned long uselectclk, unsigned long uenwtd, unsigned long uprescaler,unsigned long uwtdat, unsigned long uwtcnt)
{
WTDAT = uwtdat;
WTCNT = uwtcnt;
/*uenreset: 是否使能reset *uenint: 是否使能中断 *uselectclk: 分频系数 *uenwtd:是否启动定时器 *bit[8:15]:预分频系数 */
WTCON= (uenreset<<0)|(uenint<<2)|(uselectclk<<3)|(uenwtd<<5)|((uprescaler)<<8);
}
首先设置计数相关的寄存器WTDAT和WTCNT,寄存器WTDAT用来决定看门狗定时器的超时周期,在看门狗定时器启动后,寄存器WTDAT的值会自动传入寄存器WTCNT,当WTCNT计数达到0时:如果中断被使能的话会发出中断,如果reset功能被使用的话会发出复位信号,然后装载WTDAT的值并重新计数。
寄存器WTCON进行相关配置,用来决定是否使能reset、是否使能中断、分频、是否启动定时器等,具体见下图:
最后再来看看看门狗中断的处理函数,代码如下:
void isr_wtd()
{
//记录中断发生次数
static int wtdcounter=0;
printf("%d\r\n",++wtdcounter);
// 看门狗相关中断清除
WTCLRINT = 1;
// VIC相关中断清除
intc_clearvectaddr();
if(wtdcounter==5)
{
// 看门狗reset printf("waiting system reset\r\n");
wtd_operate(1,1,0,1,100,100000000,100000000);
}
}
共3个步骤:
第一步 打印中断发生的次数;
第二步 中断清除;
第三步 当发生了5次定时中断后,使能看门狗的reset功能,此时系统会重启;
第三节 实验现象
首先会打印1、2、3、4...,当打印5时,watchdog的reset功能被使能,系统会重启,说明看门狗的复位作用生效了。