基于51单片机FAT32文件系统程序.docx

上传人:b****7 文档编号:23844996 上传时间:2023-05-21 格式:DOCX 页数:78 大小:33.68KB
下载 相关 举报
基于51单片机FAT32文件系统程序.docx_第1页
第1页 / 共78页
基于51单片机FAT32文件系统程序.docx_第2页
第2页 / 共78页
基于51单片机FAT32文件系统程序.docx_第3页
第3页 / 共78页
基于51单片机FAT32文件系统程序.docx_第4页
第4页 / 共78页
基于51单片机FAT32文件系统程序.docx_第5页
第5页 / 共78页
点击查看更多>>
下载资源
资源描述

基于51单片机FAT32文件系统程序.docx

《基于51单片机FAT32文件系统程序.docx》由会员分享,可在线阅读,更多相关《基于51单片机FAT32文件系统程序.docx(78页珍藏版)》请在冰豆网上搜索。

基于51单片机FAT32文件系统程序.docx

基于51单片机FAT32文件系统程序

基于51单片机FAT32文件系统程序

#ifndef__ZNFAT_H__

#define__ZNFAT_H__

#include"mytype.h"//类型重定义

/*******************************************************/

//znFAT的裁减宏---------------------------------------------------------

//#defineZNFAT_ENTER_DIR//有此宏,函数znFAT_Enter_Dir()参与编译

#defineZNFAT_OPEN_FILE//有此宏,函数znFAT_Open_File()参与编译

//#defineZNFAT_SEEK_FILE//有此宏,函数znFAT_Seek_File()参与编译

//#defineZNFAT_READ_FILE//有此宏,函数znFAT_Read_File()参与编译

//#defineZNFAT_READ_FILEX//有此宏,函数znFAT_Read_FileX()参与编译

//#defineZNFAT_ADD_DAT//有此宏,函数znFAT_Add_Dat()参与编译

//#defineZNFAT_CREATE_DIR//有此宏,函数znFAT_Create_Dir()参与编译

//#defineZNFAT_CREATE_FILE//有此宏,函数znFAT_Create_File()参与编译

//#defineZNFAT_DEL_FILE//有此宏,函数znFAT_Del_File()参与编译

//#defineZNFAT_XCOPY_FILE//有此宏,函数znFAT_XCopy_File()参与编译

//#defineZNFAT_RENAME_FILE//有此宏,函数znFAT_Rename_File()参与编译

//#defineZNFAT_GET_TOTAL_SIZE//有此宏,函数znFAT_Get_Total_Size()参与编译

//#defineznFAT_GET_REMAIN_CAP//有此宏,函数znFAT_Get_Remain_Cap()参与编译

#include"cj.h"

#include"cj.h"

//----------------------------------------------------------------------

#defineSOC(c)(((c-pArg->FirstDirClust)*(pArg->SectorsPerClust))+pArg->FirstDirSector)//用于计算簇的开始扇区

#defineCONSTconst

//设备表

#defineSDCARD0//SD卡

#defineUDISK1//U盘

#defineCFCARD2//CF卡

#defineOTHER3//其它

//这里的存储设备表,可以灵活扩充,以实现对更多存储设备的支持

//-------------------------------------------

#defineMAKE_FILE_TIME(h,m,s)((((unsignedint)h)<<11)+(((unsignedint)m)<<5)+(((unsignedint)s)>>1))

/*生成指定时分秒的文件时间数据*/

#defineMAKE_FILE_DATE(y,m,d)(((((unsignedint)y)+20)<<9)+(((unsignedint)m)<<5)+((unsignedint)d))

/*生成指定年月日的文件日期数据*/

//DPT:

分区记录结构如下

structPartRecord

{

UINT8Active;//0x80表示此分区有效

UINT8StartHead;//分区的开始磁头

UINT8StartCylSect[2];//开始柱面与扇区

UINT8PartType;//分区类型

UINT8EndHead;//分区的结束头

UINT8EndCylSect[2];//结束柱面与扇区

UINT8StartLBA[4];//分区的第一个扇区

UINT8Size[4];//分区的大小

};

//MBR:

分区扇区(绝对0扇区)定义如下

structPartSector

{

UINT8PartCode[446];//MBR的引导程序

structPartRecordPart[4];//4个分区记录

UINT8BootSectSig0;//55

UINT8BootSectSig1;//AA

};

//znFAT中对BPB的定义如下一共占用90个字节

structznFAT_BPB

{

UINT8BS_jmpBoot[3];//跳转指令offset:

0

UINT8BS_OEMName[8];//offset:

3

UINT8BPB_BytesPerSec[2];//每扇区字节数offset:

11

UINT8BPB_SecPerClus[1];//每簇扇区数offset:

13

UINT8BPB_RsvdSecCnt[2];//保留扇区数目offset:

14

UINT8BPB_NumFATs[1];//此卷中FAT表数offset:

16

UINT8BPB_RootEntCnt[2];//znFAT为0offset:

17

UINT8BPB_TotSec16[2];//znFAT为0offset:

19

UINT8BPB_Media[1];//存储介质offset:

21

UINT8BPB_FATSz16[2];//znFAT为0offset:

22

UINT8BPB_SecPerTrk[2];//磁道扇区数offset:

24

UINT8BPB_NumHeads[2];//磁头数offset:

26

UINT8BPB_HiddSec[4];//FAT区前隐扇区数offset:

28

UINT8BPB_TotSec32[4];//该卷总扇区数offset:

32

UINT8BPB_FATSz32[4];//一个FAT表扇区数offset:

36

UINT8BPB_ExtFlags[2];//znFAT特有offset:

40

UINT8BPB_FSVer[2];//znFAT特有offset:

42

UINT8BPB_RootClus[4];//根目录簇号offset:

44

UINT8FSInfo[2];//保留扇区FSINFO扇区数offset:

48

UINT8BPB_BkBootSec[2];//通常为6offset:

50

UINT8BPB_Reserved[12];//扩展用offset:

52

UINT8BS_DrvNum[1];//offset:

64

UINT8BS_Reserved1[1];//offset:

65

UINT8BS_BootSig[1];//offset:

66

UINT8BS_VolID[4];//offset:

67

UINT8BS_FilSysType[11];//offset:

71

UINT8BS_FilSysType1[8];//"znFAT"offset:

82

};

structznFAT_FAT_Item

{

UINT8Item[4];

};

structznFAT_FAT

{

structznFAT_FAT_ItemItems[128];

};

structdirentry

{

UINT8deName[8];//文件名,不足部分以空格补充

UINT8deExtension[3];//扩展名,不足部分以空格补充

UINT8deAttributes;//文件属性

UINT8deLowerCase;//0

UINT8deCHundredth;//世纪

UINT8deCTime[2];//创建时间

UINT8deCDate[2];//创建日期

UINT8deADate[2];//访问日期

UINT8deHighClust[2];//开始簇的高字

UINT8deMTime[2];//最近的修改时间

UINT8deMDate[2];//最近的修改日期

UINT8deLowCluster[2];//开始簇的低字

UINT8deFileSize[4];//文件大小

};

//znFAT初始化时初始参数装入如下结构体中

structznFAT_Init_Arg

{

UINT8DEV_No;

UINT8BPB_Sector_No;//BPB所在扇区号

UINT32Total_Size;//磁盘的总容量

UINT32FirstDirClust;//根目录的开始簇

UINT32BytesPerSector;//每个扇区的字节数

UINT32FATsectors;//FAT表所占扇区数

UINT32SectorsPerClust;//每簇的扇区数

UINT32FirstFATSector;//第一个FAT表所在扇区

UINT32FirstDirSector;//第一个目录所在扇区

};

structDate

{

UINT16year;

UINT8month;

UINT8day;

};

structTime

{

UINT8hour;

UINT8min;

UINT8sec;

};

structFileInfoStruct

{

UINT8FileName[15];//文件名

UINT32FileStartCluster;//文件的开始簇

UINT32FileCurCluster;//文件的当前簇

UINT32FileSize;//文件大小

UINT32FileCurSector;//文件的当前扇区

UINT16FileCurPos;//文件在当前扇区中的位置

UINT32FileCurOffset;//文件的当前偏移量

UINT32Rec_Sec;//文件的文件/目录项所在的扇区

UINT16nRec;//文件的文件/目录项所在扇区中的位置

UINT8FileAttr;//文件属性

structTimeFileCreateTime;//文件的创建时间

structDateFileCreateDate;//文件的创建日期

structTimeFileMTime;//文件的修改时间

structDateFileMDate;//文件的修改日期

structDateFileADate;//文件的访问日期

};

structFSInfo//znFAT的文件系统信息结构

{

UINT8Head[4];

UINT8Resv1[480];

UINT8Sign[4];

UINT8Free_Cluster[4];

UINT8Last_Cluster[4];

UINT8Resv2[14];

UINT8Tail[2];

};

externstructznFAT_Init_Arg*pArg;//初始化参数结构体指针,用以指向某一存储设备的初始化参数结构体,由外部提供

externUINT8Dev_No;//设备号,外部变量

//函数声明

voidznFAT_Device_Init();

UINT32znFAT_Get_Total_Size(void);//获取总容量

UINT32znFAT_Get_Remain_Cap(void);//获取剩余容量

voidznFAT_Init(void);//文件系统初始化

UINT32znFAT_Enter_Dir(CONSTINT8*path);//进入目录

UINT8znFAT_Open_File(structFileInfoStruct*pfi,CONSTINT8*filepath,UINT32item,UINT8is_file);//打开文件,支持通配

UINT8znFAT_Seek_File(structFileInfoStruct*pfi,UINT32offset);//文件定位

UINT32znFAT_Read_File(structFileInfoStruct*pfi,UINT32offset,UINT32len,UINT8*pbuf);//读取文件数据

UINT32znFAT_Read_FileX(structFileInfoStruct*pfi,UINT32offset,UINT32len,void(*pfun)(UINT8));//读取文件数据并进行数据处理

UINT32znFAT_Add_Dat(structFileInfoStruct*pfi,UINT32len,UINT8*pbuf);//向文件追加数据

UINT8znFAT_Create_Dir(CONSTINT8*dirpath,UINT8*ptd);//创建目录,支持创建时间

UINT8znFAT_Create_File(structFileInfoStruct*pfi,CONSTINT8*filepath,UINT8*ptd);//创建文件,支持创建时间

UINT8znFAT_Del_File(CONSTINT8*filepath);//删除文件

unsignedcharznFAT_XCopy_File(structznFAT_Init_Arg*pArg1,structznFAT_Init_Arg*pArg2,CONSTINT8*sfilename,CONSTINT8*tfilename,UINT8*file_buf,UINT32buf_size,unsignedchar*pt);//文件拷贝,支持多设备中文件互拷

UINT8znFAT_File_Close(structFileInfoStruct*pfi);//文件关闭

UINT8znFAT_Rename_File(CONSTINT8*filename,CONSTINT8*newfilename);//文件重命名

#endif

#include"znfat.h"

#include"sd.h"//存储设备的扇区读写驱动,这里是SD卡

//#include"ch375.h"//存储设备的扇区读写驱动,这里是U盘

//#include"cf.h"//存储设备的扇区读写驱动,这里是CF盘

#include"string.h"

//全局变量定义

structdirentrytemp_rec;

INT8temp_dir_name[13];

UINT32temp_dir_cluster;

UINT32temp_last_cluster;

UINT8znFAT_Buffer[512];//扇区数据读写缓冲区,由外部提供

/******************************************************************

-功能描述:

znFAT的存储设备初始化函数

-隶属模块:

znFAT文件系统模块

-函数属性:

外部(用于对存储设备进行初始化)

-参数说明:

-返回说明:

-注:

在调znFAT其它函数之前,必须先对存储设备进行成功的初始化。

******************************************************************/

voidznFAT_Device_Init()

{

SD_Reset();

SD_Init();

}

/******************************************************************

-功能描述:

znFAT的存储设备底层驱动接口,读取存储设备的addr扇区的

512个字节的数据放入buf数据缓冲区中

-隶属模块:

znFAT文件系统模块

-函数属性:

内部(用于与存储设备的底层驱动对接)

-参数说明:

addr:

扇区地址

buf:

指向数据缓冲区的指针

-返回说明:

0表示读取扇区成功,否则失败

-注:

这里加入了天狼星精华板上的三种存储设备,即SD卡(有效)、U盘、

CF卡通过在程序中动态的切换不同的设备驱动,从而实现多设备(即同

时对多种存储设备进行操作,比如从SD卡拷贝文件到U盘等等),不同

驱动的切换,只需要在程序中改变Dev_No这个全局变量的值即可

******************************************************************/

UINT8znFAT_ReadSector(UINT32addr,UINT8*buf)

{

switch(Dev_No)//由Dev_No来决定所使用的存储设备驱动

{

caseSDCARD:

returnSD_Read_Sector(addr,buf);

break;

caseUDISK:

//returnCH375_Read_Sector(addr,buf);

break;

caseCFCARD:

//returnCF_Read_Sector(addr,buf);

break;

caseOTHER:

//returnXXX_Read_Sector(addr,buf);

break;

}

}

/******************************************************************

-功能描述:

znFAT的存储设备底层驱动接口,将buf数据缓冲区中的512个

字节的数据写入到存储设备的addr扇区中

-隶属模块:

znFAT文件系统模块

-函数属性:

内部(用于与存储设备的底层驱动对接)

-参数说明:

addr:

扇区地址

buf:

指向数据缓冲区

-返回说明:

0表示读取扇区成功,否则失败

-注:

******************************************************************/

UINT8znFAT_WriteSector(UINT32addr,UINT8*buf)

{

switch(Dev_No)//由Dev_No来决定所使用的存储设备驱动

{

caseSDCARD:

returnSD_Write_Sector(addr,buf);

break;

caseUDISK:

//returnCH375_Write_Sector(addr,buf);

break;

caseCFCARD:

//returnCF_WriteSector(addr,buf);

break;

caseOTHER:

//returnXXX_Write_Sector(addr,buf);

break;

}

}

/******************************************************************

-功能描述:

小端转大端,即LittleEndian车BigEndian

-隶属模块:

znFAT文件系统模块

-函数属性:

内部

-参数说明:

dat:

指向要转为大端的字节序列

len:

要转为大端的字节序列长度

-返回说明:

转为大端模式后,字节序列所表达的数据

-注:

比如:

小端模式的0x330x220x110x00(低字节在前)

转为大端模式后为0x000x110x220x33(高字节在前)

所表达的数值为0x00112233

(CISC的CPU通常是小端的,所以znFAT也设计为小端,而单片机

这种RISC的CPU,通常来说都是大端的,所以需要这个函数将字

节的存放次序进行调整,才能得到正确的数值)

******************************************************************/

UINT32LE2BE(UINT8*dat,UINT8len)

{

UINT32temp=0;

UINT32fact=1;

UINT8i=0;

for(i=0;i

{

temp+=dat[i]*fact;//将各字节乘以相应的权值后累加

fact*=256;//更新权值

}

returntemp;

}

/**************************************************************************

-功能描述:

清空某个簇的所有扇区,填充0

-隶属模块:

znFAT文件系统模块

-函数属性:

内部

-参数说明:

cluster:

要清空的簇的簇号

-返回说明:

**************************************************************************/

#ifdefZNFAT_EMPTY_CLUSTER

voidznFAT_Empty_Cluster(UINT32Cluster)

{

UINT32iSec;

UINT16i;

for(i=0;iBytesPerSector;i++)

{

znFAT_Buffer[i]=0;

}

for(iSec=SOC(Cluster);iSecSectorsPerClust;iSec++)

{

znFAT_WriteSector(iSec,znFAT_Buffer);

}

}

#endif

/***********************************************************************

-功能描述:

获取剩余容量

-隶属模块:

znFAT文件系统模块

-函数属性:

外部,使用户使用

-参数说明:

-返回说明:

剩余容量,单位字节

-注:

从FSInfo中读取空闲簇数,而从计算得到

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1