微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > FATFS文件系统使用分析

FATFS文件系统使用分析

时间:10-02 整理:3721RD 点击:

FATFS文件系统使用分析

-----东方青

一、FATFS文件系统概述

FatFS是一个为小型嵌入式系统设计的通用FAT(File Allocation Table)文件系统模块。FatFs 的编写遵循ANSI C,并且完全与磁盘I/O层分开。因此,它独立(不依赖)于硬件架构。它可以被嵌入到低成本的微控制器中,如AVR, 8051, PIC, ARM, Z80, 68K 等等,而不需要做任何修改。

其主要具有与Windows FAT系统兼、不依赖于任何平台、可移植性高、代码和工作区占用空间非常小等特点。


二、FATFS文件系统移植

1、获取FATFS代码资源

链接地址:http://elm-chan.org/fsw/ff/00index_e.html

以上链接地址即为FATFS官网,其内容简洁易懂,并在最下方可以下载FATFS源码与应用实例。目前最新版本为0.13版。


2、源码列举

下载FATFS源码后,可得到如下图源文件:


其中ff.c为FATFS文件系统重量级的文件,FATFS文件系统的应用操作接口API均在此文件实现,对于移植而言,ff.c文件不需要做任何修改,ffsystem.c和ffunicode.c更不需要任何修改。实际上只有diskio.c和diskio.h文件与底层的硬件操作相关。期内部分别存在以下几个接口:

(1)物理设备状态获取函数:DSTATUS disk_status (BYTE pdrv)


(2)物理设备初始化函数:DSTATUS disk_initialize (BYTE pdrv)


(3)物理设备读一个扇区函数:DRESULT disk_read (BYTE pdrv,BYTE *buff,DWORD sector,UINT count)


(4)物理设备写一个扇区函数:DRESULT disk_write (BYTE pdrv,const BYTE *buff,DWORD sector,UINT count)


(5)物理磁盘控制函数:DRESULT disk_ioctl (BYTE pdrv,BYTE cmd,void *buff)


以上所有均为FATFS文件系统自带的与底层交互的接口,可以看出,一个文件系统可以支持多个存储设备,当需要时只需在对应的接口实现底层函数即可,这使得移植变得很简单。

3、移植FATFS

实际上就是在diskio.c文件提供的接口中实现底层存储设备的操作功能,按照diskio.c文件提供的借款为上层提供应用接口,起到承上启下的作用。

宏定义:


本文所使用的板卡中的SD卡为SPI接口的SD卡,所以其标识宏定义为SDSPIDISK。至此标识SDSPIDISK就代表这个SPI接口的SD卡。

(1)物理设备状态获取函数:DSTATUS disk_status (BYTE pdrv)


(2)物理设备初始化函数:DSTATUS disk_initialize (BYTE pdrv)


(3)物理设备读一个扇区函数:DRESULT disk_read (BYTE pdrv,BYTE *buff,DWORD sector,UINT count)


(4)物理设备写一个扇区函数:DRESULT disk_write (BYTE pdrv,const BYTE *buff,DWORD sector,UINT count)


(5)物理磁盘控制函数:DRESULT disk_ioctl (BYTE pdrv,BYTE cmd,void *buff)


有以上实现可知,所以关于SDSPIDISK设备的接口都是在SD卡驱动中进行实现了,然后就调用其驱动即可。这个可以去分析LPC54110 Board开发板的源代码。关于驱动在此不多说。

那么实际上到了这一步,我们基本上可以确认,对于FATFS文件系统的移植,只需要在底层的驱动中将对应的接口调用,就可以直接使用了。

三、FATFS文件系统的应用编程

1.挂载


其中参数g_fileSystem表示当前挂载的文件系统,driverNumberBuffer代表当前的物理设备,按照磁盘的表示格式,因为定义当前SPI接口的SD卡的标号为SDSPIDISK,宏定义为4,那么代表当前SD卡根分区的标识为”4:/”。其原型如下:


其第3个参数opt表示初始化选项,当opt=0时,表示现在不装载/安装根文件系统;当opt=1时,现在安装根文件系统。

2.实现在SD卡的根分区创建一个文件“hello.c”,并通过接口f_write在文件hello.c中写入字符串”Hello World!\r\n”,然后通过接口f_read将数据读取并打印出来,最后关闭文件。


程序运行后,效果如下图:


如上图效果,成功的实现了在文件系统中操作文件当然,存在的一个问题就是时间不对,例如以上文件的创建时间为2015-1-1,这是因为在系统中还没有实现RTC时间内获取。

3.在SD卡根文件系统中创建一个目录,并在目录中创建一个文件,然后对文件写一段数据,最后再出去出来,打印在串口助手上显示。


程序运行完后,有如下效果:


如上图即为程序运行后的现象了。

4.关于FATFS应用接口的使用

实际上FATFS官网已经为我们提供了非常详细的应用教程和示例,只需要参看这些说明和示例,就完全可以使用FATFS文件系统了,非常简单。

链接地址:http://elm-chan.org/fsw/ff/00index_e.html



简单了解一下                    

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top