历史上的今天
返回首页

历史上的今天

今天是:2024年09月28日(星期六)

2019年09月28日 | 再造STM32---第二十一部分:串行FLASH文件系统 FatFs

2019-09-28 来源:eefocus

21.1 文件系统简介:

使用SPI FLASH直接存储数据:


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

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

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

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


Windows上的文件系统:

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

文件系统在计算机中的表现形式:

磁盘的物理结构:

       使用文件系统时, 它为了存储和管理数据,在存储介质建立了一些组织结构,这些结构包括操作系统引导区、目录和文件。


常见的windows下的文件系统格式包括FAT32、 NTFS、 exFAT。

       在使用文件系统前,要先对存储介质进行格式化。 格式化时会在存储介质上新建一个文件分配表和目录。这样,文件系统就可以记录数据存放的物理地址,剩余空间。


磁盘分区表:

       Windows操作系统为了便于用户对磁盘的管理。加入了磁盘分区的概念,即将一块磁盘逻辑划分为几块,它会把磁盘的分区信息记录到硬盘分区表中。

       在硬盘分区表中,描述了各个逻辑分区的属性,如分区开始和结束位置所在的物理地址(柱面号、扇区号),空间大小等信息。


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

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

文件系统的结构与特性


文件系统的空间示意图

存储了A.TXT,B.TXT, C.TXT文件


目录示意图

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


文件系统的空间示意图

存储了A.TXT,B.TXT, C.TXT文件

文件分配表

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

文件系统的空间示意图

删除B.TXT文件,创建D.TXT文件后的空间示意图

原目录示意图

删除B.TXT文件,创建D.TXT文件后的目录示意图

原文件分配表示意图

删除B.TXT文件,创建D.TXT文件后的文件分配表示意图

21.2 FatFs文件系统简介:

一、C语言中的文件操作

文件的打开操作


fopen 打开一个文件

文件的关闭操作


fclose 关闭一个文件

文件的读写操作


fgetc 从文件中读取一个字符

fputc 写一个字符到文件中去

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

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

fprintf 往文件中写格式化数据

fscanf 格式化读取文件中数据

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

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

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

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

文件状态检查函数


feof 文件结束

ferror 文件读/写出错

clearerr 清除文件错误标志

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

文件定位函数


rewind 反绕

fseek 随机定位


二、FATFS文件系统简介:

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

        FatFs文件系统的源码可以从fatfs官网下载:

http://elm-chan.org/fsw/ff/00index_e.html

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


三、FatFs的目录结构:

 

         下载FatFs源码包解压后,在doc 文件夹里面是一些使用帮助文档;在src 是FatFs文件系统的源代码。


四、FatFs帮助文档:

       其中 en 和 ja 这两个文件夹里面是编译好的html文档,讲的是FATFS里面各个函数的使用方法。 00index_e.html和00index_j.html是一些关于FATFS的简介。 

21.3 FATFS源码:

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

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

• ff.c: FatFs核心文件,文件管理的实现方法。该文件独立于底层介质操作文件的函数,利用这些函数实现文件的读写。

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

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

        建议阅读这些源码的顺序为: integer.h --> diskio.c --> ff.c 。阅读文件系统源码ff.c文件需要一定的功底, 建议先阅读FAT32的文件格式,再去分析ff.c文件。若仅为了使用文件系统,则只需要理解integer.h及diskio.c文件并会调用ff.c文件中的函数就可以了。



FatFs在程序中的关系网络:

• 用户应用程序需要由用户编写,想实现什么功能就编写什么的程序,一般我们只用到f_mount()、 f_open()、 f_write()、 f_read()就可以实现文件的读写操作。 这些应用层函数使用方法与标准C的文件操作函数类似。

• FatFs组件是FatFs的主体,文件都在源码src文件夹中,其中ff.c、 ff.h、integer.h以及diskio.h四个文件我们不需要改动,只需要修改ffconf.h和diskio.c两个文件。

• 底层设备输入输出要求实现存储设备的读写操作函数、存储设备信息获取函数等等。



FatFs移植需要用户支持函数:


推荐阅读

史海拾趣

Avic公司的发展小趣事

Avic公司积极参与中国民用飞机项目的研发和生产。通过与国内外合作伙伴的紧密合作,公司成功研制出了多款具有市场竞争力的民用飞机。这些飞机的成功研制和生产,不仅提升了中国民用航空工业的水平,也为国内外航空公司提供了更多优质的航空产品选择。

GWP Group公司的发展小趣事

质量是企业的生命线。维峰电子始终将质量管理作为公司发展的重中之重。公司建立了完善的质量管理体系,从原材料采购、生产过程到产品检验等各个环节都进行严格把控。同时,公司还引入了先进的检测设备和技术,确保产品的质量和性能达到最高标准。这些措施的实施不仅提升了产品的竞争力,也赢得了客户的信任和好评。

Eink公司的发展小趣事
随着电子纸技术的不断发展,其应用领域也逐渐拓宽。在2002年3月的东京国际书展上,第一张彩色电子纸的出现引起了轰动。此后,电子纸开始被广泛应用于电子书阅读器、电子标签、公交站牌等领域。E-Ink公司作为电子纸技术的领军企业,推动了整个电子纸行业的发展。
Amplitronix LLC公司的发展小趣事

Amplitronix LLC的创立,源于两位年轻工程师对电子技术的热爱与执着。他们发现市场上存在一种需求,即高性能、高精度的电子测量仪器。于是,他们决定携手创业,将这个想法付诸实践。初创时期,资金短缺、技术难题、市场竞争激烈,每一道关卡都考验着他们的决心和毅力。但他们凭借着对技术的热情和对市场的敏锐洞察,不断研发创新,最终成功推出了首款产品,赢得了市场的初步认可。

富士康(FOXCONN)公司的发展小趣事

为了更好地服务全球客户,FMS积极实施全球化战略。公司在中国深圳设立了子公司——深圳市美丽微半导体有限公司,作为在中国大陆的主要生产基地与销售窗口。同时,FMS还在亚洲、欧洲、美洲等地设立了多个销售据点,形成了覆盖全球的营销网络。这一布局不仅提升了FMS的市场响应速度,也极大地增强了其品牌影响力。

AMS公司的发展小趣事

FMS深知合作的重要性,积极与行业内外的优秀企业建立长期合作关系。公司现已与伟创力、TCL、比亚迪、OPPO、京东方等多家知名企业建立了良好的合作关系,共同推动电子行业的发展。这些合作不仅为FMS带来了稳定的订单来源,也促进了双方在技术、市场等方面的深入交流与合作。

问答坊 | AI 解惑

嵌入式CAN总线控制器与DSP的接口

现场总线是一种开放式、 数字化、多点通信的控制系统局域网络, 是当今自动化领域中最具有应用前景的技术之一。CAN总线是现场总线中的应用热点,CAN总线支持分布式控制和适时控制的串行通信网络。   由于CAN总线具有通信速率高、开放性好、报文短 ...…

查看全部问答>

非常好的模拟电路讲义【我老师写的】

这是我的老师写的模拟电路的讲义,也是我们学校每年的电子设计大赛的培训课程,很值得大家学习! …

查看全部问答>

检测绝缘栅极双极型晶体管(IGBT)好坏的简易方法

1、判断极性首先将万用表拨在R×1KΩ挡,用万用表测量时,若某一极与其它两极阻值为无穷大,调换表笔后该极与其它两极的阻值仍为无穷大,则判断此极为栅极(G)。其余两极再用万用表测量,若测得阻值为无穷大,调换表笔后测量阻值较小。在测量阻值 ...…

查看全部问答>

终于研发成功

终于研发成功,cpu是s3c2410,64M   SDRAM,网口为cs8900 flash(k9f1208 64m)   实现了只用nand flash 就可以启动引导vxworks. 公司送bsp及全套开发文档 ,另可配公司的开发板 有意着QQ联系641328010 请注明 arm…

查看全部问答>

STC12LE5206AD 程序将引脚置为0 却检测到为高

有谁能够帮忙解决下啊? 本人qq:853887107…

查看全部问答>

pic io配置问题

pic16F506 io配置为普通的io口。不是只配置TRISB为1为输入 0输出。 我的IO怎么不听话啊。送高低电平不能控制。…

查看全部问答>

RT_THREAD中的异常与中断

  异常是导致处理器脱离正常运行转向执行特殊代码的任何事件,如果系统不及时处理,系统轻则出错,重着导致系统毁灭性的瘫痪。所以正确地处理异常避免错误的发生是提高软件的鲁棒性重要的一方面,对于嵌入式系统更加如此。 异常可以分成两类 ...…

查看全部问答>

DIY导航避障车规整贴

DIY导航避障车小组今日下午展开第一次例会,在本次例会中大家集中讨论了无线的选择,避障的选择等等部分,并对小车进行了前景规划,以谷歌的自动驾驶车为终极目标,大家积极发言例会持续了一个半小时,并表示未来会采用各种新技术。下次再来把细节 ...…

查看全部问答>

关于称重传感器的电压和重量的换算公式

一个额定量程为10吨的称重传感器,激励电压为10V,灵敏度为1.0+-0.005mV/V,零点平衡+-1%F.S,综合误差为+-0.02%F.S 那么在货物重量为5吨时,误差应该是:5TX0.02%=0.001t=1千克吧。。 那么按网上一些知识的理解,当货物为10吨的时候,在10V的激 ...…

查看全部问答>

msp430中断嵌套问题

main(){  WDTCTL = WDTPW + WDTHOLD; //停止看门狗定时器  P5DIR |= 0xff; //设P1.0 为输出  CCTL0 = CCIE; //CCR0开中断允许  CCR0 = 1000-1; //向CCR0捕获/比较寄存器装入初值,用于比较  TACTL = TASSEL_1 + MC_1; // ...…

查看全部问答>