【5】WDT看门狗实验
1.实验目的:掌握WDT用法,WDT的实质:监控CPU程序执行,一旦出现异常,WDT向CPU发送复位中断
2.实验原理:WDT监控CPU:CPU每执行一段程序就要像WDT中刷新写入数值,继续向下计数,实现WDT监控CPU的功能
3.实验步骤:
1)由于WDT属于SOC内部功能模块,因此和外界是没有物理引脚的,所以此时不需要在查看原理图
2)打开用户手册,找到WDT章节,阅读概述(26.1)
a)看门狗实质是一个16bit的定时器,他有普通定时器中断和复位中断两种功能
b)看门狗内部结构:总线时钟经过两次分频到达WDT
c)初始化WDT(设置复位间隔为1S)
对到达WDT的时钟进行分频:
WTCON[15:8] = 249
//设置一级分频:249WDT.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);
初始化向下计数器值:
WTCNT = 3125 //当然也可以不初始化,默认是0x8000
//设置定时时间:3WDT.WTCNT = 3125 * 3;
初始化WDT超时时间:
WTDAT = 3125 //当然也可以不设置,这个只是在WDT没有喂狗并且TCNT减到0的时候,WDAT的值会自动重新装载到TCNT继续向下计数,直到减到0,才会产生复位信号
使能复位中断:
WTCON[0] = 1
e)开启WDT
WTCON[5] = 1
3)喂狗
WTCNT = 3125
//4、设置看门狗信号:resetWDT.WTCON &= ~(1<<2);WDT.WTCON |= (1<<0);//5、打开WDTWDT.WTCON |= (1<<5);
代码:
#include "exynos_4412.h"void wdt_init(void)
{//1、设置一级分频:249WDT.WTCON &= ~(0xff<<8);WDT.WTCON |= (249<<8);//2、设置二级分频:128WDT.WTCON |= (3<<3);//3、设置定时时间:3WDT.WTCNT = 3125 * 3;//4、设置看门狗信号:resetWDT.WTCON &= ~(1<<2);WDT.WTCON |= (1<<0);//5、打开WDTWDT.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)
RTC中存放当前的时间信息:年月日时分秒
RTC可以在设备断电时使用备用电源工作
RTC的工作时钟频率是32.768KHz
RTC支持闰年,存放时间数据使用的是BCD编码
RTC支持闹钟功能
b)查找手册的中断控制章节(第9章),找到RTC的中断号(9.2.2)
alarm功能:
GIC中断号:76
SPI中断号:44
tic滴答定时器功能:
GIC中断号:77
SPI中断号:45
c)初始化RTC
由于是裸板驱动,因此在RTC中的时间都是空的(默认为0),所以需要我们对其初始化,但是从手册中我们知道,如果要改变RTC实时时间,先要使能RTC控制,设置完毕之后要关闭使能设置
RTCCON[0] = 1;
RTCCON |= (1<<0); //使能时间修改
BCDYEAR = year;
RTC.BCDYEAR = 0x008;
BCDMON = mon;
RTC.BCDMON = 0x2;
BCDDAYWEEK = day; //Samsung的手册中对天和星期的寄存器弄反了
RTC.BCDDAY = 0x7;
BCDDAY = week;
RTC.BCDWEEK = 0x28;
BCDHOUR = hour;
RTC.BCDHOUR = 0x23;
BCDMIN = min;
RTC.BCDSEC = 0x55;
BCDSEC = sec;
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;
}