基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(WDT、RTC)

【5】WDT看门狗实验

1.实验目的:掌握WDT用法,WDT的实质:监控CPU程序执行,一旦出现异常,WDT向CPU发送复位中断
2.实验原理:WDT监控CPU:CPU每执行一段程序就要像WDT中刷新写入数值,继续向下计数,实现WDT监控CPU的功能
3.实验步骤:
1)由于WDT属于SOC内部功能模块,因此和外界是没有物理引脚的,所以此时不需要在查看原理图
2)打开用户手册,找到WDT章节,阅读概述(26.1)
基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(WDT、RTC)_第1张图片
a)看门狗实质是一个16bit的定时器,他有普通定时器中断和复位中断两种功能
b)看门狗内部结构:总线时钟经过两次分频到达WDT
c)初始化WDT(设置复位间隔为1S)
基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(WDT、RTC)_第2张图片
基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(WDT、RTC)_第3张图片
对到达WDT的时钟进行分频:
WTCON[15:8] = 249

//设置一级分频:249
	WDT.WTCON &= ~(0xff<<8);
	WDT.WTCON |= (249<<8);
	![在这里插入图片描述](https://img-blog.csdnimg.cn/20190125153309290.?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NoYXduV2FuZzE5OTQ=,size_16,color_FFFFFF,t_70)		

二次分频:
WTCON[4:3] = 3 //分频因子是128

//设置二级分频:128
WDT.WTCON |= (3<<3);

基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(WDT、RTC)_第4张图片
初始化向下计数器值:
WTCNT = 3125 //当然也可以不初始化,默认是0x8000

//设置定时时间:3
	WDT.WTCNT = 3125 * 3;

初始化WDT超时时间:
WTDAT = 3125 //当然也可以不设置,这个只是在WDT没有喂狗并且TCNT减到0的时候,WDAT的值会自动重新装载到TCNT继续向下计数,直到减到0,才会产生复位信号

使能复位中断:
WTCON[0] = 1
e)开启WDT
WTCON[5] = 1
3)喂狗
WTCNT = 3125

//4、设置看门狗信号:reset
	WDT.WTCON &= ~(1<<2);
	WDT.WTCON |= (1<<0);

	//5、打开WDT
	WDT.WTCON |= (1<<5);

代码:

#include "exynos_4412.h"

void wdt_init(void)
{
	//1、设置一级分频:249
	WDT.WTCON &= ~(0xff<<8);
	WDT.WTCON |= (249<<8);

	//2、设置二级分频:128
	WDT.WTCON |= (3<<3);

	//3、设置定时时间:3
	WDT.WTCNT = 3125 * 3;

	//4、设置看门狗信号:reset
	WDT.WTCON &= ~(1<<2);
	WDT.WTCON |= (1<<0);

	//5、打开WDT
	WDT.WTCON |= (1<<5);
}

void delay(unsigned int time)
{
	int i;
	for(; time>0; time--)
	{
		for(i=200; i>0; i--)
		{
			;
		}
	}
}

void wdt_feed(void)
{
	WDT.WTCNT = 3125 * 3;
}

int main(void)
{
	wdt_init();

	while(1)
	{
		delay(500);

		wdt_feed();
	}

	return 0;
}

【6】RTC实验

1.实验目的:掌握RTC实时时钟的功能
2.实验原理:
(1)4412中自带的RTC功能,存放的是当前的年月日时分秒信息,通过从RTC中读取当前开发板时间
(2)RTC除了实时时间之外,还带有闹钟和系统滴答定时的功能
(3)闹钟功能就是提前向RTC中写入一个定时时间,然后使能闹钟功能,当RTC实时时间和定时时间相同后,产生中断(低功耗模式下就是唤醒,正常模式下就是中断)
(4)滴答定时器功能就是向RTC中设置一个计数初始值,当RTC向下计数器的值减到0之后,就会触发中断
3.实验步骤:
(1)读取RTC实时时间实验

a)打开芯片用户手册,找到RTC对应章节阅读概述(27.1)
基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(WDT、RTC)_第5张图片
RTC中存放当前的时间信息:年月日时分秒
RTC可以在设备断电时使用备用电源工作
RTC的工作时钟频率是32.768KHz
RTC支持闰年,存放时间数据使用的是BCD编码
RTC支持闹钟功能

b)查找手册的中断控制章节(第9章),找到RTC的中断号(9.2.2)
基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(WDT、RTC)_第6张图片

基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(WDT、RTC)_第7张图片 alarm功能:
GIC中断号:76
SPI中断号:44
tic滴答定时器功能:
GIC中断号:77
SPI中断号:45

c)初始化RTC
由于是裸板驱动,因此在RTC中的时间都是空的(默认为0),所以需要我们对其初始化,但是从手册中我们知道,如果要改变RTC实时时间,先要使能RTC控制,设置完毕之后要关闭使能设置基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(WDT、RTC)_第8张图片

RTCCON[0] = 1;

RTCCON |= (1<<0); //使能时间修改

基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(WDT、RTC)_第9张图片
BCDYEAR = year;

RTC.BCDYEAR = 0x008;

BCDMON = mon;
基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(WDT、RTC)_第10张图片

RTC.BCDMON = 0x2;

BCDDAYWEEK = day; //Samsung的手册中对天和星期的寄存器弄反了
基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(WDT、RTC)_第11张图片

RTC.BCDDAY = 0x7;

BCDDAY = week;
基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(WDT、RTC)_第12张图片

RTC.BCDWEEK = 0x28;

BCDHOUR = hour;
基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(WDT、RTC)_第13张图片

RTC.BCDHOUR = 0x23;

BCDMIN = min;
基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(WDT、RTC)_第14张图片

RTC.BCDSEC = 0x55;

BCDSEC = sec;
基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(WDT、RTC)_第15张图片
RTCCON[0] = 0;

RTCCON &= ~(1<<0); //关闭时间修改

d)读取RTC实时时间
从RTC定时器中读取数据(年月日周时分秒寄存器)

代码:

#include "exynos_4412.h"

//typedef struct{
//	unsigned int year;
//	unsigned int mon;
//	unsigned int day;
//	unsigned int week;
//	unsigned int hour;
//	unsigned int min;
//	unsigned int sec;
//}date_t;
//
//
//date_t date;

int main(void)
{
	unsigned int i;

	//1、初始化时间
	RTCCON |= (1<<0); //使能时间修改
	RTC.BCDYEAR = 0x008;
	RTC.BCDMON = 0x2;
	RTC.BCDDAY = 0x7;
	RTC.BCDHOUR = 0x23;
	RTC.BCDMIN = 0x59;
	RTC.BCDSEC = 0x55;
	RTC.BCDWEEK = 0x28;
	RTCCON &= ~(1<<0); //关闭时间修改

	while(1)
	{
		if(i != RTC.BCDSEC)
		{
			printf("2%03x-%x-%x week:%x   %x-%x-%x\n" , \
					RTC.BCDYEAR, \
					RTC.BCDMON, \
					RTC.BCDWEEK, \
					RTC.BCDDAY,\
					RTC.BCDHOUR, \
					RTC.BCDMIN, \
					RTC.BCDSEC);
			i = RTC.BCDSEC;
		}
	}

	return 0;
}

你可能感兴趣的:(ARM)