没有合适的资源?快使用搜索试试~ 我知道了~
基于51单片机FAT32文件系统程序.doc
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 174 浏览量
2023-06-06
18:41:15
上传
评论
收藏 165KB DOC 举报
温馨提示
试读
39页
基于51单片机FAT32文件系统程序.doc
资源推荐
资源详情
资源评论
基于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)<<5)+(((unsigned int)s)>>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 StartCylSect[2];//开始柱面与扇区
UINT8 PartType; //分区类型
UINT8 EndHead; //分区的结束头
UINT8 EndCylSect[2]; //结束柱面与扇区
UINT8 StartLBA[4]; //分区的第一个扇区
UINT8 Size[4]; //分区的大小
};
//MBR:分区扇区(绝对0扇区)定义如下
struct PartSector
{
UINT8 PartCode[446]; //MBR的引导程序
struct PartRecord Part[4]; //4个分区记录
UINT8 BootSectSig0; //55
UINT8 BootSectSig1; //AA
};
//znFAT中对BPB的定义如下 一共占用90个字节
struct znFAT_BPB
{
UINT8 BS_jmpBoot[3]; //跳转指令 offset: 0
UINT8 BS_OEMName[8]; // offset: 3
UINT8 BPB_BytesPerSec[2];//每扇区字节数 offset:11
UINT8 BPB_SecPerClus[1]; //每簇扇区数 offset:13
UINT8 BPB_RsvdSecCnt[2]; //保留扇区数目 offset:14
UINT8 BPB_NumFATs[1]; //此卷中FAT表数 offset:16
UINT8 BPB_RootEntCnt[2]; //znFAT为0 offset:17
UINT8 BPB_TotSec16[2]; //znFAT为0 offset:19
UINT8 BPB_Media[1]; //存储介质 offset:21
UINT8 BPB_FATSz16[2]; //znFAT为0 offset:22
UINT8 BPB_SecPerTrk[2]; //磁道扇区数 offset:24
UINT8 BPB_NumHeads[2]; //磁头数 offset:26
UINT8 BPB_HiddSec[4]; //FAT区前隐扇区数 offset:28
UINT8 BPB_TotSec32[4]; //该卷总扇区数 offset:32
UINT8 BPB_FATSz32[4]; //一个FAT表扇区数 offset:36
UINT8 BPB_ExtFlags[2]; //znFAT特有 offset:40
UINT8 BPB_FSVer[2]; //znFAT特有 offset:42
UINT8 BPB_RootClus[4]; //根目录簇号 offset:44
UINT8 FSInfo[2]; //保留扇区FSINFO扇区数offset:48
UINT8 BPB_BkBootSec[2]; //通常为6 offset:50
UINT8 BPB_Reserved[12]; //扩展用 offset:52
UINT8 BS_DrvNum[1]; // offset:64
UINT8 BS_Reserved1[1]; // offset:65
UINT8 BS_BootSig[1]; // offset:66
UINT8 BS_VolID[4]; // offset:67
UINT8 BS_FilSysType[11]; // offset:71
UINT8 BS_FilSysType1[8]; //"znFAT " offset:82
};
struct znFAT_FAT_Item
{
UINT8 Item[4];
};
struct znFAT_FAT
{
struct znFAT_FAT_Item Items[128];
};
struct direntry
{
UINT8 deName[8]; // 文件名,不足部分以空格补充
UINT8 deExtension[3]; // 扩展名,不足部分以空格补充
UINT8 deAttributes; // 文件属性
UINT8 deLowerCase; // 0
UINT8 deCHundredth; // 世纪
UINT8 deCTime[2]; // 创建时间
UINT8 deCDate[2]; // 创建日期
UINT8 deADate[2]; // 访问日期
UINT8 deHighClust[2]; // 开始簇的高字
UINT8 deMTime[2]; // 最近的修改时间
UINT8 deMDate[2]; // 最近的修改日期
UINT8 deLowCluster[2]; // 开始簇的低字
UINT8 deFileSize[4]; // 文件大小
};
//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 FileName[15]; //文件名
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 Date FileADate; //文件的访问日期
};
struct FSInfo //znFAT的文件系统信息结构
{
UINT8 Head[4];
UINT8 Resv1[480];
UINT8 Sign[4];
UINT8 Free_Cluster[4];
UINT8 Last_Cluster[4];
UINT8 Resv2[14];
UINT8 Tail[2];
};
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_name[13];
UINT32 temp_dir_cluster;
UINT32 temp_last_cluster;
UINT8 znFAT_Buffer[512]; //扇区数据读写缓冲区,由外部提供
/******************************************************************
- 功能描述: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);
剩余38页未读,继续阅读
资源评论
老帽爬新坡
- 粉丝: 83
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功