STM32中FATFS文件系统的使用指南

STM32的FATFS文件系统

一、FATFS简介

  文件系统是为了存储和管理数据,而在存储介质建立的一种组织结构,这些结构包括操作系统引导区、目录和文件。常见的 windows 下的文件系统格式包括 FAT32、NTFS、exFAT。在使用文件系统前,要先对存储介质进行格式化。格式化先擦除原来内容,在存储介质上新建一个文件分配表和目录。这样,文件系统就可以记录数据存放的物理地址,剩余空间。
   使用文件系统时,数据都以文件的形式存储。写入新文件时,先在目录中创建一个文件索引,它指示了文件存放的物理地址,再把数据存储到该地址中。当需要读取数据时,可以从目录中找到该文件的索引,进而在相应的地址中读取出数据。具体还涉及到逻辑地址、簇大小、不连续存储等一系列辅助结构或处理过程。
   文件系统的存在使我们在存取数据时,不再是简单地向某物理地址直接读写,而是要遵循它的读写格式。如经过逻辑转换,一个完整的文件可能被分开成多段存储到不连续的物理地址,使用目录或链表的方式来获知下一段的位置。
  FATFS 是一个完全免费开源的 FAT/exFAT 文件系统模块,专门为小型的嵌入式系统而设计。它完全用标准 C 语言(ANSI C C89)编写,所以具有良好的硬件平台独立性,只需做简单的修改就可以移植到 8051、PIC、AVR、ARM、Z80、RX 等系列单片机上。它支持 FATl2、FATl6 和FAT32,支持多个存储媒介;有独立的缓冲区,可以对多个文件进行读/写,并特别对 8 位单片机和 16 位单片机做了优化。
   FATFS 的特点有:
1.Windows/dos 系统兼容的 FAT/exFAT 文件系统
2. 独立于硬件平台,方便跨硬件平台移植
3. 代码量少、效率高
4.多种配置选项
(1)支持多卷(物理驱动器或分区,最多 10 个卷)
(2)多个 ANSI/OEM 代码页包括 DBCS
(3)支持长文件名、ANSI/OEM 或 Unicode
(4)支持 RTOS
(5)支持多种扇区大小
(6)只读、最小化的 API 和 I/O 缓冲区等
(7)新版的 exFAT 文件系统,突破了原来 FAT32 对容量管理 32Gb 的上限,可支持更巨大的存储

1.使用SPI FLASH直接存储数据
   可以把这些文字转化成ASCII码,存储在数组中,然后调用SPI_FLASH_BufferWrite函数,把数组内容写入到SPI Flash芯片的指定地址上,在需要的时候从该地址把数据读取出来,再对读出来的数据以ASCII码的格式进行解读。

缺点:
(1)难以记录有效数据的位置
(2)难以确定存储介质的剩余空间
(3)不明确应以何种格式来解读数据

2.磁盘分区表
  Windows操作系统为了便于用户对磁盘的管理。加入了磁盘分区的概念,即将一块磁盘逻辑划分为几块,它会把磁盘的分区信息记录到硬盘分区表中。
  在硬盘分区表中,描述了各个逻辑分区的属性,如分区开始和结束位置所在的物理地址(柱面号、扇区号),空间大小等信息。

3.文件系统
文件系统的空间示意图

目录示意图

文件分配表

  文件 a.txt 我们根据目录项中指定的 a.txt 的首簇为 2,然后找到文件分配表的第 2 簇记录,上面登记 的是 3,就能确定下一簇是 3。找到文件分配表的第 3 簇记录,上面登记的 是 4,就能确定下一簇是 4…直到指到第 11 簇,发现下
一个指向是 FF,就是结束。文件便读取完毕。

举例:
(1)文件系统的空间示意图

(2)删除B.TXT文件,创建D.TXT文件后的空间示意图

(3)原目录示意图

(4)删除B.TXT文件,创建D.TXT文件后的目录示意图

(5)原文件分配表示意图

(6)删除B.TXT文件,创建D.TXT文件后的文件分配表示意图

二、FATFS 层次结构图


   最顶层是应用层,使用者无需理会FATFS的内部结构和复杂的FAT协议,只需要调用FATFS模块提供给用户的一系列应用接口函数,如 f_open,f_read,f_write 和 f_close 等,就可以像在PC 上读/写文件那样简单。
   中间层 FATFS 模块,实现了 FAT 文件读/写协议。FATFS 模块提供的是 ff.c 和 ff.h。除非有必要,使用者一般不用修改,使用时将头文件直接包含进去即可。
   需要我们编写移植代码的是 FATFS 模块提供的底层接口,它包括存储媒介读/写接口(diskI/O)和供给文件创建修改时间的实时时钟。

三、应用接口(FatFs为应用程序提供各种文件系统功能,如下所示)


文件访问
f_open-打开/创建文件
f_close-关闭打开的文件
f_read-从文件读取数据
f_write-将数据写入文件
f_lseek-移动读/写指针,扩展大小
f_truncate-截断文件大小
f_sync-刷新缓存的数据
f_forward-将数据转发到流
f_expand-将连续块分配给文件
f_gets-读取字符串
f_putc-写一个字符
f_puts-写一个字符串
f_printf-编写格式化的字符串
f_tell-获取当前的读/写指针
f_eof-测试文件结尾
f_size-获取大小
f_error-测试错误

目录访问
f_opendir-打开目录
f_closedir-关闭打开的目录
f_readdir-读取目录项
f_findfirst-打开目录并读取匹配的第一项
f_findnext-阅读下一个匹配的项目

文件和目录管理
f_stat-检查文件或子目录是否存在
f_unlink-删除文件或子目录
f_rename-重命名/移动文件或子目录
f_chmod-更改文件或子目录的属性
f_utime-更改文件或子目录的时间戳
f_mkdir-创建一个子目录
f_chdir-更改当前目录
f_chdrive-更改当前驱动器
f_getcwd-检索当前目录和驱动器

卷管理和系统配置
f_mount-注册/注销卷的工作区
f_mkfs-在逻辑驱动器上创建FAT卷
f_fdisk-在物理驱动器上创建分区
f_getfree-获取卷上的可用空间
f_getlabel-获取卷标
f_setlabel-设置卷标
f_setcp-设置活动代码页

四、介质访问接口

  由于FatFs模块是独立于平台和存储介质的文件系统层,因此它与物理设备(例如存储卡,硬盘和任何类型的存储设备)完全分开。 低级设备控制模块不是FatFs模块的任何部分,需要由实施者提供。 FatFs通过如下所示的简单媒体访问界面访问存储设备。 下载中还提供了某些平台的示例实现。 此处提供了用于低级磁盘I / O模块的功能检查器。


disk_status-获取设备状态
disk_initialize-初始化设备
disk_read-读取扇区
disk_write-写入扇区
disk_ioctl-控制设备相关的功能
get_fattime-获取当前时间

物联沃分享整理
物联沃-IOTWORD物联网 » STM32中FATFS文件系统的使用指南

发表评论