一、WDT简介
(一)WDT概念
1、SOC中除了CPU,还集成了很多硬件控制器,GPIO控制引脚产生高低电平,UART通讯
2、WDT也是SOC中的一个硬件控制器,软件错误产生死机,重启复位,程序不能正常执行,很多嵌入式硬件没有手机那样重启方便,需要自我监控,死机自动重启,看门狗就起到了这样一个作用,当程序发生错误时,产生一个复位信号使SOC复位,本质是一个计数器。
(二)WDT工作原理
计数器中有一个比较大的数字(比如100)并自动递减,程序正常进行,每隔一段时间,刷新一个比较大的值,若长时间不刷,减到0,发送复位信号复位。CPU重新刷新一个比较大的值。
二、EXYNOS4412下的WDT控制器
(一)研究步骤
1、研究电路原理图
观察硬件电路是如何控制的。
2、电路连接到了4412芯片的哪个引脚
3、配置引脚功能
(二)WDT原理图
1、看门狗位于SOC内部,当CPU有错误发送,是在SOC内部发送复位,不需要控制硬件,不需要引脚输入输出。
2、看门口也可以做普通的定时器,时间到了,向CPU发送中断信号。
3、WDT原理图
4、WDT用的时钟PCLK
100MHZ,1秒中1亿次,CPU1秒钟就可以执行完,因此对PCLK进行分频。
1)一级分频
8位分频器,0~255能够降低1~266倍,用WTCON[15:8]来控制。
2)二级分频
有16、32、64、128倍四种,用WTCON[4:3]决定。
真正递减计数器减的是二级分频后的得到的频率。
5、递减一次所花的时间
三、WDT寄存器详解
WTDAT、WTCLRINT是中断相关的寄存器。
1、WTCON
1)一级分频
0~255,实际倍数1~266
2)使能寄存器
3)二级分频
4)中断信号
主要用于定时器时使用。
5)置1
6)复位信号
2、WTDAT
WTDAT里面的值减到0,发送中断,用于WDT作为普通定时器。
3、WTCNT
存放当前计数的值,减到0发送复位信号,最大值65535。
四、WDT编程
#include "exynos_4412.h"
void Delay(unsigned int Time)
{
while(Time--);
}
int main()
{
/*设置一级分频*/
WDT.WTCON = WDT.WTCON | (0xFF << 8);
/*设置二级分频*/
/*WTCNT递减频率 = PLCK(100000000)/(0xFF + 1)/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;
}
五、作业
编程实现将WDT的递减频率设置为10000HZ,程序运行5s后开发板复位
#include "exynos_4412.h"
void Delay(unsigned int Time)
{
while(Time--);
}
int main()
{
/*设置一级分频*/
WDT.WTCON = WDT.WTCON | (0x4D << 8);
/*设置二级分频*/
/*WTCNT递减频率 = PLCK(100000000)/(0x4D + 1)/128 = 10000*/
/*77 = 64+8+4+1*/
/*01001101*/
WDT.WTCON = WDT.WTCON | (0x3 << 3);
/*禁止WDT产生中断信号*/
WDT.WTCON = WDT.WTCON & (~(1 << 2));
/*使能WDT产生复位信号*/
WDT.WTCON = WDT.WTCON | 1;
/*设置计数器的初始值*/
WDT.WTCNT = (10000*5);
/*使能WDT,计数器开始递减*/
WDT.WTCON = WDT.WTCON | (1 << 5);
while(1)
{
printf("WDT.WTCNT = %d\n",WDT.WTCNT);
Delay(100000);
}
return 0;
}