FatFs文件系统

目录

1:FatFs文件系统结框架

2:FatFs文件系统包结构:

3:FatFs移植步骤

4:Fatfs开放函数:


FatFs:http://elm-chan.org/fsw/ff/00index_e.html

1:FatFs文件系统结框架

 FatFs文件系统

1:底层接口:包括存储媒介读/写接口(disk I/O)和供给文件创建修改时间的实时时钟,需要我们根据平台和存储介质编写移植代码

2:中间层FATFS模块:实现了FAT 文件读/写协议。FATFS模块提供的是ff.c和ff.h。除非有必要,使用者一般不用修改,使用时将头文件直接包含进去即可。

3:应用层:使用者无需理会FATFS的内部结构和复杂的FAT 协议,只需要调用FATFS模块提供给用户的一系列应用接口函数,如f_open,f_read,f_write 和f_close等,就可以像在PC 上读/写文件那样简单。

2:FatFs文件系统包结构:

FatFs文件系统

大部分的可移植的小系统或者应用,都是采用类似这种将与底层打交道的源码开发给用户编写,然后提供顶层配置文件供配置

  • diskio.c和diskio.h是硬件层。
  • ff.c和ff.h是FatFs的文件系统层和文件系统的API层。
  • FATFS模块在移植的时候,我们一般只需要修改2个文件,即ffconf.h和diskio.c。FATFS模块的所有配置项都是存放在ffconf.h里面,我们可以通过配置里面的一些选项,来满足自己的需求。diskio.c是硬件层,负责与底层硬件接口适配。
  • ffconf.h里面有很多FATFS关键配置文件,比如说通过标志位来标志是否为只读,是否支持字符串类操作等等

3:FatFs移植步骤

1:数据类型:在integer.h 里面去定义好数据的类型。这里需要了解你用的编译器的数据类型,并根据编译器定义好数据类型。

2:配置:通过ffconf.h配置FATFS的相关功能,以满足你的需要。

3:函数编写:打开diskio.c,进行底层驱动编写,一般需要编写6 个接口函数

FatFs文件系统

disk_initialize:初始化磁盘驱动器

The disk_initialize function is called to initializes the storage device.

DSTATUS disk_initialize (
  BYTE pdrv           /* [IN] Physical drive number */
);:
函数参数:指定要初始化的逻辑驱动器号,即盘符,应当取值0-9
函数会返回一个磁盘状态作为结果,对于一些细节

disk_status:返回当前磁盘驱动器状态

The disk_status function is called to inquire the current drive status.

DSTATUS disk_status (
  BYTE pdrv     /* [IN] Physical drive number */  //指定要确认的逻辑驱动器号,即盘符,应当取值0-9
);

disk_read:从磁盘驱动器上读取扇区

The disk_read function is called to read data from the sector(s) of storage device.

DRESULT disk_read (
  BYTE pdrv,     /* [IN] Physical drive number */                  //指定逻辑驱动器号即盘符0-9
  BYTE* buff,    /* [OUT] Pointer to the read data buffer */       //指向存储读取数据字节数组的指针,需要为所读取字节数的大指向存储读取数据字节数组的指针,需要为所读取字节数的大小,扇区统计的扇区大小是需要的                          
  LBA_t sector,  /* [IN] Start sector number */                    //指定起始扇区的逻辑块(LBA)上的地址
  UINT count     /* [IN] Number of sectros to read */              //指定要读取的扇区数,取值1~128
);

disk_write:向磁盘写入一个或多个扇区

The disk_write function is called to write data to the sector(s) of storage device.

DRESULT disk_write (
  BYTE pdrv,        /* [IN] Physical drive number */              //指定逻辑驱动器号即盘符0-9
  const BYTE* buff, /* [IN] Pointer to the data to be written */  //指向要写入字节数组的指针,注:FatFs指定的内存地址并不总是字对齐的,如果硬件不支持不对齐的数据传输,函数里需要进行处理
  LBA_t sector,     /* [IN] Sector number to write from */        //指定起始扇区的逻辑块(LBA)上的地址
  UINT count        /* [IN] Number of sectors to write */         //指定要读取的扇区数,取值1~128
);

disk_ioctl:控制设备指定特性和除了读/写外的杂项功能

The disk_ioctl function is called to control device specific features and miscellaneous functions other than generic read/write.

DRESULT disk_ioctl (
  BYTE pdrv,     /* [IN] Drive number */                        //指定逻辑驱动器号即盘符0-9
  BYTE cmd,      /* [IN] Control command code */                //指定命令代码
  void* buff     /* [I/O] Parameter and data buffer */          //指向参数缓冲区的指针,取决于命令代码,不使用时,指定一个NULL指针
);

get_fattime:获取当前时间

The get_fattime function is called to get the current time.

DWORD get_fattime (void);

以上函数都在ff.c文件中

 

4:Fatfs开放函数:

f_mount - 注册/注销一个工作区域(Work Area)

f_open - 打开/创建一个文件

f_close - 关闭一个文件

f_read - 读文件

f_write - 写文件

f_lseek - 移动文件读/写指针

f_truncate -截断文件

f_sync -  冲洗缓冲数据 Flush Cached Data

f_forward - 直接转移文件数据到一个数据流

f_stat - 获取文件状态

f_opendir - 打开一个目录

f_closedir -关闭一个已经打开的目录

f_readdir - 读取目录条目

f_mkdir - 创建一个目录

f_unlink -删除一个文件或目录

f_chmod -  改变属性(Attribute)

f_utime -改变时间戳(Timestamp)

f_rename - 重命名/移动一个文件或文件夹

f_chdir - 改变当前目录

f_chdrive - 改变当前驱动器

f_getcwd -  获取当前工作目录

f_getfree - 获取空闲簇 Get Free Clusters

f_getlabel - Get volume label

f_setlabel - Set volume label

f_mkfs - 在驱动器上创建一个文件系统

f_fdisk - Divide a physical drive

f_gets - 读一个字符串

f_putc - 写一个字符

f_puts - 写一个字符串

f_printf - 写一个格式化的字符串

f_tell - 获取当前读/写指针

f_eof - 测试文件结束

f_size - 获取文件大小

f_error - 测试文件上的错误