void GetDate(void) { // date = read_ds(0x07); timer.w_date = read_ds(0x07); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); // month = read_ds(0x08); timer.w_month = read_ds(0x08); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); //year = read_ds(0x09); timer.w_year = read_ds(0x09); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); timer.week=RTC_Get_Week(2000+timer.w_year,timer.w_month,timer.w_date); }
//得到当前的时间 //返回值:0,成功;其他:错误代码. u8 RTC_Get(void) { static u16 daycnt=0; u32 timecount=0; u32 temp=0; u16 temp1=0; timecount=RTC->CNTH;//得到计数器中的值(秒钟数) timecount<<=16; timecount+=RTC->CNTL; temp=timecount/86400; //得到天数(秒钟数对应的) if(daycnt!=temp)//超过一天了 { daycnt=temp; temp1=1970; //从1970年开始 while(temp>=365) { if(Is_Leap_Year(temp1))//是闰年 { if(temp>=366)temp-=366;//闰年的秒钟数 else break; } else temp-=365; //平年 temp1++; } timer.w_year=temp1;//得到年份 temp1=0; while(temp>=28)//超过了一个月 { if(Is_Leap_Year(timer.w_year)&&temp1==1)//当年是不是闰年/2月份 { if(temp>=29)temp-=29;//闰年的秒钟数 else break; } else { if(temp>=mon_table[temp1])temp-=mon_table[temp1];//平年 else break; } temp1++; } timer.w_month=temp1+1;//得到月份 timer.w_date=temp+1; //得到日期 } temp=timecount%86400; //得到秒钟数 timer.hour=temp/3600; //小时 timer.min=(temp%3600)/60; //分钟 timer.sec=(temp%3600)%60; //秒钟 timer.week=RTC_Get_Week(timer.w_year,timer.w_month,timer.w_date);//获取星期 return 0; }
unsigned char RTC_Get_Time(tim *timer) { static unsigned short daycnt=0; unsigned int timecount=0; unsigned int temp=0; unsigned short temp1=0; RTC_WaitForLastTask(); timecount=RTC->CNTH;//得到计数器中的值(秒钟数) timecount<<=16; timecount+=RTC->CNTL; temp=timecount/86400; //得到天数(秒钟数对应的) if(daycnt!=temp)//超过一天了 { daycnt=temp; temp1=1970; //从1970年开始 while(temp>=365) { if(Is_Leap_Year(temp1))//是闰年 { if(temp>=366)temp-=366;//闰年的秒钟数 else {temp1++;break;} } else temp-=365; //平年 temp1++; } timer->year=temp1;//得到年份 temp1=0; while(temp>=28)//超过了一个月 { if(Is_Leap_Year(timer->year)&&temp1==1)//当年是不是闰年/2月份 { if(temp>=29)temp-=29;//闰年的秒钟数 else break; } else { if(temp>=mon_table[temp1])temp-=mon_table[temp1];//平年 else break; } temp1++; } timer->month=temp1+1;//得到月份 timer->date=temp+1; //得到日期 } temp=timecount%86400; //得到秒钟数 timer->hour=temp/3600; //小时 timer->min=(temp%3600)/60; //分钟 timer->sec=(temp%3600)%60; //秒钟 //timer->sec = 0; //秒钟 timer->week=RTC_Get_Week(timer->year,timer->month,timer->date);//获取星期 return 0; }
//得到当前的时间 //返回值:0,成功;其他:错误代码. u8 Time_Get(void) { static u16 daycnt = 0; u32 timecount = 0; u32 temp = 0; u16 temp1 = 0; xSemaphoreTake(RTCStructMutex, portMAX_DELAY); timecount = RTC_GetCounter(); //获得 RTC 计数器值(秒钟数) temp = timecount / 86400; //得到天数(秒钟数对应的) if (daycnt != temp)//超过一天了 { daycnt = temp; temp1 = 1970; //从1970年开始 while (temp >= 365) { if (Is_Leap_Year(temp1))//是闰年 { if (temp >= 366)temp -= 366;//闰年的秒钟数 else { temp1++; break; } } else temp -= 365; //平年 temp1++; } RTCTime.w_year = temp1;//得到年份 temp1 = 0; while (temp >= 28)//超过了一个月 { if (Is_Leap_Year(RTCTime.w_year) && temp1 == 1)//当年是不是闰年/2月份 { if (temp >= 29)temp -= 29;//闰年的秒钟数 else break; } else { if (temp >= mon_table[temp1])temp -= mon_table[temp1];//平年 else break; } temp1++; } RTCTime.w_month = temp1 + 1;//得到月份 RTCTime.w_date = temp + 1; //得到日期 } temp = timecount % 86400; //得到秒钟数 RTCTime.hour = temp / 3600; //小时 RTCTime.min = (temp % 3600) / 60; //分钟 RTCTime.sec = (temp % 3600) % 60; //秒钟 RTCTime.week = RTC_Get_Week(RTCTime.w_year, RTCTime.w_month, RTCTime.w_date);//获取星期 xSemaphoreGive(RTCStructMutex); return 0; }