STM32
直播中

周彦楠

7年用户 169经验值
私信 关注
[问答]

如何读懂FAT32文件系统

unsigned char FAT_Init(void)//Initialize of FAT  need initialize SD first
{      
bootsector710 *bs  = 0;
bpb710        *bpb = 0;     
partrecord    *pr  = 0;
DWORD hidsec=0;
u32 Capacity;  
Capacity = SD_GetCapacity();      
if(Capacity<0xff)return 1;     
if(SD_ReadSingleBlock(0,fat_buffer))return 2;
bs = (bootsector710 *)fat_buffer;
pr = (partrecord *)((partsector *)fat_buffer)->psPart;//first partition
hidsec = pr->prStartLBA;//the hidden sectors
if(hidsec >= Capacity/512)hidsec = 0;  
else
{
  if(SD_ReadSingleBlock(pr->prStartLBA,fat_buffer))return 3;//read the bpb sector
  bs = (bootsector710 *)fat_buffer;
  if(bs->bsJump[0]!=0xE9 && bs->bsJump[0]!=0xEB)
  {
   hidsec = 0;
   if(SD_ReadSingleBlock(0,fat_buffer))return 4;//read the bpb sector
   bs = (bootsector710 *)fat_buffer;
  }
}   
if(bs->bsJump[0]!=0xE9 && bs->bsJump[0]!=0xEB)return 5;//对付没有bootsect的sd卡 //dead with the card which has no bootsect
bpb = (bpb710 *)bs->bsBPB;
if(bpb->bpbFATsecs)//detemine thd FAT type  //do not support FAT12
{
  FAT32_Enable=0; //FAT16
  FATsectors   = bpb->bpbFATsecs;//FAT表占用的扇区数
  FirstDirClust = 2;
}
else
{
  FAT32_Enable=1; //FAT32
  FATsectors   = bpb->bpbBigFATsecs;//FAT占用的扇区数
  FirstDirClust = bpb->bpbRootClust;
}
BytesPerSector = bpb->bpbBytesPerSec;      //每扇区字节数
SectorsPerClust = (BYTE)bpb->bpbSecPerClust;//每簇扇区数
FirstFATSector = bpb->bpbResSectors+hidsec;//第一个FAT表扇区
RootDirCount = bpb->bpbRootDirEnts;  //根目录项数
RootDirSectors = (RootDirCount*32)>>9;  //根目录占用的扇区数
FirstDirSector = FirstFATSector+bpb->bpbFATs*FATsectors;//第一个目录扇区
FirstDataSector = FirstDirSector+RootDirSectors;//第一个数据扇区
return 0;
}  
原子哥和各位武林高手打扰了,最近在学习你的FAT32文件系统,有史以来的难啊,好多句子着实读不懂,望原子哥解惑一下,感激不尽,我简单的解释一下我对初始化的理解“是将FAT32的文件格式拷贝到SD卡里面”,对吗?
bootsector710 *bs  = 0;   这个定义是不是定义一个指向数据结构bootsector710的结构体指针*bs?
bs = (bootsector710 *)fat_buffer; 这个语句的意思是结构体bootsector710 的指针bs指向数据缓存区?可不可以直接写为bs=fat_buffer?
pr = (partrecord *)((partsector *)fat_buffer)->psPart;//first partition这个句子怎么解释呢?
if(bs->bsJump[0]!=0xE9 && bs->bsJump[0]!=0xEB)return 5;//对付没有bootsect的sd卡 //dead with the card which has no bootsect
这个句子我觉得是 if(bs->bsJump[0]=0xE9 && bs->bsJump[0]=0xEB)return 5;是判断当前扇区是不是DBR所在的分区,如果是,当前扇区为DBR分区,如果不是,当前扇区为MBR分区,对吗?
bpb = (bpb710 *)bs->bsBPB;这个句子怎么解释呢?
期望原子哥和各位爱心人士的回答,如果我的问题太简单,请不要见笑,我是菜鸟。那位高人要是系统的解释一下这个初始化函数,那再好不过了,先致谢了。


回帖(1)

王耀昱

2019-7-22 06:42:36
谢谢原子哥的热心回答,听原子哥一说,“如拨云雾而见青天”,豁然开朗啊,再次致谢
举报

更多回帖

发帖
×
20
完善资料,
赚取积分