基于51单片机FAT32文件系统程序.doc_第1页
基于51单片机FAT32文件系统程序.doc_第2页
基于51单片机FAT32文件系统程序.doc_第3页
基于51单片机FAT32文件系统程序.doc_第4页
基于51单片机FAT32文件系统程序.doc_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于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 /有此宏,函数 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() 参与编译/#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-parg-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)/* 生成指定时分秒的文件时间数据 */#define 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 startlba4; /分区的第一个扇区 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 uint8 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; /znfat为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_rootclus4; /根目录簇号 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 uint8 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; / 创建时间 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; /磁盘的总容量 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 fileinfostruct uint8 filename15; /文件名 uint32 filestartcluster; /文件的开始簇 uint32 filecurcluster;/文件的当前簇 uint32 filesize; /文件大小 uint32 filecursector; /文件的当前扇区 uint16 filecurpos; /文件在当前扇区中的位置 uint32 filecuroffset; /文件的当前偏移量 uint32 rec_sec; /文件的文件/目录项所在的扇区 uint16 nrec; /文件的文件/目录项所在扇区中的位置 uint8 fileattr; /文件属性 struct time filecreatetime; /文件的创建时间 struct date filecreatedate; /文件的创建日期 struct time filemtime; /文件的修改时间 struct date filemdate; /文件的修改日期 struct datefileadate; /文件的访问日期;struct fsinfo /znfat的文件系统信息结构 uint8 head4; uint8 resv1480; uint8 sign4; uint8 free_cluster4; uint8 last_cluster4; uint8 resv214; 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); /进入目录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_filex(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 int8 *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_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 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的存储设备底层驱动接口,读取存储设备的addr扇区的 512个字节的数据放入buf数据缓冲区中 - 隶属模块:znfat文件系统模块 - 函数属性:内部(用于与存储设备的底层驱动对接) - 参数说明:addr:扇区地址 buf:指向数据缓冲区的指针 - 返回说明:0表示读取扇区成功,否则失败 - 注:这里加入了天狼星精华板上的三种存储设备,即sd卡(有效)、u盘、 cf卡通过在程序中动态的切换不同的设备驱动,从而实现多设备(即同 时对多种存储设备进行操作,比如从sd卡拷贝文件到u盘等等),不同 驱动的切换,只需要在程序中改变dev_no这个全局变量的值即可 */uint8 znfat_readsector(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的存储设备底层驱动接口,将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: /return 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:要转为大端的字节序列长度 - 返回说明:转为大端模式后,字节序列所表达的数据 - 注:比如:小端模式的 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; /将各字节乘以相应的权值后累加 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中读取空闲簇数,而从计算得到剩余的容量,单位字节 */#ifdef znfat_get_remain_capuint32 znfat_get_remain_cap(void) znfat_readsector(1+parg-bpb_sector_no,znfat_buffer); if(struct fsinfo *)znfat_buffer)-free_cluster0=0xff & (struct fsinfo *)znfat_buffer)-free_cluster1=0xff & (struct fsinfo *)znfat_buffer)-free_cluster2=0xff & (struct fsinfo *)znfat_buffer)-free_cluster3=0xff) return parg-total_size; else return le2be(struct fsinfo *)znfat_buffer)-free_cluster,4)*parg-sectorsperclust*parg-bytespersector; #endif/* - 功能描述:将小字字符转为大写 - 隶属模块:znfat文件系统模块 - 函数属性:内部 - 参数说明:c:要转换为大写的字符 - 返回说明:要转换的字节的相应的大写字符 - 注:只对小写字符有效,如果不是az的小写字符,将直接返回 */int8 l2u(int8 c) if(c=a & cpart0).startlba),4); else sec_dbr=0; return sec_dbr;/* - 功能描述:获取分区的总容量 - 隶属模块:znfat文件系统模块 - 函数属性:外部,使用户使用 - 参数说明:无 - 返回说明:分区容量值,单位为字节 - 注:这里得到的总容量是znfat分区的容量,一定小于实际的物理容量 */#ifdef znfat_get_total_sizeuint32 znfat_get_total_size(void) return parg-total_size;#endif/* - 功能描述:读取fsinfo获取最近的一个可用空闲簇 - 隶属模块:znfat文件系统模块 - 函数属性:内部 - 参数说明:无 - 返回说明:最近的一个可用空闲簇 - 注:znfat中的fsinfo扇区(绝对1扇区)中记录了最近的一个可用空闲簇 */uint32 search_last_usable_cluster(void) znfat_readsector(1+parg-bpb_sector_no,znfat_buffer); return le2be(struct fsinfo *)znfat_buffer)-last_cluster,4);/* - 功能描述:znfat文件系统初始化 - 隶属模块:znfat文件系统模块 - 函数属性:外部,使用户使用 - 参数说明:znfat_init_arg类型的结构体指针,用于装载一些重要的参数信息, 以备后面使用 - 返回说明:无 - 注:在使用znfat前,这个函数是必须先被调用的,将很多参数信息装入到 arg指向的结构体中,比如扇区大小、根目录的位置、fat表大小等等。 这些参数绝大部分是来自于dbr的bpb中,因此此函数主要在作对dbr的参数解析 */void znfat_init(void) struct znfat_bpb *bpb; bpb=(struct znfat_bpb *)(znfat_buffer); /将数据缓冲区指针转为struct znfat_bpb 型指针 parg-dev_no=dev_no; /装入设备号 parg-bpb_sector_no =znfat_find_dbr(); /znfat_findbpb()可以返回bpb所在的扇区号 znfat_readsector(parg-bpb_sector_no,znfat_buffer); parg-fatsectors =le2be(bpb-bpb_fatsz32) ,4);/装入fat表占用的扇区数到fatsectors中 parg-firstdirclust =le2be(bpb-bpb_rootclus) ,4);/装入根目录簇号到firstdirclust中 parg-bytespersector =le2be(bpb-bpb_bytespersec),2);/装入每扇区字节数到bytespersector中 parg-sectorsperclust =le2be(bpb-bpb_secperclus) ,1);/装入每簇扇区数到sectorsperclust 中 parg-firstfatsector =le2be(bpb-bpb_rsvdseccnt) ,2)+parg-bpb_sector_no;/装入第一个fat表扇区号到firstfatsector 中 parg-firstdirsector =(parg-firstfatsector)+(bpb-bpb_numfats0)*(parg-fatsectors); /装入第一个目录扇区到firstdirsector中 parg-total_size =le2be(bpb-bpb_totsec32),4)*parg-bytespersector; /磁盘的总容量,单位是字节 temp_last_cluster=search_last_usable_cluster();/* - 功能描述:更新fsinfo中的可用空闲簇的数量 - 隶属模块:znfat文件系统模块 - 函数属性:内部 - 参数说明:plusorminus:可用空闲簇数加1或减1 - 返回说明:无 - 注:创建文件、追加数据、删除文件等操作都可能会使可用的空闲簇数变化 要及时更新 */#ifdef znfat_update_fsinfo_free_cluvoid znfat_update_fsinfo_free_clu(uint32 plusorminus) uint32 free_clu=0; znfat_readsector(1+parg-bpb_sector_no,znfat_buffer); free_clu=(znfat_get_remain_cap()/(parg-sectorsperclust*parg-bytespersector); if(plusorminus) free_clu+; else free_clu-; (struct fsinfo *)znfat_buffer)-free_cluster0=free_clu&0x000000ff;/(uint8 *)&free_clu)0; (struct fsinfo *)znfat_buffer)-free_cluster1=(free_clu&0x0000ff00)8;/(uint8 *)&free_clu)1; (struct fsinfo *)znfat_buffer)-free_cluster2=(free_clu&0x00ff0000)16;/(uint8 *)&free_clu)2; (struct fsinfo *)znfat_buffer)-free_cluster3=(free_clu&0xff000000)24;/(uint8 *)&free_clu)3; znfat_writesector(1+parg-bpb_sector_no,znfat_buffer); #endif/* - 功能描述:更新fsinfo中的下一个可用空闲簇的簇号 - 隶属模块:znfat文件系统模块 - 函数属性:内部 - 参数说明:last_clu:将要更新到fsinfo中的下一个可用空闲簇的簇号 - 返回说明:无 - 注:fsinfo中的下一个可用空闲簇号可以给文件系统一个参考,直接告诉文件系统 下一个可用的空闲簇在什么地方 */#ifdef znfat_update_fsinfo_last_cluvoid znfat_update_fsinfo_last_clu(uint32 last_clu) znfat_readsector(1+parg-bpb_sector_no,znfat_buffer); (struct fsinfo *)znfat_buffer)-last_cluster0=last_clu&0x000000ff;/(uint8 *)&last_clu)0; (struct fsinfo *)znfat_buffer)-last_cluster1=(last_clu&0x0000ff00)8;/(uint8 *)&last_clu)1; (struct fsinfo *)znfat_buffer)-last_cluster2=(last_clu&0x00ff0000)16;/(uint8 *)&last_clu)2; (struct fsinfo *)znfat_buffer)-last_cluster3=(last_clu&0xff000000)24;/(uint8 *)&last_clu)3; znfat_writesector(1+parg-bpb_sector_no,znfat_buffer);#endif/* - 功能描述:获得下一个簇的簇号 - 隶属模块:znfat文件系统模块 - 函数属性:内部 - 参数说明:lastcluster:基准簇号 - 返回说明:lastclutster的下一簇的簇号 - 注:获得下一簇的簇号,就是凭借fat表中所记录的簇链关系来实现的 */#ifdef znfat_getnextclusteruint32 znfat_getnextcluster(uint32 lastcluster) uint32 temp; struct znfat_fat *pfat; struct znfat_fat_item *pfat_item; temp=(lastcluster/128)+parg-firstfatsector); znfat_readsector(temp,znfat_buffer); pfat=(struct znfat_fat *)znfat_buffer; pfat_item=&(pfat-items)lastcluster%128); return le2be(uint8 *)pfat_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论