⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fat.h

📁 STM32_电子相框.rar
💻 H
字号:

#ifndef __FAT_H__
#define __FAT_H__


struct FAT32_DBR
{
uchar BS_jmpBoot[3];  //跳转指令
uchar BS_OEMName[8];
uchar BPB_BytesPerSec[2];  //每扇区字节数
uchar BPB_SecPerClus[1];  //每簇扇区数
uchar BPB_RsvdSecCnt[2];  //保留扇区数目
uchar BPB_NumFATs[1];   //此卷中FAT表数
uchar BPB_RootEntCnt[2];  //FAT32为0
uchar BPB_TotSec16[2];  //FAT32为0
uchar BPB_Media[1];  //存储介质
uchar BPB_FATSz16[2];  //FAT为0
uchar BPB_SecPerTrk[2]; //磁道扇区数
uchar BPB_NumHeads[2];  //磁头数
uchar BPB_HiddSec[4];  //FAT区前隐扇区数
uchar BPB_TotSec32[4];  //该卷总扇区数
uchar BPB_FATSz32[4]; //一个FAT表扇区数
uchar BPB_ExtFlags[2];  //FAT32特有
uchar BPB_FSVer[2];  //FAT32 特有
uchar BPB_RootClus[4];  //根目录簇号
uchar FSInfo[2]; //保留扇区FSINFO扇区数
uchar BPB_BkBootsec[2];  //通常为6
uchar BPB_Reserved[12]; //扩展用
uchar BS_DrvNum[1];
uchar BS_Reserved1[1];
uchar BS_BootSig[1];
uchar BS_VolID[4];
uchar BS_FilSysType[11];
uchar BS_FilSysType[8];  //FAT32
};

struct FAT32_Init_Arg
{
uchar BPB_Sector_No; //BPB所在扇区号
ulong Total_Size;  //磁盘总容量
ulong FirstDirClust; //根目录开始簇
ulong FirstDataSector;  //文件数据开始扇区号
uint BytesPerSector; //每个扇区字节数
uint FATsector;  //FAT表所占扇区数
uint SectorPerClust;  //每簇扇区数
ulong FirstFATSector; 	//第一个FAT表所在扇区
ulong FirstDirSector; //第一个目录所在扇区
ulong RootDirSector; //根目录所占扇区
ulong RootDirCount;  //根目录下的目录与文件数
};

void FAT32_Init(struct FAT32_Init_Arg *arg)
{
struct FAT32_BPB *bpb=(struct FAT32_BPB *)(FAT32_Buffer);
arg.BPB_Sector_No=
arg.Total_Size=
arg.FATsector=LE2BE(bpb.BPBFATSz32,4);
arg.FirstDirClust=LE2BE(bpb.BPB_RootClus,4);
arg.BytesPerSector=LE2BE(bpb.BPB_BytesPerSec,2);
arg.SectorPerClust=LE2BE(bpb.BPB_SecPerClus,1);
arg.FirstFATSector=LE2BE(bpb.BPB_RsvdSecCnt,2)+arg.BPB_Sector_No;
arg.RootDirCount=LE2BE(bpb.BPB_RootEntCnt,2);
arg.RootDirSector=(arg.RootDirCount)*32>>9;
arg.FirstDirSector=(arg.FirstFATSector)+(bpb.BPB_NumFATs[0])*(arg.FATsector);
arg.FirstDataSector=arg.FirstDirSector+arg.RootDirSector;
}

ulong FAT32_GetNextCluster(ulong LastCluster)//当前簇     返回下一簇的簇号
{
	ulong temp;
	temp=((LastCluster/128)+FAT32_Init_Arg.FirstFATSector);
	FAT32_ReadSector(temp,FAT32_Buffer);
	for(i=0;i<4;i++)  dat[i]=FAT32_Buffer[(LastCluster%128)*4+i];
                      temp=LE2BE(dat,4);//FAT表占用扇区数        
	return temp;
}

struct direntry
{
uchar Name[8];  //文件名
uchar Extension[3]; //扩展名
uchar Attributes;  //文件属性
uchar LowerCase; 
uchar Hunderdth;  //创建时间的10毫秒位
uchar Time[2];
uchar Data[2];
uchar LastData[2];
uchar HighClust[2];
uchar ModityTime[2];
uchar ModityData[2];
uchar LowClust[2];
uchar FileSize[4];
}

struct FileInfoStruct
{
uchar FlieName[12];   //文件名
ulong FileStartCluster;  //文件首簇号
ulong FileCurCluster;  //文件当前簇号
ulong FileNextCluster;   //下一簇号
ulong FileSize;   //文件大小
uchar FileAttr;  //文件属性
unsigned short FileCreateTime;
unsigned short FileCreateData;
unsigned short FileModityTime;
unsigned short FileModityData;
unlong FileSector;
uchar FileOffset;
}

struct FileInfoStruct * FAT32_OpenFile(char *filepath)
{
uchar depth=0;
uchar i,index=1;
ulong iFileSec,iCurFileSec,iFile;
struct direntry *pFile;
iCurFileSec=FAT32_Init_Arg.FirstDirSector;





										  
//---------小端模式转大端 ----------------------------------------------
ulong LE2BE(uchar *dat,uchar len)// 指向字节序列的指针 字节序列中的字节数
{
	ulong temp=0,fact=1;
	uchar i=0;
	for(i=0;i<len;i++)
	{
		temp+=dat[i]*fact;
		fact*=256;
	}
	return temp;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -