前言
相信大家不会对FAT文件系统感到陌生,在Windows上就能够直接操作FAT文件,Fatfs是一个完全免费和开源的文件系统模块,它支持FATl2、FATl6 和FAT32,支持多个存储媒介,有独立的缓冲区,可以对多个文件进行读/写,在嵌入式系统中得到广泛应用。Fatfs有Fatfs和FatFs/Tiny两个版本,FatFs/Tiny占用RAM较小,但是以更慢的读写速度和更少的API函数为代价,下面以Fatfs版本作介绍大家可以从以下链接下载源码:http://elm-chan.org/fsw/ff/00index_e.html。
移植
Fatfs的层次结构如下图所示:
应用层提供了接口函数,如f_open,f_read,f_write和f_close等,用户调用这些接口函数就可以像在PC机上那样读/写文件。
中间层Fatfs模块,实现了FAT文件读/写协议,除非有必要,一般不用修改,使用时将头文件包含进去即可。
移植时需要修改的是Fatfs的底层接口,包括存储媒介读/写接口(disk I/O)和在文件创建时附上修改时间的实时时钟。一般只需要修改ffconf.h、integer.h和diskio.c这三个文件。
ffconf.h存放着模块的配置项,用户可以按照自己的需求来修改这些配置项,下面介绍几个移植时需要注意的配置项。
_FS_TINY:用来配置是否使用FatFs/Tiny版本,这里我用的是FatFs版本,所以把它配置为0;
_FS_READONLY:用来配置是否为只读模式,我需要读写都要用,所以也配置为0;
_FS_MINIMIZE:配置使用的功能数量,可以配置为0~3四个等级,数字越小功能越齐全,这里配置为0,使用所有的功能;
_USE_STRFUNC:设置是否支持字符串类操作,如f_putc,f_puts等,设置这里为1;
_USE_MKFS:是否使能格式化,设置为1;
_USE_FASTSEEK:是否使能快速定位,设置为1,使能快速定位;
_USE_LABEL:设置是否支持磁盘盘符(磁盘名字)读取与设置,我不需要通过相关函数读取或者设置磁盘的名字,所以置0;
_CODE_PAGE:用于设置语言类型,有很多选项可以选择,具体见FATFS官网说明,这里设置为1252,即拉丁文;
_USE_LFN:设置是否支持长文件名(还需要_CODE_PAGE支持),可以设置为0~3,0表示不支持长文件名,1~3是支持长文件名,但是存储地方不一样,我选择0;
_VOLUMES:设置FATFS支持的逻辑设备数目,设置为1,即支持1个设备;
_MAX_SS:扇区缓冲的最大值,一般设置为512。
在integer.h定义好数据类型,这个要根据编译器所使用的数据类型来定,我使用的是MDK-ARM 5.15.0,所以integer.h中的数据定义如下:
/* These types must be 16-bit, 32-bit or larger integer */
typedef int INT;
typedef unsigned int UINT;
/* These types must be 8-bit integer */
typedef signed char CHAR;
typedef unsigned char UCHAR;
typedef unsigned char BYTE;
/* These types must be 16-bit integer */
typedef short SHORT;
typedef unsigned short USHORT;
typedef unsigned short WORD;
typedef unsigned short WCHAR;
/* These types must be 32-bit integer */
typedef long LONG;
typedef unsigned long ULONG;
typedef unsigned long DWORD;
FATFS模块与磁盘I/O 层分开的,因此需要以下函数来实现底层物理磁盘的读写与获取当前时间,底层磁盘I/O 模块并不是FATFS的一部分,并且必须由用户提供。在diskio.c中需要编写的6个驱动函数,如下图所示:
disk_initialize函数:
disk_status函数:
disk_read函数:
disk_write函数:
disk_ioctl函数:
get_fattime函数:
以上的这六个函数要根据实际项目的硬件电路以及所要操作的存储媒介来编写,针对stm32的USB,st公司提供了整套的库和一些例程,配合Fatfs对u盘进行读/写操作,st公司提供的usbh_msc_fatfs.c文件中已完成了对这六个函数的编写,不需要将diskio.c这个文件加到项目中了。
通过以上的修改就完成了Fatfs的移植工作。