<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
十三、开发板RTC时钟的调整程序设计
为什么今天突然转到RTC时钟的程序设计呢?因为文件的操作中有时间设置的要求,先前一直的时候,我直接让f_getfattime()函数返回0,现在文件系统的大部分功能都已经实现了,再调调时间吧。
1、Time_Adjust程序的设计
这个程序的作用是将用户设定的年月日和时分秒转换为计数值,并写入RTC的计数器。
void Time_Adjust(TimeStruct* CurrentTime) //时间格式转换
{ u32 RTCCount;
PWR_BackupAccessCmd(ENABLE); //使能备份域修改
RTCCount=Time_TimeToCount ( &CurrentTime ); //将时间值转换为计数值
RTC_SetCount ( RTCCount );
RTC_WaitForLastTask(); //写入和等待写入完成。
PWR_BackupAccessCmd(DISABLE); }
它的主要操作是调用Time_TimeToCount完成转换。
2、Time_TimeToCount程序的设计
u32 Time_TimeToCount(TimeStruct* CurTime){//时间格式转换
u32 TimeCount; //时间对应计数
u16 Years,TotalDays,DaysInYear; //1980年以来的总年数和总天数、一年内剩余的天数
u8 YearOn4,YearIn4; //总年数除以4的商和余数
Years=CurTime->Year-1980; //1980年以来的总年数
YearOn4=Years/4;
YearIn4=Years%4; //总年数除以4的商和余数
if ( YearIn4 <1 ){ //说明是闰年,有29号
DaysInYear = DayInMonth1[ CurTime->Month-1 ]+ CurTime->Date-1;
//比如<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />2月2日,经过的天数为32天,当天不算。4月15日,经过的天数为91+14=105天。
}
else{ 当年不是闰年
DaysInYear = 366 + (YearIn4-1 )*365 + DayInMonth1[ CurTime->Month-1 ]+ CurTime->Date-1;
}
TotalDays = YearOn4 * 1461 + DaysInYear; //1980-1-1以来的总天数
TimeCount = CurTime->Hour * 3600 + CurTime->Minute * 60 + CurTime->Second; //一天内的总秒数
TimeCount += ( u32 ) ( TotalDays * 86400 ); //总天数对应的秒数。
return TimeCount;}
3、Time_CountToTime()函数的设计
这个代码的作用是从时钟计数值经过计算得出年月日、星期和时分秒信息。
void Time_CountToTime(u32 Count, TimeStruct* CurTime){ //时间格式转换
u32 TotalDays,TotalSeconds; //1980-1-1以来的总天数和一天以内走过的秒数
u16 YearIndex,DaysIn4Year,DaysIn3Year;
//年索引、非整4年剩余天数、除闰年后一年内剩余天数。
u8 MonthIndex,DayIndex,Num4Year; //月索引、天索引、整四年的数目。
TotalSeconds = ( u16 )( Count % SEC1DAY );//一天以内走过的秒数
CurTime->Hour = ( u8 )( TotalSeconds/3600 );
CurTime->Minute = (u8) ( (TotalSeconds%3600)/60 );
CurTime->Second = (u8) ( (TotalSeconds%3600 )%60 ); //得到时分秒信息
TotalDays = ( Count/SEC1DAY ); //1980-1-1以来的总天数
CurTime->Week = (u8)( (TotalDays + WEEK1980)%7 );//星期的索引,0代表星期一;
Num4Year = (u8) ( TotalDays/DAYS4YEAR ); // 整四年的数目
DaysIn4Year = ( u16 )( TotalDays% DAYS4YEAR );//非整4年剩余天数除闰年后一年内剩余天数
if ( DaysIn4Year<366 ){ //该年为闰年
MonthIndex = Time_GetMonth ( DaysIn4Year, DayInMonth1 );//查表得月索引号
YearIndex = (u16) ( 1980 + Num4Year*4 );
DayIndex = DaysIn4Year-DayInMonth1[MonthIndex-1]; //一年内天数-整月对应天数=月内天数
}
else {
DaysIn3Year = ( DaysIn3Year-366)%365 ; //除闰年后一年内剩余天数
MonthIndex = Time_GetMonth ( DaysIn3Year, DayInMonth2 );
YearIndex=(u16) ( 1980 + Num4Year*4 + 366 + ( DaysIn4Year-366)/365 );
DayIndex = DaysIn3Year-DayInMonth2[MonthIndex-1]; }
CurTime->Year = YearIndex;
CurTime->Month = MonthIndex;
CurTime->Date = DayIndex+1;
}
用户963415 2010-4-4 15:41