FatFs文件系统使用笔记

关于FATFS的使用记录

关于FATFS的使用记录

一、提前说明

二、各文件说明

三、使用说明

       3.1 diskio.c函数的编写

       3.2 f_open读写性质说明

       3.3 ff的API函数

四、关于SD卡协议与FatFs系统的单位解释

一、提前说明

  • FatFs 应用范围:

    支持FAT12、FAT16 和FAT32; 可打开的文件:无限制,依赖于有效的存储器; 支持最多 10 个卷; 文件大小:与FAT 类型有关(upto 4G-1 bytes); 卷大小:与FAT 类型有关(upto 2T bytes on 512 bytes/sector); 簇大小:与FAT 类型有关(upto 64K bytes on 512bytes/sector); 扇区大小:与FAT 类型有关(upto 4K bytes)。

  • FAT文件系统依次为:引导扇区、两个文件分配表、根目录区和数据区。

  • 重要的结构体:

    • 文件对象结构体(FIL类型):存放文件的相关信息,打开关闭读写文件等操作时需要使用其指针 ;
    • 目录对象结构体(DIR类型):存放目录的相关信息,对目录操作时需要其指针 ;
    • 文件状态结构体(FILINFO类型):存放文件的大小属性文件名等信息;
    • 文件系统对象结构体(FATFS类型):文件系统对象的参数。
  • 移植步骤:

    • 数据类型:在integer.h 里面去定义好数据的类型。这里需要了解你用的编译器的数 据类型,并根据编译器定义好数据类型;
    • 配置:打开 ffconf.h (我用的FatFs,不是Tiny,可以在此头文件中进行定义),文 件系统的配置裁剪等均在此头文件中进行定义配置;
    • 函数编写:打开diskio.c,进行底层驱动编写,实际上需要编写6 个接口函数(见下方函数具体说明)。

二、各文件说明

文件名 功能 操作说明
ffconf.h FATFS模块配置文件 需要根据需求来配置参数
ff.h FATFS和应用模块公用的包含文件 不需要修改
ff.c FATFS模块源码 不需要修改
diskio.h FATFS和disk I/O模块公用的包含文件 不需要修改
diskio.c FATFS和disk I/O模块接口层文件 与平台相关的代码,需要用户根据平台和存储介质来编写函数
interger.h 数据类型定义 与编译器有关

三、使用说明

3.1 diskio.c函数的编写

1、disk_initialize初始化磁盘驱动器

2、disk_status返回当前磁盘驱动器的状态

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

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

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

6、get_fattime 获取当前时间

3.2 f_open读写性质说明

f_open:创建/打开一个用于访问文件的文件对象

image-20201207200648565

3.3 ff的API函数

FATFS给用户提供了大量的API函数:

函数名称 函数作用
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_closdir 关闭一个已经打开的目录
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 获取卷标签
f_setlabel 设置卷标签
f_mks 在驱动器上创建一个文件系统
f_fdisk 分割物理卷
f_gets 读一个字符串
f_putc 写一个字符
f_puts 写一个字符串
f_printf 写一个格式化的字符串
f_tell 获取当前读/写指针
f_eof 测试文件结束
f_size 获取文件大小
f_error 测试文件上的错误

四、关于SD卡协议与FatFs系统的单位解释

如果使用SD卡,那么在SD2.0协议中明明说block为512字节(bytes)。

那为什么在FatFs中,sector size才是512字节呢?这不是错了吗?

其实文件系统的sector和block 与 SD协议的sector和block含义正好相反

  • 在SD协议中,大小包含关系是:block ⊆ sector
  • 而在FatFs中相反:sector ⊆ blockr

由此可知,在disk_ioctl中GET_SECTOR_SIZE和GET_BLOCK_SIZE,可以有以下关系:

  • 最大:8192 (4096kb / 512bytes)data blocks(SD) == 8192 sector(FatFs) == 1 block(FatFs)
  • 最小:1 data blocks(SD) == 1 sector(FatFs) == 1 block(FatFs)
block section
SD a number of bytes, basic data transfer unit a number of blocks, basic erase unit
FATFS A “block”, a contiguous number of bytes, is the minimum unit of memory that is read from and written to a disk by a disk driver The sector is the minimum storage unit of a hard drive

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/caq_jw/article/details/110833385