基于51单片机FAT32文件系统程序.docx
- 文档编号:9852438
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:78
- 大小:33.68KB
基于51单片机FAT32文件系统程序.docx
《基于51单片机FAT32文件系统程序.docx》由会员分享,可在线阅读,更多相关《基于51单片机FAT32文件系统程序.docx(78页珍藏版)》请在冰点文库上搜索。
基于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;i { znFAT_Buffer[i]=0; } for(iSec=SOC(Cluster);iSec { znFAT_WriteSector(iSec,znFAT_Buffer); } } #endif /*********************************************************************** -功能描述: 获取剩余容量 -隶属模块: znFAT文件系统模块 -函数属性: 外部,使用户使用 -参数说明: 无 -返回说明: 剩余容量,单位字节 -注: 从FSInfo中读取空闲簇数,而从计算得到
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 FAT32 文件系统 程序