基于STM32的SD卡FATFS文件系统学习笔记

在移植文件系统前,首先来掌握一些基本知识(必须掌握的):

一、FATFS文件系统格式分析

搞文件系统,首先要了解一下SD卡里面的结构和分区,如下图

1、引导扇区

引导扇区包含着磁盘和文件系统的许多重要参数。文件管理系统首先要对该扇区的信息进行分析,才能了解当前磁盘上文件系统的格式。

EB 58 90 4D 53 44 4F 53 35 2E 30 00 02 08 20 00 02 00 00 00

00 F8 00 00 3F 00 FF 00 00 0000 0000 34 0F 00 CC 03 00 00

00 00 00 00 02 00 00 00 01 00 06 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 29 22 B0 50 A0 4E 4F 20 4E 41 4D 45 20 20

20 20 46 41 54 33 32 20 20 20 33 C9 8E D1 BC F4 7B 8E C1 8E

11-12字节

每一扇区的字节数

典型为0x00、02,512

13

每簇扇区数

8

14-15

保留扇区数

0x20,00,保留32个扇区

21

介质类型

0xF8,固定介质

32-35

总扇区数

0x00 34 0F 00,十进制996352

36-39

文件分配表所占扇区数

0xCC 03 00 00,972

44-47

根目录所在簇号

02 00 00 00,2号簇

48-49

FSINFO扇区标号

01 00,在1号扇区

50-51

引导扇区的备份扇区号

06 00,在6号扇区

66

扩展引导标志

0x29

82-89

FAT32字符串

46 41 54 33 32 20 20 20

 

 

 

FAT32与FAT12、FAT16区分是通过簇的数量,簇总数=总扇区数-(保留扇区数+分配表扇区数+根目录区扇区数)/每簇扇区数。996352-(32+972*2+0)/8=124297,有12万多簇,肯定是FAT32系统。

在FAT32文件系统,根目录区与普通目录一样,都是位于数据区,比较典型的都是从2号簇开始。数据区起始扇区号=根目录区起始扇区号=保留扇区+2*分配表扇区=32+1944=1976号。3号簇起始就是1984。利用shell命令里的SDRD命令读出来看一下。我编写的这个命令以扇区号为参数,每次读入两个扇区,并以十六进制的形式显示在串口终端上。

体外的知识:

 

 

FAT16 DBR 参数的偏移0x11 处记录了根目录所占扇区的数目。偏移0x16

记录了FAT 表所占扇区的数据。偏移0x10 记录了FAT 表的副本数目。系统在得

到这几项参数以后,就可以确定数据区的开始扇区偏移了。

FAT16 文件系统从根目录所占的32 个扇区之后的第一个扇区开始以簇为单

位进行数据的处理,这之前仍以扇区为单位。对于根目录之后的第一个簇,系

统并不编号为第0 簇或第1 簇 (可能是留作关键字的原因吧),而是编号为第2

簇,也就是说数据区顺序上的第1 个簇也是编号上的第2 簇。

FAT 文件系统之所以有12,16,32 不同的版本之分,其根本在于FAT 表用

来记录任意一簇链接的二进制位数。以FAT16 为例,每一簇在FAT 表中占据2

字节(二进制16 位)。所以,FAT16 最大可以表示的簇号为0xFFFF(十进制的

65535),以32K 为簇的大小的话,FAT32 可以管理的最大磁盘空间为:32KB×

65535=2048MB,这就是为什么FAT16 不支持超过2GB 分区的原因。

FAT 表实际上是一个数据表,以2 个字节为单位,我们暂将这个单位称为

FAT 记录项,通常情况其第1、2 个记录项(前4 个字节)用作介质描述。从第三

个记录项开始记录除根目录外的其他文件及文件夹的簇链情况。根据簇的表现

情况FAT 用相应的取值来描述,见表

 

二,文件系统的移植

1,首先,去网上下载FATFS的源码

2,推荐到http://www.360doc.com/content/12/0708/23/10358948_223078499.shtml 这里,这是一篇写得比较好,比较详细的移植文章。

 

你可能感兴趣的:(STM32的学习)