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

2010-3-26 20:12 4668 11 11 分类: MCU/ 嵌入式

 


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

 


十五、编写底层接口程序get_fattime()


 


1、目的


flist命令时,显示各目录项的最后修改时间和日期。


2、先弄清楚目录项中日期和时间的格式:从第十三字节开始。



13


14-15


16-17


18-19


22-23


毫秒数


建立时间


建立日期


最后访问日期


最后写时间


100表示1


 


 


24-25


最后写日期


 


时间格式:0-4位两秒的数量,20代表40秒。5-8位分钟的数量,范围0-59分。11-15位小时的数量,范围0-23小时。


日期格式:0-4位日的数量,范围1-315-8位月的数量,范围1-129-15位,从1980开始的年数,范围0-127 1980-2107年)。


 


3、首先编写从目录项格式转换为通用格式的代码,用在flist函数中。


       首先从源代码中得到文件属性结构体中时间、日期格式。


fno->fdate = LD_WORD(dir+DIR_WrtDate);        /* Date */


fno->ftime = LD_WORD(dir+DIR_WrtTime);              /* Time */


在文件属性结构体中,日期和时间的信息是这样存在的,这个函数可以命名为f_gettime(TimeStruct * , fileinfo*),从文件属性中获取日期和时间,并转换为时间结构体里面的标准格式。


#define SECMASK 0x<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />1F


#define MINMASK 0x7E0


#define HOURMASK 0xF800


#define DATEMASK 0x1F


#define MONTHMASK 0x1E0


#define YEARMASK 0xFE00


 


void f_gettime ( TimeStruct *FileTime, FILINFO *FileAttrib ) {


       u16 FatDate,FatTime;     //源在后面,目标在前面


       FatTime=FileAttrib->ftime;


       FatDate=FileAttrib->fdate;


 


       FileTime->Second = (FatTime & SECMASK ) *2;


       FileTime->Minute = (FatTime & MINMASK ) >>5;


       FileTime->Hour = (FatTime & HOURMASK ) >>11;


       FileTime->Date = FatDate & DATEMASK;


       FileTime->Month = (FatDate & MONTHMASK ) >>5;


       FileTime->Year = ( (FatDate & YEARMASK ) >>9 )+1980;


}


 


4get_fattime()对返回值的要求


                     ps = get_fattime();


                     ST_DWORD(dir+DIR_CrtTime, ps);        /* Created time */


由此可知,返回值是一个32位数,包括时间和日期,日期在高位。因此编写函数如下:


DWORD get_fattime (void){


   u16 FatDate,FatTime;


       u32 RTCCount;


       TimeStruct FileTime;


       RTCCount= RTC_GetCounter(); //获取RTC的当前计数


       Time_CountToTime(RTCCount,&FileTime);//首先获取系统的时间,转换为标准时间格式


       FatTime = (u16)( FileTime.Second/2 );


       FatTime |= (u16)( FileTime.Minute << 5 );


       FatTime |= (u16)( FileTime.Hour << 11 );


       FatDate       =   (u16)( FileTime.Date );


       FatDate       |=  (u16)( FileTime.Month <<5 );


       FatDate       |=  (u16)( FileTime.Year <<9 );


       return (u32)( (FatDate<<16 )+FatTime ); //系统要求的返回格式


}


5、编译、下载


以下图片可以看到显示效果。


点击看大图


 

文章评论0条评论)

登录后参与讨论
我要评论
0
11
关闭 站长推荐上一条 /2 下一条