FatFs文件系统

创客资料
官方,源码API介绍都在这里

一、前言

1、常见的Windows下的文件系统格式包括FAT32、NTFS、exFAT。在使用文件系统前,要先对存储介质进行格式化。格式化时会在存储介质上新建一个文件分配表和目录。这样,文件系统就可以记录数据存放的物理地址,剩余空间。FAT(file allocate table文件分配表),电脑根据文件系统进行格式化,分展出几个区
2、文件系统的作用:帮助我们管理磁盘,让磁盘可以通过文件目录的形式进行管理(通过在磁盘或者sd卡上做一个文件的结构)。Windows现在里面用的是微软自主开发的NTFS
3、

Window下文件系统 linux下文件系统
FAT12/FAT16/FAT32(32就是文件系统用4字节也就是32位来表示每个扇区配置文件的情形,所以叫FAT32。因此FAT32单个文件不能超过4g,也就是2^32字节。这时可以将U盘格式化为NTFS就可以考进去了),随着时间慢慢从12到32。FAT32也可以在linux上运行 ,12、16应该也可以 ext2/ext3,linux针对磁盘设计的文件系统
exFAT,针对u盘,sd卡,嵌入式闪存(空间浪费小) NFS,网络文件系统(linux大部分就应用在网络上)
NTFS,随着硬盘越来越大,FAT这种不够用,微软又出了这个(微软的专利,linux上基本都不支持),现在电脑里面用的就是这个 jffs2、yaffs(这两个是针对嵌入式设备的)
4、FatFs,一个日本人写的,是面向小型嵌入式系统的一种通用的 FAT 文件系统
5、扇区一直都是最小的读写单位,文件系统就是基于扇区进行管理的,一个簇(文件存储的最小单元)由多个扇区构成。Flash_W25Q128中一个扇区的大小是4k字节。SD卡是512k字节,8g的卡为例,一个簇8个扇区,4k字节。
6、sector扇区
7、可以用来将数据存储到本地中,CSV格式文件,支持用Excel直接打开

二、磁盘原理

1、磁头臂组与CPU进行连接,CPU驱动他操作磁盘里面的信息。一个磁盘里面有N多个盘面组成,针对每个盘面都有一个磁头臂,磁头臂最前面有个读写头,对数据进行读写。一个读写头操作的盘面上的一块区域叫做一个扇区,也是我们磁盘当中的最小管理单元(最小的存储单位,读一次要读512,写一次要写512)。由扇区组成的这样的一个圆叫做磁道。柱面: 每一个磁道就是一个柱面,柱面数就是每一个盘面上有多少个磁道
2、硬盘容量 = 盘面数 × 柱面数 × 扇区数(每一个磁道里面有很多个扇区) × 512字节(每一个扇区存储的容量大小)
3、文件系统就是基于扇区就行管理的
在这里插入图片描述

三、FAT32

简介

微软最早出的文件系统,FAT12/FAT16/FAT32(32就是针对最多不超过32GB,32是九几年产生的),随着时间慢慢从12到32,到现在的NTFS。 下面这个就是SD卡(插在读卡器上)
在这里插入图片描述
虽然是SD卡,文件系统对其进行的操作也是按照磁盘用到的概念进行管理的,SD卡讲的GB,是字节,1GB也就是1×109字节,下面这张是刚格式化后的
在这里插入图片描述
这里的16M就是存储文件系统用到的空间
簇大小
起始扇区号,就是我们要放的第一个文件的起始扇区号

FAT32存储结构

文件系统的作用:帮助我们管理磁盘,让磁盘可以通过文件目录的形式进行管理(通过在磁盘或者sd卡上做一个文件的结构)
在这里插入图片描述

名称 作用
根目录 就是我们看的见的,要用到的目录
数据区 存储在根目录下的数据
操作系统DBR 1、会放置一些基本信息,上面这些信息就是从这里读2、操作系统是放在硬盘里面的,引导CPU启动文件系统。我们不用关心
FAT1 FAT表,帮我们管理数据区,根目录

FAT32文件存储原理

请添加图片描述

怎么管理数据

簇(便于组织文件和目录)———文件存储的最小单元,SD卡里面创建一个文件,文件占用的大小至少为一个簇(在8g的sd卡中,创建一个文件最小占用的空间为8×512byte=4k)
在这里插入图片描述
在sd卡中创建一个文件,虽然大小是100字节,但是占用的空间需要4k(1簇)。后面那些常规信息什么的,详细信息都是存储在根目录里面的在这里插入图片描述

文件分配表FAT

在这里插入图片描述
FAT表格式
文件分配表是按照簇的标号进行放置的,一个簇的信息(下面的对应数据)用32个bit进行表示。比如在2号中,里面填写了3号(就是接下去是3号簇),最后一个里面填了FF。这个文件分配表,可以表示有2的32次个簇
在这里插入图片描述
FAT表解决文件删除/添加问题
在这里插入图片描述
FAT32存储原理
FAT表有两个一样的FAT(FAT1,FAT2),作用是放止其中一个FAT损坏,那还有另外一个可供使用,保证文件系统的可靠性。

在这里插入图片描述
FAT表取值
在这里插入图片描述
根目录下怎么存放文件属性,使用32个字节进行存储。文件的起始簇号也在这里
在这里插入图片描述
在这里插入图片描述
举例
一行就是32个字节,第一个框就是引导区(到55 AA),这个是主的表示
在这里插入图片描述

根目录
在这里插入图片描述

四、FatFS

FatFS介绍

1、FatFs是面向小型嵌入式系统的一种通用的FAT文件系统。它完全是由AISI C语言编写并且完全独立于底层的I/O介质。因此它可以很容易地不加修改地移植到其他的处理器当中,如8051、PIC、AVR、SH、Z80、H8、ARM等。FatFs支持FAT12、FAT16、FAT32等格式。

2、通用的底层驱动接口,就是下面的介质访问接口,再下面就是底层磁盘I/O驱动(STM32的驱动),最终调用的还是HAL驱动
在驱动SD卡时我们只需要在cubeMX中做配置,然后直接应用开发就行了,通信协议是规定了的,命令什么的也是规定好了的,直接朝地址发送数据,等待SD卡数据处理完成就行了。而flash因为要自己写发送接收命令等函数,所以不能通过HAL库直接生成驱动,需要我们进行相应的配置,编写底层驱动接口
在这里插入图片描述
应用接口
在这里插入图片描述
介质访问接口,根据不同设备,我们要配置的就是这几个函数接口(diskio.c)
在这里插入图片描述

五、直接移植

简介

1、下载源码官网
在这里插入图片描述各种版本,下载0.14b
在这里插入图片描述
(1)野火的视频教程
(2)源码文件介绍
在这里插入图片描述

文件 作用
diskio.c 包含底层存储介质的操作函数,这些函数需要用户自己实现,主要添加底层驱动函数
ff.c FatFs核心文件,文件管理的实现方法。该文件独立于底层介质操作文件的函数,利用这些函数实现文件的读写
ffunicode.c 本文件在option目录下,是简体中文支持所需要添加的文件,包含了简体中文的GBK和Unicode相互转换功能函数
ffconf.h 这个头文件包含了对FatFs功能配置的宏定义,通过修改这些宏定义就可以裁剪FatFs的功能。如需要支持简体中文,需要把ffconf.h中的_CODE_PAGE 的宏改成936并把上面的cc936.c文件加入到工程之中。
ffsystem.c 支持RTOS,提供Fatfs功能的线程安全保障功能

2、FatFs在程序中的关系网络
在这里插入图片描述
(1)用户应用程序需要由用户编写,想实现什么功能就编写什么的程序,一般我们只用到f_mount()、f_open()、f_write()、f_read()就可以实现文件的读写操作。这些应用层函数使用方法与标准C的文件操作函数类似。
(2)FatFs组件是FatFs的主体,文件都在源码source文件夹中,我们只需要修改ffconf.h和diskio.c两个文件,实现顶层应用与底层设备驱动的耦合。
(3)底层设备输入输出要求实现存储设备的读写操作函数、存储设备信息获取函数等等。
3、FatFs移植需要用户修改的函数
在这里插入图片描述

具体移植步骤

1、把FatFs的源码拷贝到工程文件夹目录。
2、把源码添加到KEIL5工程中。
3、添加源码的头文件路径。
4、尝试构建程序,解决错误。
a)有部分函数未定义,却使用了,删除即可或去实现对应函数。
5、实现FatFs和底层驱动的接口。
a)disk_status获取设备状态的接口
b)disk_initialize初始化设备接口
c)disk_read、disk_write设备读写接口
d)disk_ioctl设备属性接口
6、修改ffconf.h头文件,配置FatFs文件系统的具体功能。
a)#define FF_USE_MKFS 1使用格式化的功能
b)#define FF_CODE_PAGE 936修改编码页,以支持中文文件名
c)#define FF_USE_LFN 1支持长文件名(开启的话,会占用很多ROM)
d)#define FF_MAX_SS 4096 修改支持最大的设备扇区大小,与FLASH设备对应。

打开(双击工程名)的时候占用100多k,关闭的时候只占15k,字库占用了100多kb,不过在实际使用中,都是会使用长文件名的
在这里插入图片描述
在这里插入图片描述

配置文件讲解

ffconfig.h
教学视频

功能
#define FF_USE_MKFS 0 格式化的功能,一开始可以打开,让flash按照文件系统格式化,好了可以再关闭
FF_CODE_PAGE 936 使文件名支持简体中文
FF_USE_LFN 1 长文件名打开,放在BSS上,如果RAM够大的话,可以选择放在堆栈里,使用堆的话需要配置内存管理函数 ff_memalloc() and ff_memfree(), must be added to the project
#define FF_MAX_SS 4096 修改支持最大的设备扇区大小,与FLASH设备对应

六、具体应用

使用文件系统的流程

1、挂载文件系统到一个设备上(比如,flash,SD卡什么的)。
2、打开一个文件。
3、数据的读取或者写入。
4、操作完成之后,将文件关闭。
就和电脑上差不多,打开文件,写入数据,然后关闭文件
注意事项:
要注意文件指针的位置,对一个文件写完数据后,文件指针会移动到最后,这个时候读就会出错。可以选择将文件关闭再打开,或者使用f_lseek函数移动指针位置。

API

视频
1、f_mkfs

FRESULT f_mkfs (
  const TCHAR* path,  /* [IN] Logical drive number,相当于我们的盘名C: */
  BYTE  opt,          /* [IN] Format options  格式化选项,我们选择FM_FAT32就行了*/
  DWORD au,           /* [IN] Size of the allocation unit 指定单个簇的大小,主播说传512就行了,我觉得不对,一簇应该4k或者8k,如果给0分配大小取决于卷大小,给0就行。SD卡一般8G的为4k,16g的为8k*/
  void* work,         /* [-]  Working buffer 格式化操作需要占用内存空间,这里给他指定一个*/
  UINT len            /* [IN] Size of working buffer 内存空间大小*/
);

res = f_mkfs
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成草

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值