FatFs文件系统使用笔记

本文详细介绍了FATFS文件系统在嵌入式系统中的应用,包括其支持的文件系统类型、文件操作、移植步骤以及SD卡协议与FatFs系统的单位解释。重点讲解了diskio.c中必须实现的接口函数,如disk_initialize和f_open的读写性质,并列举了FATFS的主要API函数,如f_mount和f_open等。同时,澄清了FATFS中的sector与SD卡协议中的block的关系。
摘要由CSDN通过智能技术生成

关于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.hFATFS模块配置文件需要根据需求来配置参数
ff.hFATFS和应用模块公用的包含文件不需要修改
ff.cFATFS模块源码不需要修改
diskio.hFATFS和disk I/O模块公用的包含文件不需要修改
diskio.cFATFS和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)
blocksection
SDa number of bytes, basic data transfer unita number of blocks, basic erase unit
FATFSA “block”, a contiguous number of bytes, is the minimum unit of memory that is read from and written to a disk by a disk driverThe sector is the minimum storage unit of a hard drive

在这里插入图片描述

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值