目录
一、WDT简介
WDT Watch Dog Timer,即看门狗计时器,其主要作用是当发生软件故障时可产生复位信号使SOC(系统级芯片)复位,其本质是一个计数器
WDT工作原理:每当计数器减到0就会让开发板复位
开发板上电后程序正常执行,计数器也会相应的从设定的数减小,当程序运行一段时间后会向计数器刷新新数值,然后重新进行正常执行,再过一段时间又给计数器写值,以此类推
当程序出现错误后,程序不能正常运行也就不会每隔一段时间给计数器刷新,当计数器变为零就会复位
出于安全考虑,使用WTD
二、 4412下的WDT控制器
Exynos 4412 SCP中的监视器计时器(WDT)是一种计时设备。由于噪声和系统错误导致故障后,可以使用此设备恢复控制器的操作(WDT产生复位信号)。你可以使用WDT作为一个norma 116位间隔计时器请求中断服务(作为普通定时器使用) 。
1. 可以产生两种信号中断信号和复位信号,通过WTCON[0]
和WTCON[2]
来控制模式
2.一级分频,使用PCLK时钟100m,使用8位分频,WTCON[15:8]
控制倍数,一级分频
二级分频:不能随意分频有固定值
时间计算,减一次花的时间
三、WDT寄存器详解
WAT 相关寄存器
1.WTCON寄存器
2.WTDAT 寄存器
实时中断,定期产生一个中断
3.WTCNT 寄存器
储存当前递减的值,[15:0],不超过65535 =2^16
四、 WDT编程
#include "extnos_4412.h"
void Delay(unsigned int Time)
{
while(Time--);
}
int main()
{
//为了方便说明将寄存器不同位拆开赋值,自己也可以直接算出然后给这个寄存器直接赋值
/* 设置一级分频*/
WDT.WTCON = WDT.WTCON | (0xFF << 8);
/* 设置二级分频*/
/*WTCNT递减频率 = PLCK(100000000)/(0xFF + 100000000)/128 = 3052*/
WDT.WTCON = WDT.WTCON | (0x3 << 3);
/* 禁止WDT产生中断信号*/
WDT.WTCON = WDT.WTCON & (~(1 << 2));
/*使能WDT产生复位信号*/
WDT.WTCON = WDT.WTCON | 1;
/*设置计数器的初始初始值/
WDT.WTCNT = (3052 * 5);//倍数就是多少秒减完
/*使能WDT,计数器开始递减,要放在最后面 */
WDT.WTCON = WDT.WTCON | (1 << 5);
while(1)
{
printf("WDT.WTCNT = %d\n",WDT.WTCNT);
Delay(100000);
}
return 0;
}
串口初始化在开发板内部已经初始化好了,上电后将初始化串口,所以我们使用printf查看计数器的值不需要再初始化一次串口直接打印需要的值就可以
实验现象:5秒后CPU重置,没有赋予刷新值,减完后程序开始复位
赋予刷新值3052后,每次减到2962不复位,刷新了值重新减
实际使用是WDT.WTCNT赋值使用的
#include "extnos_4412.h"
void Delay(unsigned int Time)
{
while(Time--);
}
int main()
{
//为了方便说明将寄存器不同位拆开赋值,自己也可以直接算出然后给这个寄存器直接赋值
/*设置一级分频*/
WDT.WTCON = WDT.WTCON | (0xFF << 8);
/* 设置二级分频*/
/*WTCNT递减频率 = PLCK(100000000)/(0xFF + 100000000)/128 = 3052*/
WDT.WTCON = WDT.WTCON | (0x3 << 3);
/*禁止WDT产生中断信号*/
WDT.WTCON = WDT.WTCON & (~(1 << 2));
/* 使能WDT产生复位信号*/
WDT.WTCON = WDT.WTCON | 1;
/*设置计数器的初始初始值/
WDT.WTCNT = (3052 * 5);//倍数就是多少秒减完
/* 使能WDT,计数器开始递减,要放在最后面 */
WDT.WTCON = WDT.WTCON | (1 << 5);
while(1)
{
printf("WDT.WTCNT = %d\n",WDT.WTCNT);
/*喂狗*/
WDT .WTCNT = 3052;
Delay(100000);
}
return 0;
}