📄 rtc.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 + -