STM32年月日计算程序
如果将RTC计数器设置成1秒进位1次,RTC计数器溢出时间大概有136年,所以不必考虑时间会溢出的问题。 先设置好记时起点的年月日时分秒。 然后调用下面的计算程序即可。 我只是简单测试了一下该实时时钟,外接了一个32.768K的晶振。 但我感觉该实时时钟的时间精度不太高,如果要精确的话,恐怕不太适用。 这只是我的测试结论,不一定准确,大家可实验一下。 下面的源程序经过测试了,可参考一下。 /*源程序*/ const uchar MaxDayArray[12]={31,28,31,30,31,30,31,31,30,31,30,31}; // uchar IRTYear,IRTMonth,IRTDay,IRTHour,IRTMinute,IRTSecond; 计算时分秒: void Time_GetValue(u32 TimeVar) { u32 THH = 0, TMM = 0, TSS = 0; /* Compute hours */ THH = TimeVar/3600; /* Compute minutes */ TMM = (TimeVar % 3600)/60; /* Compute seconds */ TSS = (TimeVar % 3600)% 60; RTHour=(uchar)THH; RTMinute=(uchar)TMM; RTSecond=(uchar)TSS; } 调用方式:Time_GetValue(RTC_GetCounter()); 计算年月日: /*CaculateTime :Caculate new Time*/ void CaculateTime(void) { uint IYear; IYear=2000+IRTYear; if(2==IRTMonth) { // IRTDay++; if((IYear%4==0&&IYear%100!=0)||(IYear%400==0)) { //leap year if ((IRTDay>MaxDayArray[IRTMonth-1]+1)) { //Day overflow IRTDay=1; IRTMonth++; if(IRTMonth>12) { //Month overflow IRTMonth=1; IRTYear++; if (IRTYear>99) { //Year overflow IRTYear=0; } } } } else { //no leap year if ((IRTDay>MaxDayArray[IRTMonth-1])) { IRTDay=1; IRTMonth++; if(IRTMonth>12) { //Month overflow IRTMonth=1; IRTYear++; if (IRTYear>99) { //Year overflow IRTYear=0; } } } } } else { // IRTDay++; if ((IRTDay>MaxDayArray[IRTMonth-1])) { IRTDay=1; IRTMonth++; if(IRTMonth>12) { //Month overflow IRTMonth=1; IRTYear++; if (IRTYear>99) { //Year overflow IRTYear=0; } } } } } 调用方式: TempValue=RTC_GetCounter(); do while(TempValue > 0x00015180); { // CaculateTime(); TempValue -=0x00015180; } 新生成的年月日时分秒就是当前的年月日。