L12D15 WDT实验

一、WDT简介

(一)WDT概念

L12D15 WDT实验_第1张图片

1、SOC中除了CPU,还集成了很多硬件控制器,GPIO控制引脚产生高低电平,UART通讯

2、WDT也是SOC中的一个硬件控制器,软件错误产生死机,重启复位,程序不能正常执行,很多嵌入式硬件没有手机那样重启方便,需要自我监控,死机自动重启,看门狗就起到了这样一个作用,当程序发生错误时,产生一个复位信号使SOC复位,本质是一个计数器。

(二)WDT工作原理

 L12D15 WDT实验_第2张图片

 计数器中有一个比较大的数字(比如100)并自动递减,程序正常进行,每隔一段时间,刷新一个比较大的值,若长时间不刷,减到0,发送复位信号复位。CPU重新刷新一个比较大的值。

 二、EXYNOS4412下的WDT控制器

(一)研究步骤

1、研究电路原理图

观察硬件电路是如何控制的。

2、电路连接到了4412芯片的哪个引脚

3、配置引脚功能

(二)WDT原理图

1、看门狗位于SOC内部,当CPU有错误发送,是在SOC内部发送复位,不需要控制硬件,不需要引脚输入输出。

2、看门口也可以做普通的定时器,时间到了,向CPU发送中断信号。

3、WDT原理图

L12D15 WDT实验_第3张图片

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寄存器详解 L12D15 WDT实验_第4张图片

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;
}

你可能感兴趣的:(单片机,嵌入式硬件)