1. RTC简介
RTC(Real Time Clock)即实时时钟,它是一个可以为系统提供精确的时间基准的元器件,RTC一般采用精度较高的晶振作为时钟源,有些RTC为了在主电源掉电时还可以工作,需要外加电池供电
2. Exynos4412下的RTC控制器
实时时钟(RTC)单元可以在系统电源关闭时使用备用电池运行。虽然电源关闭,备用电池可以通过秒、分钟、小时、周、日、月和年的数据存储时间。RTC单元使用外部32.768 kHz晶体,并执行报警功能。
3. RTC编程
#include "exynos_4412.h"
void delay(unsigned int Time);
void ADC_Init(void);
void init_gpio(void);
void RTC_Init(void);
int main()
{
unsigned int ADC_val = 0;
unsigned int oldsec = 0,newsec = 0;
ADC_Init();
init_gpio();
RTC_Init();
while(1){
ADCCON = ADCCON | 1;
while(!(ADCCON & (1<<15)));
ADC_val = ADCDAT & (0xfff);
ADC_val = ADC_val * 0.44;
if(ADC_val >= 1501){
GPX2.DAT = GPX2.DAT | (1<<7); //led2点亮
GPX1.DAT = GPX1.DAT | (1<<0); //led3点亮
GPF3.DAT = GPF3.DAT | (1<<4); //led4点亮
GPF3.DAT = GPF3.DAT | (1<<5); //led5点亮
}else if(ADC_val >= 1001){
GPF3.DAT = GPF3.DAT & (~(1<<5));
GPX2.DAT = GPX2.DAT | (1<<7); //led2点亮
GPX1.DAT = GPX1.DAT | (1<<0); //led3点亮
GPF3.DAT = GPF3.DAT | (1<<4); //led4点亮
}else if(ADC_val >= 501){
GPF3.DAT = GPF3.DAT & (~(1<<4));
GPF3.DAT = GPF3.DAT & (~(1<<5));
GPX2.DAT = GPX2.DAT | (1<<7); //led2点亮
GPX1.DAT = GPX1.DAT | (1<<0); //led3点亮
}else if(ADC_val >= 0){
GPF3.DAT = GPF3.DAT & (~(1<<4));
GPF3.DAT = GPF3.DAT & (~(1<<5));
GPX1.DAT = GPX1.DAT & (~(1<<0));
GPX2.DAT = GPX2.DAT | (1<<7); //led2点亮
newsec = RTC.BCDSEC;
if(oldsec != newsec){
printf("20%x-%x-%x %x %x:%x:%x\n",RTC.BCDYEAR,RTC.BCDMON,RTC.BCDWEEK,RTC.BCDDAY,RTC.BCDHOUR,RTC.BCDMIN,RTC.BCDSEC);
printf("ADC_val=%dmv\n",ADC_val);
oldsec = newsec;
}
}
}
return 0;
}
void RTC_Init(void)
{
/*使能RTC控制*/
RTCCON = RTCCON | 1;
/*校准时间信息*/
RTC.BCDYEAR = 0x022;
RTC.BCDMON = 0x12;
RTC.BCDDAY = 0x6;
RTC.BCDWEEK = 0x17;
RTC.BCDHOUR = 0x04;
RTC.BCDMIN = 0x23;
RTC.BCDSEC = 0x50;
/*禁止RTC控制*/
RTCCON = RTCCON & (~(1));
}
void delay(unsigned int Time)
{
while(Time--);
}
void ADC_Init(void)
{
/*将ADC精度设为12位*/
ADCCON = ADCCON | (1 << 16);
/*使能ADC分频器*/
ADCCON = ADCCON | (1 << 14);
/*设置ADC的分频值 ADC时钟频率=pclk/(19+1)=5MHZ ADC的转换频率=5/5=1MHZ*/
ADCCON = ADCCON & (~(0xff << 6)) | (19 << 6);
/*关闭待机模式,使能正常工作*/
ADCCON = ADCCON & (~(1 << 2));
/*关闭通过读使能AD转换*/
ADCCON = ADCCON & (~(1 << 1));
/*选择转换通道3*/
ADCMUX = 3;
return ;
}
void init_gpio(void)
{
GPX2.CON = GPX2.CON & (~(0xf<<28)) | (0x1<<28);
GPX1.CON = GPX1.CON & (~(0xf<<0)) | (0x1<<0);
GPF3.CON = GPF3.CON & (~(0xf<<16)) | (0x1<<16);
GPF3.CON = GPF3.CON & (~(0xf<<20)) | (0x1<<20);
return;
}