ImageVerifierCode 换一换
格式:DOCX , 页数:78 ,大小:33.68KB ,
资源ID:23844996      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/23844996.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于51单片机FAT32文件系统程序.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

1、基于51单片机FAT32文件系统程序基于51单片机FAT32文件系统程序#ifndef _ZNFAT_H_#define _ZNFAT_H_#include mytype.h /类型重定义/*/ /znFAT的裁减宏-/#define ZNFAT_ENTER_DIR /有此宏,函数 znFAT_Enter_Dir() 参与编译#define ZNFAT_OPEN_FILE /有此宏,函数 znFAT_Open_File() 参与编译/#define ZNFAT_SEEK_FILE /有此宏,函数 znFAT_Seek_File() 参与编译/#define ZNFAT_READ_FILE /有

2、此宏,函数 znFAT_Read_File() 参与编译/#define ZNFAT_READ_FILEX /有此宏,函数 znFAT_Read_FileX() 参与编译/#define ZNFAT_ADD_DAT /有此宏,函数 znFAT_Add_Dat() 参与编译/#define ZNFAT_CREATE_DIR /有此宏,函数 znFAT_Create_Dir() 参与编译/#define ZNFAT_CREATE_FILE /有此宏,函数 znFAT_Create_File() 参与编译/#define ZNFAT_DEL_FILE /有此宏,函数 znFAT_Del_File()

3、 参与编译/#define ZNFAT_XCOPY_FILE /有此宏,函数 znFAT_XCopy_File() 参与编译/#define ZNFAT_RENAME_FILE /有此宏,函数 znFAT_Rename_File() 参与编译/#define ZNFAT_GET_TOTAL_SIZE /有此宏,函数 znFAT_Get_Total_Size() 参与编译/#define znFAT_GET_REMAIN_CAP /有此宏,函数 znFAT_Get_Remain_Cap() 参与编译#include cj.h#include cj.h/-#define SOC(c) (c-pAr

4、g-FirstDirClust)*(pArg-SectorsPerClust)+pArg-FirstDirSector) / 用于计算簇的开始扇区#define CONST const/设备表#define SDCARD 0 /SD卡#define UDISK 1 /U盘#define CFCARD 2 /CF卡#define OTHER 3 /其它 /这里的存储设备表,可以灵活扩充,以实现对更多存储设备的支持/-#define MAKE_FILE_TIME(h,m,s) (unsigned int)h)11)+(unsigned int)m)1) /* 生成指定时分秒的文件时间数据 */#d

5、efine MAKE_FILE_DATE(y,m,d) (unsigned int)y)+20)9)+(unsigned int)m)5)+(unsigned int)d) /* 生成指定年月日的文件日期数据 */DPT:分区记录结构如下struct PartRecord UINT8 Active; /0x80表示此分区有效 UINT8 StartHead; /分区的开始磁头 UINT8 StartCylSect2;/开始柱面与扇区 UINT8 PartType; /分区类型 UINT8 EndHead; /分区的结束头 UINT8 EndCylSect2; /结束柱面与扇区 UINT8 St

6、artLBA4; /分区的第一个扇区 UINT8 Size4; /分区的大小 ;/MBR:分区扇区(绝对0扇区)定义如下struct PartSector UINT8 PartCode446; /MBR的引导程序 struct PartRecord Part4; /4个分区记录 UINT8 BootSectSig0; /55 UINT8 BootSectSig1; /AA;/znFAT中对BPB的定义如下 一共占用90个字节struct znFAT_BPB UINT8 BS_jmpBoot3; /跳转指令 offset: 0 UINT8 BS_OEMName8; / offset: 3 UIN

7、T8 BPB_BytesPerSec2;/每扇区字节数 offset:11 UINT8 BPB_SecPerClus1; /每簇扇区数 offset:13 UINT8 BPB_RsvdSecCnt2; /保留扇区数目 offset:14 UINT8 BPB_NumFATs1; /此卷中FAT表数 offset:16 UINT8 BPB_RootEntCnt2; /znFAT为0 offset:17 UINT8 BPB_TotSec162; /znFAT为0 offset:19 UINT8 BPB_Media1; /存储介质 offset:21 UINT8 BPB_FATSz162; /znFA

8、T为0 offset:22 UINT8 BPB_SecPerTrk2; /磁道扇区数 offset:24 UINT8 BPB_NumHeads2; /磁头数 offset:26 UINT8 BPB_HiddSec4; /FAT区前隐扇区数 offset:28 UINT8 BPB_TotSec324; /该卷总扇区数 offset:32 UINT8 BPB_FATSz324; /一个FAT表扇区数 offset:36 UINT8 BPB_ExtFlags2; /znFAT特有 offset:40 UINT8 BPB_FSVer2; /znFAT特有 offset:42 UINT8 BPB_Roo

9、tClus4; /根目录簇号 offset:44 UINT8 FSInfo2; /保留扇区FSINFO扇区数offset:48 UINT8 BPB_BkBootSec2; /通常为6 offset:50 UINT8 BPB_Reserved12; /扩展用 offset:52 UINT8 BS_DrvNum1; / offset:64 UINT8 BS_Reserved11; / offset:65 UINT8 BS_BootSig1; / offset:66 UINT8 BS_VolID4; / offset:67 UINT8 BS_FilSysType11; / offset:71 UIN

10、T8 BS_FilSysType18; /znFAT offset:82;struct znFAT_FAT_Item UINT8 Item4;struct znFAT_FAT struct znFAT_FAT_Item Items128;struct direntry UINT8 deName8; / 文件名,不足部分以空格补充 UINT8 deExtension3; / 扩展名,不足部分以空格补充 UINT8 deAttributes; / 文件属性 UINT8 deLowerCase; / 0 UINT8 deCHundredth; / 世纪 UINT8 deCTime2; / 创建时间

11、UINT8 deCDate2; / 创建日期 UINT8 deADate2; / 访问日期 UINT8 deHighClust2; / 开始簇的高字 UINT8 deMTime2; / 最近的修改时间 UINT8 deMDate2; / 最近的修改日期 UINT8 deLowCluster2; / 开始簇的低字 UINT8 deFileSize4; / 文件大小 ;/znFAT初始化时初始参数装入如下结构体中struct znFAT_Init_Arg UINT8 DEV_No; UINT8 BPB_Sector_No; /BPB所在扇区号 UINT32 Total_Size; /磁盘的总容量

12、UINT32 FirstDirClust; /根目录的开始簇 UINT32 BytesPerSector; /每个扇区的字节数 UINT32 FATsectors; /FAT表所占扇区数 UINT32 SectorsPerClust; /每簇的扇区数 UINT32 FirstFATSector; /第一个FAT表所在扇区 UINT32 FirstDirSector; /第一个目录所在扇区;struct Date UINT16 year; UINT8 month; UINT8 day;struct Time UINT8 hour; UINT8 min; UINT8 sec;struct File

13、InfoStruct UINT8 FileName15; /文件名 UINT32 FileStartCluster; /文件的开始簇 UINT32 FileCurCluster; /文件的当前簇 UINT32 FileSize; /文件大小 UINT32 FileCurSector; /文件的当前扇区 UINT16 FileCurPos; /文件在当前扇区中的位置 UINT32 FileCurOffset; /文件的当前偏移量 UINT32 Rec_Sec; /文件的文件/目录项所在的扇区 UINT16 nRec; /文件的文件/目录项所在扇区中的位置 UINT8 FileAttr; /文件属

14、性 struct Time FileCreateTime; /文件的创建时间 struct Date FileCreateDate; /文件的创建日期 struct Time FileMTime; /文件的修改时间 struct Date FileMDate; /文件的修改日期 struct Date FileADate; /文件的访问日期;struct FSInfo /znFAT的文件系统信息结构 UINT8 Head4; UINT8 Resv1480; UINT8 Sign4; UINT8 Free_Cluster4; UINT8 Last_Cluster4; UINT8 Resv214;

15、 UINT8 Tail2;extern struct znFAT_Init_Arg *pArg; /初始化参数结构体指针,用以指向某一存储设备的初始化参数结构体,由外部提供extern UINT8 Dev_No;/设备号,外部变量/函数声明void znFAT_Device_Init();UINT32 znFAT_Get_Total_Size(void); /获取总容量UINT32 znFAT_Get_Remain_Cap(void); /获取剩余容量void znFAT_Init(void); /文件系统初始化UINT32 znFAT_Enter_Dir(CONST INT8 *path);

16、 /进入目录UINT8 znFAT_Open_File(struct FileInfoStruct *pfi,CONST INT8 *filepath,UINT32 item,UINT8 is_file); /打开文件,支持通配UINT8 znFAT_Seek_File(struct FileInfoStruct *pfi,UINT32 offset); /文件定位 UINT32 znFAT_Read_File(struct FileInfoStruct *pfi,UINT32 offset,UINT32 len,UINT8 *pbuf); /读取文件数据UINT32 znFAT_Read_F

17、ileX(struct FileInfoStruct *pfi,UINT32 offset,UINT32 len,void (*pfun)(UINT8); /读取文件数据并进行数据处理UINT32 znFAT_Add_Dat(struct FileInfoStruct *pfi,UINT32 len,UINT8 *pbuf); /向文件追加数据UINT8 znFAT_Create_Dir(CONST INT8 *dirpath,UINT8 *ptd); /创建目录,支持创建时间UINT8 znFAT_Create_File(struct FileInfoStruct *pfi,CONST IN

18、T8 *filepath,UINT8 *ptd); /创建文件,支持创建时间UINT8 znFAT_Del_File(CONST INT8 *filepath); /删除文件unsigned char znFAT_XCopy_File(struct znFAT_Init_Arg *pArg1,struct znFAT_Init_Arg *pArg2,CONST INT8 *sfilename,CONST INT8 *tfilename,UINT8 *file_buf,UINT32 buf_size,unsigned char *pt); /文件拷贝,支持多设备中文件互拷UINT8 znFAT_

19、File_Close(struct FileInfoStruct *pfi); /文件关闭UINT8 znFAT_Rename_File(CONST INT8 *filename,CONST INT8 *newfilename); /文件重命名#endif#include znfat.h#include sd.h /存储设备的扇区读写驱动,这里是SD卡/#include ch375.h /存储设备的扇区读写驱动,这里是U盘/#include cf.h /存储设备的扇区读写驱动,这里是CF盘#include string.h/全局变量定义struct direntry temp_rec;INT8

20、 temp_dir_name13; UINT32 temp_dir_cluster;UINT32 temp_last_cluster;UINT8 znFAT_Buffer512; /扇区数据读写缓冲区,由外部提供/* - 功能描述:znFAT的存储设备初始化函数 - 隶属模块:znFAT文件系统模块 - 函数属性:外部(用于对存储设备进行初始化) - 参数说明:无 - 返回说明:无 - 注:在调znFAT其它函数之前,必须先对存储设备进行成功的初始化。 */void znFAT_Device_Init() SD_Reset(); SD_Init(); /* - 功能描述:znFAT的存储设备底

21、层驱动接口,读取存储设备的addr扇区的 512个字节的数据放入buf数据缓冲区中 - 隶属模块:znFAT文件系统模块 - 函数属性:内部(用于与存储设备的底层驱动对接) - 参数说明:addr:扇区地址 buf:指向数据缓冲区的指针 - 返回说明:0表示读取扇区成功,否则失败 - 注:这里加入了天狼星精华板上的三种存储设备,即SD卡(有效)、U盘、 CF卡通过在程序中动态的切换不同的设备驱动,从而实现多设备(即同 时对多种存储设备进行操作,比如从SD卡拷贝文件到U盘等等),不同 驱动的切换,只需要在程序中改变Dev_No这个全局变量的值即可 */UINT8 znFAT_ReadSector

22、(UINT32 addr,UINT8 *buf) switch(Dev_No) /由Dev_No来决定所使用的存储设备驱动 case SDCARD: return SD_Read_Sector(addr,buf); break; case UDISK: /return CH375_Read_Sector(addr,buf); break; case CFCARD: /return CF_Read_Sector(addr,buf); break; case OTHER: /return XXX_Read_Sector(addr,buf); break; /* - 功能描述:znFAT的存储设备底

23、层驱动接口,将buf数据缓冲区中的512个 字节的数据写入到存储设备的addr扇区中 - 隶属模块:znFAT文件系统模块 - 函数属性:内部(用于与存储设备的底层驱动对接) - 参数说明:addr:扇区地址 buf:指向数据缓冲区 - 返回说明:0表示读取扇区成功,否则失败 - 注:略 */UINT8 znFAT_WriteSector(UINT32 addr,UINT8 *buf) switch(Dev_No) /由Dev_No来决定所使用的存储设备驱动 case SDCARD: return SD_Write_Sector(addr,buf); break; case UDISK: /r

24、eturn CH375_Write_Sector(addr,buf); break; case CFCARD: /return CF_WriteSector(addr,buf); break; case OTHER: /return XXX_Write_Sector(addr,buf); break; /* - 功能描述:小端转大端,即LittleEndian车BigEndian - 隶属模块:znFAT文件系统模块 - 函数属性:内部 - 参数说明:dat:指向要转为大端的字节序列 len:要转为大端的字节序列长度 - 返回说明:转为大端模式后,字节序列所表达的数据 - 注:比如:小端模式的

25、 0x33 0x22 0x11 0x00 (低字节在前) 转为大端模式后为 0x00 0x11 0x22 0x33 (高字节在前) 所表达的数值为 0x00112233 (CISC的CPU通常是小端的,所以znFAT也设计为小端,而单片机 这种RISC的CPU,通常来说都是大端的,所以需要这个函数将字 节的存放次序进行调整,才能得到正确的数值) */UINT32 LE2BE(UINT8 *dat,UINT8 len) UINT32 temp=0; UINT32 fact=1; UINT8 i=0; for(i=0;ilen;i+) temp+=dati*fact; /将各字节乘以相应的权值后累

26、加 fact*=256; /更新权值 return temp;/* - 功能描述:清空某个簇的所有扇区,填充0 - 隶属模块:znFAT文件系统模块 - 函数属性:内部 - 参数说明:cluster:要清空的簇的簇号 - 返回说明:无 */#ifdef ZNFAT_EMPTY_CLUSTERvoid znFAT_Empty_Cluster(UINT32 Cluster) UINT32 iSec; UINT16 i; for(i=0;iBytesPerSector;i+) znFAT_Bufferi=0; for(iSec=SOC(Cluster);iSecSectorsPerClust;iSec+) znFAT_WriteSector(iSec,znFAT_Buffer); #endif/* - 功能描述:获取剩余容量 - 隶属模块:znFAT文件系统模块 - 函数属性:外部,使用户使用 - 参数说明:无 - 返回说明:剩余容量,单位字节 - 注:从FSInfo中读取空闲簇数,而从计算得到

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

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