Stm32文件系统FATFS(开始于2021-09-09)

Stm32文件系统FATFS

参考资料主要是原子和野火两家的讲解。

1.FATFS简介:

适合嵌入式小型单片机,是一个 独立 的软件层文件系统,我们只需要将底层硬件的读取函数移植到FATFS提供的向下的接口(Media Access Interface),完成之后,就可以像电脑一样使用文件的操作函数(FATFS提供的向上的供我们使用的API函数 (Application Interface) )。

FAFTS中的函数参数介绍中的,IN表示该参数是传入数值;OUT表示,该参数是介质用于存放需要传出数据的载体。

1)初始化磁盘:

  • 磁盘分区,将一整块(或多块)物理磁盘划分为多个逻辑上的磁盘(C盘/D盘……),或者是(0/1……)。

  • 初始化时在物理磁盘的内存上,最开始的空白区域,会建立一些信息结构(目录,查找转换代码*(把” ……/ …… / ……“的逻辑地址转换成物理地址(第几扇区第几个环道上……地址))* )。

2)系统结构:

  • 文件目录:

    主要存储文件的各种信息,包括地址,名字,大小,位置等等。

2)需要我们提供的底层接口:

要实现的函数有如下图:(但可根据自己所需要的东西选择性实现,但以下五个是一定要的,其中所谓的可选择,是指disk_ioctl函数中部分命令可不实现)

disk_initialize :

  • 主要是使用对应底层的初始化函数;对应的API函数是 f_mount() 函数。

  • 该函数需要返回值是各种定义好的宏,如果对应的初始化函数没有返回值的话,可以采取读取ID芯片来校验是否初始化成功(经常这么干的,像使用mpu6050时就是)。( 也可以直接调用上面的disk_status函数来检测 )

  • 注意:如果底层介质含有低功耗省电模式的话,我们需要同时在这儿函数中加入唤醒函数。

  • disk_write

    • disk_write()的移植与disk_read() 一致,注意移植时的对应的参数即可。

    • 需要注意一点: 在ffconf.h的只读宏 _FS_READONLY 应设置为0, 即关闭只读

    关于该结构体比较多,也比价复杂;需要注意的是其中最后一项定义了一个缓存数组 BYTE win[_MAX_SS] ,如果是512 ( MAX_SS )字节一个扇区的话,这个数组非常大。

    若定义为本地变量的话,极其容易导致栈溢出;所以通常定义为全局变量(该结构体是物理磁盘的文件结构的结构体,通常一个物理磁盘只需一个即可),原子的exfuns.c 中使用的是动太内存分配的方式。

    • FRESULT 多个函数的返回类型(ff.h定义的一个枚举变量,实际是u8的枚举)我们常使用来判断API函数是否成功运行并实现预期效果,该枚举如下如下:

    • FIL 文件对象:(同样,建议为全局或者是动态内存分配)

    • FILINFO 文件信息对象(与文件对象不同,是另外定义的一个结构体)

      同样,建议全局或者是动态内存分配。

    2)API函数使用:

    • 磁盘驱动器初始化(磁盘挂载函数):初始化0盘,1盘等等,取决于path(自己决定,不过常与ff内定义的驱动器的宏一致,0-9).

    • 格式化磁盘,在物理磁盘上建立FAFTS文件系统的架构(目录、文件分配表等)

      注意:格式化后需要重新挂载磁盘,所以需要执行两步:

      1?? 取消挂载 ?f_monut?(?NULL,“0:”,1),即将空设备挂到我们的逻辑磁盘上(相当于清空逻辑磁盘)2?? 重新挂载设备? f_mount( &fs ,”0: ” ,1).

    • 打开文件函数:与c语言相同,注意第三个参数,表示以什么方式(权限)打开。

      当我们需要多种权限时,可以将第三个参数以多个可选参数相| (与)的形式写入

    • 写文件函数

    • 读文件函数

    • 光标重定位函数(常在读写函数后使用,因为读写时光标会移动)

      
                                                              

      声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

  • 上一篇 2021年8月8日
    下一篇 2021年8月8日

    相关推荐