当前位置:文档之家› FATFS文件系统移植和应用

FATFS文件系统移植和应用

FATFS文件系统的移植
作者:LJ
时间:2010年11月12日
随着信息技术的发展,目前常用文件系统主要有微软的FAT12、FAT16、FAT32、NTES文件系统,以及Linux系统的EXT2、EXT3等。

由于Windows操作系统的广泛应用,当前很多嵌入式产品中用的最多的还是FAT文件系统。

所以,选择一款容易移植和使用,并且占用资源少而功能全面的文件系统就显得非常重要了。

FATFS文件系统是一个完全免费且开源的FAT文件系统模块,由小日本工程师编写,它支持FAT12、FAT16和FAT32文件系统,专门为小型的嵌入式系统而设计。

模块用标准的C语言编写,可以很容易地移植到各种硬件平台。

在“驱动程序”文件夹中有一个“FatFs R0.07c”文件夹,这是官方提供的FATFS文件系统的源码和文档,版本为R0.07c。

打开“doc”文件夹下的“00index_e.html”英文网页文档,里面有FATFS文件系统的全部API函数说明,相对应的应用实例和如何编写硬件接口程序的说明。

如果您的英文不怎么好,建议您先装一个有道词典,使用屏幕取词功能,能帮助我们阅读和理解。

“00index_j.html”则是日文版的网页,毕竟是小日本写的。

“src”文件夹存放有FATFS文件系统源码,下面是该文件夹下各个文件或文件夹存放的内容说明:“ff.h”文件:FATFS文件系统的配置和API函数声明;
“ff.c”文件:FATFS源码;
“diskio.h”文件:FATFS与存储设备接口函数的声明;
“diskio.c”文件:FATFS与存储设备接口函数;
“integer.h”文件:FATFS用到的所有变量类型的定义;
“option”文件夹:存放一些外接函数,下一实例有实际的讲解;
“00readme.txt”文件:FATFS版本及相关信息说明;
编译工程,没有通过,根据编译信息提示在“diskio.c”文件中在几个函数没有定义。

这很正常,因为我们还没有编写文件系统与存储设备的接口函数。

下面来分析“diskio.c”文件中各个函数的功能:“DSTATUS disk_initialize ( BYTE drv )”是存储媒介的初始化函数,由于我们使用的是SD卡,所以实际上是对SD卡的初始化;
“DSTATUS disk_status ( BYTE drv )”状态检测函数,检测是否支持当前的存储设备,支持返回0;
“DRESULT disk_read (BYTE drv, BYTE *buff, DWORD sector, BYTE count)”是读扇区函数,drv是要读扇区的存储媒介号,*buff 存储读取的数据,sector是读数据的开始扇区,count是要读的扇区数。

在SD卡的驱动程序中,分别提供了读一个扇区和读多个扇区的函数。

当count == 1时,用读一个扇区函数;当 count > 1时,用读多个扇区的函数,这样提高了文件系统读效率。

操作成功返回0。

“DRESULT disk_write(BYTE drv, BYTE *buff, DWORD sector, BYTE count)”写扇区函数,drv是要写扇区的存储媒介号,*buff存储写入的数据,sector是写开始扇区,count是要写的扇区数。

同样在SD卡的驱动程序中,分别提供了写一个扇区和写多个扇区的函数。

当count == 1时,用写一个扇区函数;当 count > 1时,用写多个扇区的函数,这样提高了文件系统写效率。

操作成功返回0。

“DRESULT disk_ioctl (BYTE drv, BYTE ctrl, void *buff)”是存储媒介控制函数,drv是存储媒介号,ctrl是控制代码,*buff 存储控制数据,可以在此函数编写自己需要的功能代码。

比如,获得存储媒介的大小,检查存储媒介上电已否,读取存储媒介的扇区数等。

在我们的系统中没有用到,直接返回0。

在“ff.c”文件中,需要用户提供一个“get_fattime”实时时钟函数,要求返回一个32位无符号整数,时钟信息包含如下:Bit31:25 ,年(0..127)从1980年到现在的年数;
Bit24:21,月(1..12);
Bit20:16,日(1..31);
Bit15:11,时(0..23);
Bit10:5,分(0..59);
Bit4:0,秒/2(0..29)
我们没有用到实时时钟,可以直接返回0;最后,在“diskio.c”文件中应包含“SD_Device.h”头文件。

通过上面对文件系统硬件接口函数的修改,再次编译工程,发现BOOL变量类型被重复定义,我们打开“stm32f10x.h”文件,注释掉自行定义的BOOL变量类型,编译通过。

将“ff.h”文件包含到“include.h”文件中。

届时,我们就可以在整个工程里使用FATFS 文件系统了。

相关主题