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

📄 rtc.c

📁 在移植成功ucos核的基础上扩充了该操作系统的许多没有功能。如文件系统
💻 C
字号:
#include	"../ucos-ii/includes.h"               /* uC/OS interface */

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 InitRtc()
{
	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->date=rBCDDATE;
	time->day=rBCDDAY;
	time->hour=rBCDHOUR;
	time->minute=rBCDMIN;
	time->second=rBCDSEC;
	rRTCCON = 0x00;       // R/W disable(for power consumption), 1/32768, Normal(merge), No reset    
	
	OSSemPost(Rtc_Rw_Sem);
}

U8 Rtc_IsTimeChange(U32 whichChange)
{
	unsigned char err;
	static U32 second=0xff,minute=0xff,hour=0xff,day=0xff;
	U8 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);

	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(U16* fmtchar,U32 bcdata)
{
	*fmtchar=(bcdata>>4)+'0';
	fmtchar++;
	*fmtchar=(bcdata&0xf)+'0';
}

void Rtc_Format(char*  fmtchar, U16* outstr)
{
	structTime time;
	Get_Rtc(&time);
	while(*fmtchar){
		if((*fmtchar)==((U16)'%')){
			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 NULL:
				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 + -