在实现如U盘文件读写,SD卡的文件读写等工作时,我们往往需要一个文件系统来支持我们的工作。特别在一些MCU应用中,文件系统的加入能明显改善系统交互的友好性。在这一篇中,我们就来讨论FatFS文件系统在STM32F4上的移植和应用。
在开始FatFS的移植之前我们需要做一些必要的准备工作。首先需要准备相应的硬件平台,我们在这里使用的是STM32F407VET6的操作平台。USB硬件相关的库的移植工作也已完成。
其次我们还需要准备FatFS的相关源码,在这里我们使用最新的R0.14b版本,该文件可在网站下载:
http://elm-chan.org/fsw/ff/00index_e.html
下载的源码解压后有两个文件夹:document和source,其中document文件夹中是相关的文档资料,与网站上的内容一样,在移植时可以查看这些文档来工作。Source文件夹中则是源码相关的文件,主要包括:

在上图所示的一系列文件中,00readme.txt文件有对各个文件的介绍,我们查看其内容如下:
在这些文件中,ff.c和ff.h是核心文件。ffunicode.c是字符编码,会根据配置文件的配置选择编码。ffsystem.c文件根据自己的需要决定。所以与具体的应用平台相关的,并需要我们来实现的文件是配置文件ffconf.h和磁盘操作文件diskio.h与diskio.c,这几个文件也是我们移植的重点。
我们已经完成了移植的准备工作,接下来就来实现面向大容量U盘的应用移植。前面我们已经说过,移植需要处理的文件是配置文件ffconf.h和磁盘操作文件diskio.h与diskio.c。
关于配置文件ffconf.h其实它本身有一个实例,我们只需要根据需要修改配置就好。这里我们需要修改的配置参数包括:
所支持的编码方式配置参数FF_CODE_PAGE,这个关系到文件编码的问题,我们将其配置为简体中文支持。
逻辑驱动器的数量配置参数FF_VOLUMES,FatFS可以同时应用于多个驱动器,所以我们需要根据实际情况配置驱动器的数量。
时间戳配置参数FF_FS_NORTC,我们大多时候并不需要记录时间戳,所以在这里我们将其关闭。
余下就是实现磁盘IO操作的相关函数,在FatFS的帮助文档中告诉了我们需要实现的函数有两类:一类是磁盘设备控制相关的函数,主要是获取设备状态函数、初始化设备函数、读取数据函数、写入数据函数以及控制设备相关功能函数;二类是实时时钟操作函数,主要是获取当前时间函数。所以实现这6个函数就是移植的主要工作。
磁盘状态检测函数disk_status。用于检测磁盘状态,在ff.c文件中会被调用。其函数原型如下:
DSTATUS disk_status(BYTE drV);
根据其原型定义以及我们USB大容量存储设备的要求,我们可以实现磁盘状态获取函数如下:
/*用于USBH的状态获取函数*/
static DSTATUS USBH_status(BYTE lun)
else
{
res = RES_ERROR;
}
return res;
}
存储媒介初始化函数disk_initialize。用于对磁盘设备进行初始化,在ff.c文件中会被调用。其函数原型如下:
DSTATUS disk_initialize(BYTE drv);
根据其原型定义以及我们USB大容量存储设备的要求,我们可以实现磁盘驱动器初始化函数,但这里我们其实不需要,因为在USB HOST库中已经完成了初始化,所以直接返回正确就可以了。
/*用于USBH的初始化函数*/
static DSTATUS USBH_initialize(BYTE lun)
{
//USB HOST库中已经完成了初始化
return RES_OK;
}
读扇区函数disk_read。用于实现对磁盘数据的读取,根据具体的磁盘IO编写,在ff.c文件中会被调用。其函数原型如下:
DRESULT disk_read(BYTE drv,BYTE*buff,DWORD sector,BYTE.count);
根据其原型定义以及我们USB大容量存储设备的要求,我们可以实现磁盘数据读取函数如下:
static DRESULT (BYTE lun BYTE buff DWORD sector UINT count)
else
}' data-report-click='{"mod":"popu_786","spm":"3001.4249","strategy":"pc_vip_readmore","ab":"new","extra":{"abTest":"t_1"}}'>
