STM32F429入门(二十二):SPI-FatFs文件系统

本文详细介绍了如何在STM32嵌入式系统上移植和使用FatFs文件系统,从理解文件系统的基本概念到FatFs的配置、驱动编写、错误排查,再到文件的读写操作和目录管理。通过FatFs,可以方便地对SPI Flash进行文件操作,实现类似于在电脑上的文件管理功能。

使用文件系统可以更好地管理FLASH的存储空间。小型存储器如EEPROM可以直接存储,但是对于FLASH、SD卡等这些大容量的设备时,就需要文件系统来管理。

一、初识文件系统

当需要记录字符时,可以把这些文字转换成ASCII码,存储在数据中,然后调用SPI_FLASH_BufferWrite函数,把数组内容写入到SPI FLASH芯片的指定地址上,在需要的时候从该地址把数据读取出来,再对读出来的数据以ASCII码的格式进行解读。

缺陷:

  • 难以记录有效数据的位置

  • 难以确定存储介质的剩余空间

  • 不明确应以何种格式来解读数据

文件系统,就是对数据进行管理的方式。使用文件系统可以有效地管理存储介质。

使用文件系统时,它为了存储和管理数据,在存储介质建立了一些组织机构,这些结构包括操作系统引导区(windows、Linux等才有)、目录和文件。常见的windows下的文件系统格式包括FAT32\NTFS\exFAT。在使用文件系统前,要先对存储介质进行格式化。格式化时会在存储介质上新建一个文件分配表和目录。这样,文件系统就可以记录数据存放的物理地址,剩余空间。

磁盘分区表:也就是我们电脑中将硬盘分为好几个磁盘。Windows操作系统为了便于用户对磁盘的管理。加入了对磁盘分区的概念,即将一块磁盘逻辑划分为几块,它会把磁盘的分区信息记录到硬盘分区表中。在硬盘分区表中,描述了各个逻辑分区的属性,如分区的开始和结束位置所在的物理地址(柱面号、扇区号),空间大小等信息。

 

文件系统的结构与特性:

使用文件系统时,数据都以文件的形式存储。写入新文件时,先在目录中创建一个文件索引,它指示了文件存放的物理地址,再把数据存储到该地址中。当需要读取数据时,可以从目录中找到该文件的索引,进而在相应的地址中读取出数据。具体还涉及到逻辑地址、簇大小、不连续存储等一系列辅助结构或处理过程。

文件系统的存在使存取数据时,不再是简单地向某物理地址直接读写,而是要遵循它的读写格式。如经过逻辑转换,一个完整地文件可能被分开成多端存储不连续的物理地址,使用目录链表的方式来获取下一段的位置。

文件系统的空间示意图

 目录:记录了文件的开始簇位置、大小等信息。

 文件分配表:(在我看来它更像一个链表的形式)文件a.txt我们根据目录项中指定的a.txt的首簇为2,然后找到文件分配表的第2簇记录,上面登记的是3,就能确定下一簇是3.....直到指向第11簇,发现下一个指向是FF,就是结束。文件便读取完毕。

 如果我们要删除B.txt文件,创建D.txt文件:

 目录将变为:

 文件分配表变为:由于D.txt文件大于B.txt,所以它在后面扩展了新的区域。

 

二、FatFs简介

以上的适用于Windows系统,接下来学习适合在嵌入式领域的文件系统:

由于STM32芯片上面没有系统,所以c语言标准库中操作文件的方式无法实现。所以我们需要FatFs文件系统,c语言标准库如下:c标准库 通过系统接口实现文件操作。

文件的打开操作 fopen 打开一个文件

文件的关闭操作 fclose 关闭一个文件

文件的读写操作 fgetc 从文件中读取一个字符         

                          fputc 写一个字符到文件中去         

                          fgets 从文件中读取一个字符串         

                         fputs 写一个字符串到文件中去        

                         fprintf 往文件中写格式化数据         

                         fscanf 格式化读取文件中数据         

                         fread 以二进制形式读取文件中的数据         

                         fwrite 以二进制形式写数据到文件中去         

                        getw 以二进制形式读取一个整数         

                       putw 以二进制形式存贮一个整数

文件状态检查函数 feof 文件结束          

                             ferror 文件读/写出错          

                            clearerr 清除文件错误标志          

                            ftell 了解文件指针的当前位置

文件定位函数 rewind 反绕        

                      fseek 随机定位

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

我们可以利用前面写好的SPI Flash芯片驱动,把FatFs文件系统代码移植到工程之中,就可以利用文件系统的各种函数,对SPI Flash芯片以”文件“格式进行读写操作。

从FatFs的官网可以下载其源码:FatFs - Generic FAT Filesystem Module (elm-chan.org)

下载下来后,目录结构由帮助文档(doc)和文件系统源码(src)构成:

 

 打开源码我们会看到如下几个文件:

  • integer.h:文件中包含了一些数值类型定义。

  • diskio.c:包含底层存储介质的操作函数,这些函数需要用户自己实现,主要添加底层驱动函数。

  • ff.c:FatFs核心文件,文件管理的实现方法。该文件独立于底层介质操作文件的函数,利用这些函数实现文件的读写。(相当于C语言中的stdio.h)

  • cc936.c:本文在option目录下,是简体中文支持所需要添加的文件,包含了简体志文的GBK和Unicode相互转换功能函数。

  • ffconf.h:这个头文件包含了对FatFs功能配置的宏定义,通过修改这些宏定义就可以裁剪FatFs的功能。如需要支持简体中文,需要把ffconf.h中的_CODE_PAGE的宏改成936并把上面的cc936.c文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

郑烯烃快去学习

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

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

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

打赏作者

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

抵扣说明:

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

余额充值