原创 智林STM32开发板上的FatFS移植过程分析(十三)

2010-3-23 22:07 3360 6 7 分类: MCU/ 嵌入式

 


<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 


十三、开发板RTC时钟的调整程序设计


为什么今天突然转到RTC时钟的程序设计呢?因为文件的操作中有时间设置的要求,先前一直的时候,我直接让f_getfattime()函数返回0,现在文件系统的大部分功能都已经实现了,再调调时间吧。


1Time_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完成转换。


2Time_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" />22,经过的天数为32天,当天不算。415,经过的天数为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;}


 


3Time_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;


}


 


 


 

文章评论1条评论)

登录后参与讨论

用户963415 2010-4-4 15:41

楼主一系列的文章都分析的很好。支持
相关推荐阅读
nthq2004 2010-05-08 20:04
USB自定义设备驱动02
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  本来还想编写应用程序测试一下自定...
nthq2004 2010-05-07 21:35
USB自定义设备驱动01
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  一、USB设备驱动入门1、学习目...
nthq2004 2010-05-04 21:01
智林开发板上实现自定义的USB HID设备
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  一、自定义HID设备的相关概念1...
nthq2004 2010-05-01 21:58
U盘例程在智林开发板上的移植
 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 一、移植前的准备工作1、有哪些操...
nthq2004 2010-04-30 19:19
U盘实现流程跟踪分析02
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />   二、追踪USB大容量设备的实现...
nthq2004 2010-04-27 21:51
U盘实现流程跟踪分析01
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />   一、追踪USB大容量设备的实现...
我要评论
1
6
关闭 站长推荐上一条 /2 下一条