⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtc.c

📁 基于ARM应用的源码
💻 C
字号:
//about real-time-clock
#include	"../ucos-ii/includes.h"               /* uC/OS interface */
#include "../S3C44B0X/44B.h"
#include "rtc.h"

OS_EVENT *Rtc_Rw_Sem;                   //Rtc读写控制权旗语
//and you can use it as folloeing:
//    Rtc_Rw_Sem=OSSemCreate(1);        //创建Rtc读写控制权旗语,初值为1满足互斥条件//
//    OSSemPend(Rtc_Rw_Sem,0,&err);
//    OSSemPost(Rtc_Rw_Sem);

void BCDToU32(unsigned long *pVal)
{
	unsigned long uTemp = *pVal;

	*pVal = ((uTemp&0xF000)>>12)*1000 +
			((uTemp&0x0F00)>>8)*100 +
			((uTemp&0x00F0)>>4)*10 +
			(uTemp&0x000F);
}

void U32ToBCD(unsigned long *pVal)
{
	unsigned long uTemp = *pVal;
	uTemp &= 0xFFFF;

	*pVal = (((uTemp/1000)&0x000F)<<12) |
			((((uTemp%1000)/100)&0x000F)<<8) |
			((((uTemp%100)/10)&0x000F)<<4) |
			((uTemp%10) & 0x000F);
}

void InitRtc(void)
{
	Rtc_Rw_Sem=OSSemCreate(1);        //创建Rtc读写控制权旗语,初值为1满足互斥条件//
}

void Get_Rtc(PstructTime time)
{
	unsigned char err;
	OSSemPend(Rtc_Rw_Sem,0,&err);

	rRTCCON = 0x01;         // R/W enable, 1/32768, Normal(merge), No reset
	time->year=rBCDYEAR;
	time->month=rBCDMON;
	time->day=rBCDDAY;
	time->date=rBCDDATE;
	time->hour=rBCDHOUR;
	time->minute=rBCDMIN;
	time->second=rBCDSEC;
	rRTCCON = 0x00;       // R/W disable(for power consumption), 1/32768, Normal(merge), No reset    

	BCDToU32(&time->year);
	BCDToU32(&time->month);
	BCDToU32(&time->day);
	BCDToU32(&time->hour);
	BCDToU32(&time->minute);
	BCDToU32(&time->second);
	time->year += 2000;

	OSSemPost(Rtc_Rw_Sem);
}

unsigned char Rtc_IsTimeChange(unsigned long whichChange)
{
	unsigned char err;
	static unsigned long second=0xff,minute=0xff,hour=0xff,day=0xff;
	unsigned char retvalue=FALSE;

	OSSemPend(Rtc_Rw_Sem,0,&err);
	rRTCCON = 0x01;         // R/W enable, 1/32768, Normal(merge), No reset
	switch(whichChange){
	case RTC_SECOND_CHANGE:
		if(rBCDSEC!=second){
			retvalue=TRUE;
			second=rBCDSEC;
		}
		break;
	case RTC_MINUTE_CHANGE:
		if(rBCDMIN==minute){
			retvalue=TRUE;
			minute=rBCDMIN;
		}
		break;
	case RTC_HOUR_CHANGE:
		if(rBCDHOUR==hour){
			retvalue=TRUE;
			hour=rBCDHOUR;
		}
		break;
	case RTC_DAY_CHANGE:{
			retvalue=TRUE;
			day=rBCDDAY;
		}
		break;
	}
	rRTCCON = 0x00;			// R/W disable(for power consumption), 1/32768, Normal(merge), No reset    
	OSSemPost(Rtc_Rw_Sem);

	return retvalue;
}

void Set_Rtc(PstructTime time)
{
	unsigned char err;
	OSSemPend(Rtc_Rw_Sem,0,&err);

	time->year -= 2000;
	U32ToBCD(&time->year);
	U32ToBCD(&time->month);
	U32ToBCD(&time->day);
	U32ToBCD(&time->hour);
	U32ToBCD(&time->minute);
	U32ToBCD(&time->second);

	rRTCCON = 0x01;         // R/W enable, 1/32768, Normal(merge), No reset
	rBCDYEAR=time->year;
	rBCDMON=time->month;
	rBCDDAY=time->day;
	rBCDHOUR=time->hour;
	rBCDMIN=time->minute;
	rBCDSEC=time->second;
	rRTCCON = 0x00;       // R/W disable(for power consumption), 1/32768, Normal(merge), No reset    

	OSSemPost(Rtc_Rw_Sem);
}

void GetBCDTime2Str(unsigned short* fmtchar,unsigned long bcdata)
{
	*fmtchar=(bcdata>>4)+'0';
	fmtchar++;
	*fmtchar=(bcdata&0xf)+'0';
}

void Rtc_Format(char*  fmtchar, unsigned short* outstr)
{
	structTime time;
	Get_Rtc(&time);
	while(*fmtchar){
		if((*fmtchar)==((unsigned short)'%')){
			switch(*(fmtchar+1)){
			case 'Y':
				GetBCDTime2Str(outstr, time.year);
				fmtchar+=2;
				outstr+=2;
				break;
			case 'M':	//month
				GetBCDTime2Str(outstr, time.month);
				fmtchar+=2;
				outstr+=2;
				break;
			case 'D':
				GetBCDTime2Str(outstr, time.day);
				fmtchar+=2;
				outstr+=2;
				break;
			case 'H':
				GetBCDTime2Str(outstr, time.hour);
				fmtchar+=2;
				outstr+=2;
				break;
			case 'I':	//minute
				GetBCDTime2Str(outstr, time.minute);
				fmtchar+=2;
				outstr+=2;
				break;
			case 'S':
				GetBCDTime2Str(outstr, time.second);
				fmtchar+=2;
				outstr+=2;
				break;
			case '%':
				*outstr='%';
				fmtchar++;
				outstr++;
			case 0:
				return;
			}
		}
		else{
			*outstr=*fmtchar;
			fmtchar++;
			outstr++;
		}
	}
	*outstr=0;
}

void Set_Rtc_Clock(PstructClock time)
{
	unsigned char err;
	OSSemPend(Rtc_Rw_Sem,0,&err);

	rRTCCON = 0x01;         // R/W enable, 1/32768, Normal(merge), No reset
	rBCDHOUR=time->hour;
	rBCDMIN=time->minute;
	rBCDSEC=time->second;
	rRTCCON = 0x00;       // R/W disable(for power consumption), 1/32768, Normal(merge), No reset    

	OSSemPost(Rtc_Rw_Sem);
}

void Set_Rtc_Date(PstructDate time)
{
	unsigned char err;
	OSSemPend(Rtc_Rw_Sem,0,&err);

	rRTCCON = 0x01;         // R/W enable, 1/32768, Normal(merge), No reset
	rBCDYEAR=time->year;
	rBCDMON=time->month;
	rBCDDAY=time->day;
	rRTCCON = 0x00;       // R/W disable(for power consumption), 1/32768, Normal(merge), No reset    

	OSSemPost(Rtc_Rw_Sem);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -