NXP MCU 技术论坛
直播中

东方青

8年用户 16经验值
擅长:嵌入式技术 处理器/DSP 控制/MCU RF/无线
私信 关注
[经验]

【NXP LPC54114试用体验】FATFS文件系统使用分析

FATFS文件系统使用分析
-----东方青
一、FATFS文件系统概述
FatFS是一个为小型嵌入式系统设计的通用FAT(File Allocation Table)文件系统模块。FatFs 的编写遵循ANSI C,并且完全与磁盘I/O层分开。因此,它独立(不依赖)于硬件架构。它可以被嵌入到低成本的微控制器中,如AVR, 8051, PIC, ARM, Z80, 68K 等等,而不需要做任何修改。
其主要具有与Windows FAT系统兼、不依赖于任何平台、可移植性高、代码和工作区占用空间非常小等特点。
1.png
二、FATFS文件系统移植
1、获取FATFS代码资源
以上链接地址即为FATFS官网,其内容简洁易懂,并在最下方可以下载FATFS源码与应用实例。目前最新版本为0.13版。
2.png
2、源码列举
下载FATFS源码后,可得到如下图源文件:
3.png
其中ff.cFATFS文件系统重量级的文件,FATFS文件系统的应用操作接口API均在此文件实现,对于移植而言,ff.c文件不需要做任何修改,ffsystem.cffunicode.c更不需要任何修改。实际上只有diskio.cdiskio.h文件与底层的硬件操作相关。期内部分别存在以下几个接口:
(1)物理设备状态获取函数:DSTATUS disk_status (BYTE pdrv)
4.png
(2)物理设备初始化函数:DSTATUS disk_initialize (BYTE pdrv)
5.png
(3)物理设备读一个扇区函数:DRESULT disk_read (BYTE pdrv,BYTE *buff,DWORD sector,UINT count)
6.png
(4)物理设备写一个扇区函数:DRESULT disk_write (BYTE pdrv,const BYTE *buff,DWORD sector,UINT count)
7.png
(5)物理磁盘控制函数:DRESULT disk_ioctl (BYTE pdrv,BYTE cmd,void *buff)
8.png
以上所有均为FATFS文件系统自带的与底层交互的接口,可以看出,一个文件系统可以支持多个存储设备,当需要时只需在对应的接口实现底层函数即可,这使得移植变得很简单。
3、移植FATFS
实际上就是在diskio.c文件提供的接口中实现底层存储设备的操作功能,按照diskio.c文件提供的借款为上层提供应用接口,起到承上启下的作用。
宏定义:
9.png
本文所使用的板卡中的SD卡为SPI接口的SD卡,所以其标识宏定义为SDSPIDISK。至此标识SDSPIDISK就代表这个SPI接口的SD卡。
(1)物理设备状态获取函数:DSTATUS disk_status (BYTE pdrv)
10.png
(2)物理设备初始化函数:DSTATUS disk_initialize (BYTE pdrv)
11.png
(3)物理设备读一个扇区函数:DRESULT disk_read (BYTE pdrv,BYTE *buff,DWORD sector,UINT count)
12.png
(4)物理设备写一个扇区函数:DRESULT disk_write (BYTE pdrv,const BYTE *buff,DWORD sector,UINT count)
13.png
(5)物理磁盘控制函数:DRESULT disk_ioctl (BYTE pdrv,BYTE cmd,void *buff)
14.png
有以上实现可知,所以关于SDSPIDISK设备的接口都是在SD卡驱动中进行实现了,然后就调用其驱动即可。这个可以去分析LPC54110 Board开发板的源代码。关于驱动在此不多说。
那么实际上到了这一步,我们基本上可以确认,对于FATFS文件系统的移植,只需要在底层的驱动中将对应的接口调用,就可以直接使用了。
三、FATFS文件系统的应用编程
1.挂载
15.png
其中参数g_fileSystem表示当前挂载的文件系统,driverNumberBuffer代表当前的物理设备,按照磁盘的表示格式,因为定义当前SPI接口的SD卡的标号为SDSPIDISK,宏定义为4,那么代表当前SD卡根分区的标识为”4:/”。其原型如下:
16.png
其第3个参数opt表示初始化选项,当opt=0时,表示现在不装载/安装根文件系统;当opt=1时,现在安装根文件系统。
2.实现在SD卡的根分区创建一个文件“hello.c”,并通过接口f_write在文件hello.c中写入字符串”Hello World!!rn”,然后通过接口f_read将数据读取并打印出来,最后关闭文件。
17.png
程序运行后,效果如下图:
18.png
如上图效果,成功的实现了在文件系统中操作文件当然,存在的一个问题就是时间不对,例如以上文件的创建时间为2015-1-1,这是因为在系统中还没有实现RTC时间内获取。
3.SD卡根文件系统中创建一个目录,并在目录中创建一个文件,然后对文件写一段数据,最后再出去出来,打印在串口助手上显示。
19.png
程序运行完后,有如下效果:
20.png
如上图即为程序运行后的现象了。
4.关于FATFS应用接口的使用
实际上FATFS官网已经为我们提供了非常详细的应用教程和示例,只需要参看这些说明和示例,就完全可以使用FATFS文件系统了,非常简单。
21.png


回帖(2)

王栋春

2017-8-28 12:57:57
简单了解一下                    
举报

lee_st

2018-9-10 15:43:31
模拟U盘没?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分