📄 ds1302.c
字号:
*/
ds1302_writebyte(RTC_ADDR_WP,0x00); // disenable写保护
ds1302_writebyte(RTC_ADDR_MIN,int2bcd(CurrentTime.tm_min));
ds1302_writebyte(RTC_ADDR_HOUR,(int2bcd(CurrentTime.tm_hour)& 0x7f));
ds1302_writebyte(RTC_ADDR_DATE,int2bcd(CurrentTime.tm_mday));
ds1302_writebyte(RTC_ADDR_MON,int2bcd(CurrentTime.tm_mon));
ds1302_writebyte(RTC_ADDR_WEEK,int2bcd(CurrentTime.tm_wday));
ds1302_writebyte(RTC_ADDR_YEAR,int2bcd(CurrentTime.tm_year));
ds1302_writebyte(RTC_ADDR_TCS,0xa6); // 充电
ds1302_writebyte(0x0cc,0x01); // 写RAM
ds1302_writebyte(RTC_ADDR_SEC,(int2bcd(CurrentTime.tm_sec) & 0x7f));
ds1302_writebyte(RTC_ADDR_WP,0x80); // enable写保护
}
/**********************************************************************************
// TIME格式的时间写入
void SysTimeWriteTime(INT32 Second) //写时间
{
tm WrTime;
WrTime = *localtime((const time_t *)&Second);
// WrTime = 0x0;
WrTime.tm_year += 1900; //tm是从1900年开始
WrTime.tm_mon += 1; //tm是从0开始的月
WrTime.tm_year -= 2000;
SysTimeWrite(WrTime);
}
***********************************************************************************/
/*
**-------------------------------------------------------------------------------------------------
**函数名:SysDs1302Charge()
**功能描述:充电
**输入:
**输出:
**建立时间:2008.10.19
**-------------------------------------------------------------------------------------------------
**
*/
void SysDs1302Charge(void)
{
ds1302_writebyte(RTC_ADDR_WP,0x00); // disenable写保护
ds1302_writebyte(RTC_ADDR_TCS,0xa6); // 充电
ds1302_writebyte(RTC_ADDR_WP,0x80); // enable写保护
}
/*
**-------------------------------------------------------------------------------------------------
**函数名:bcd2int(int val)
**功能描述:BCD转整型
**输入:
**输出:
**建立时间:2008.10.19
**-------------------------------------------------------------------------------------------------
**
*/
INT16 bcd2int(INT16 val)
{
return((((val & 0xf0) >> 4) * 10) + (val & 0xf));
}
/*
**-------------------------------------------------------------------------------------------------
**函数名:int2bcd(int val)
**功能描述:整型转BCD
**输入:
**输出:
**建立时间:2008.10.19
**-------------------------------------------------------------------------------------------------
**
*/
INT16 int2bcd(INT16 val)
{
return ((((val/10) & 0x0f)<<4) | ((val%10) & 0x0f));
}
/*
**-------------------------------------------------------------------------------------------------
**函数名:SysTimeRead()
**功能描述:读时间
**输入:
**输出:
**建立时间:2008.10.19
**-------------------------------------------------------------------------------------------------
**
*/
tm OldTime;
INT32 SysTimeRead(void)
{
INT32 Res;
tm CurrentTime; // realtime;
// struct timespec SpecTime;
// time_t stime;
CurrentTime.tm_yday = 0; // 天 未存储
CurrentTime.tm_wday = bcd2int(ds1302_readbyte(RTC_ADDR_WEEK));
CurrentTime.tm_year = bcd2int(ds1302_readbyte(RTC_ADDR_YEAR))+100;
CurrentTime.tm_mon = bcd2int(ds1302_readbyte(RTC_ADDR_MON))-1;
CurrentTime.tm_mday = bcd2int(ds1302_readbyte(RTC_ADDR_DATE));
CurrentTime.tm_hour = bcd2int(ds1302_readbyte(RTC_ADDR_HOUR));
CurrentTime.tm_min = bcd2int(ds1302_readbyte(RTC_ADDR_MIN));
CurrentTime.tm_sec = bcd2int(ds1302_readbyte(RTC_ADDR_SEC));
OldTime.tm_wday = bcd2int(ds1302_readbyte(RTC_ADDR_WEEK));
OldTime.tm_year = bcd2int(ds1302_readbyte(RTC_ADDR_YEAR))+100;
OldTime.tm_mon = bcd2int(ds1302_readbyte(RTC_ADDR_MON))-1;
OldTime.tm_mday = bcd2int(ds1302_readbyte(RTC_ADDR_DATE));
OldTime.tm_hour = bcd2int(ds1302_readbyte(RTC_ADDR_HOUR));
OldTime.tm_min = bcd2int(ds1302_readbyte(RTC_ADDR_MIN));
OldTime.tm_sec = bcd2int(ds1302_readbyte(RTC_ADDR_SEC));
/*
mktime(&CurrentTime);
printf ( "%d\n", mktime(&CurrentTime) );
SpecTime.tv_sec= mktime(&CurrentTime);
SpecTime.tv_nsec = 0;
Res = clock_settime(CLOCK_REALTIME, &SpecTime); // 设置时间到系统
stime = time(NULL); // 从系统读到秒形式时间
Res = time(NULL); // 从系统读到秒形式时间
return Res;
realtime = *localtime(&stime); // 把秒形式时间转换成结构时间
printf ( "time is :%s\n", asctime(&realtime) );
*/
}
/*
**-------------------------------------------------------------------------------------------------
**函数名:upPowerDS1302Chk()
**功能描述:DS1302上电自检
**输入:
**输出:
**建立时间:2008.10.19
**-------------------------------------------------------------------------------------------------
**
*/
INT16 upPowerDS1302Chk(void)
{
ds1302_writebyte(RTC_ADDR_WP,0x00); // disenable写保护
ds1302_writebyte(RTC_RAM_STR, 0x55);
ds1302_writebyte(RTC_ADDR_WP,0x80); // enable写保护
if (ds1302_readbyte(RTC_RAM_STR + 1) != 0x55)
{
return (DS1302_SEL_CHEK_FAIL); // 读的时候地址加1
}
ds1302_writebyte(RTC_ADDR_WP,0x00); // disenable写保护
ds1302_writebyte(RTC_RAM_STR, 0xaa);
ds1302_writebyte(RTC_ADDR_WP,0x80); // enable写保护
if (ds1302_readbyte(RTC_RAM_STR + 1) != 0xaa)
{
return (DS1302_SEL_CHEK_FAIL);
}
return (DS1302_SEL_CHEK_SUCC);
}
/*
**-------------------------------------------------------------------------------------------------
**函数名:ds1302_gettod()
**功能描述:读时间
** This is called direct from the kernel timer handling code.
** It gets the current time from the RTC.
**输入:
**输出:
**建立时间:2008.10.19
**-------------------------------------------------------------------------------------------------
**
*/
/*
void ds1302_gettod()
{
INT32 year, mon, day, hour, min, sec,tcs,week;
week = bcd2int(ds1302_readbyte(RTC_ADDR_WEEK));
year = bcd2int(ds1302_readbyte(RTC_ADDR_YEAR));
mon = bcd2int(ds1302_readbyte(RTC_ADDR_MON));
day = bcd2int(ds1302_readbyte(RTC_ADDR_DATE));
hour = bcd2int(ds1302_readbyte(RTC_ADDR_HOUR));
min = bcd2int(ds1302_readbyte(RTC_ADDR_MIN));
sec = bcd2int(ds1302_readbyte(RTC_ADDR_SEC));
printf("year=%d mon=%d day=%d hour=%d min=%d sec=%d week=%d\n ",year,mon,day,hour,min,sec,week);
year = (ds1302_readbyte(RTC_ADDR_YEAR));
mon = (ds1302_readbyte(RTC_ADDR_MON));
day = (ds1302_readbyte(RTC_ADDR_DATE));
hour = (ds1302_readbyte(RTC_ADDR_HOUR));
min = (ds1302_readbyte(RTC_ADDR_MIN));
sec = (ds1302_readbyte(RTC_ADDR_SEC));
printf("year=%d mon=%d day=%d hour=%d min=%d sec=%d \n ",year,mon,day,hour,min,sec);
}
*/
/*
**-------------------------------------------------------------------------------------------------
**函数名:upPowerDS1302BatChk()
**功能描述:DS1302上电备用电池自检
**输入:
**输出:
**建立时间:2008.10.19
**-------------------------------------------------------------------------------------------------
**
*/
/*
int upPowerDS1302BatChk(void)
{
struct tm TempTime;
TempTime = *localtime((const time_t *)&(TimeSys.Second));
TempTime.tm_year += 1900;
if((TempTime.tm_year > 2035) || (TempTime.tm_year < 2007)) return(0);
return(1);
}
*/
/*
void time1()
{
taskSpawn("idprint", 70,0,10000,(FUNCPTR)idprint, 0,0,0,0,0,0,0,0,0,0);
}
void idprint(void)
{
ds1302_reset();
struct tm Time;
Time.tm_year = 0x06;
Time.tm_mon = 0x12;
Time.tm_mday = 0x26;
Time.tm_hour = 0x09;
Time.tm_min = 0x07;
Time.tm_sec = 0x00;
for(;;)
{
taskDelay(120);
SysTimeWrite(Time);
INT32 i = SysTimeRead();
// ds1302_gettod();
taskDelay(120);
// inittime();
}
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -