移植FATFS文件系统的具体步骤 (SD卡SPI模式存储)

移植FATFS文件系统的具体步骤 (SD卡SPI模式存储),第1张

main函数里面SD卡端口的初始化是需要的。

需要把fatfs的文件添加到你的sd卡工程;不然文件 *** 作函数怎么调用呢。谨亮

读写文件 *** 作次序:

res = f_mount(0, &fs)// 先mount设备,即使你的SD卡

res = f_open(&fl, filename, FA_OPEN_EXISTING | FA_READ)// 打开需要的文件

res = f_read(&fl, buff, count, &len)// 读取文件数据,写也类似的

基本就这样尺拦。

其实就是 *** 作一些函数来读写数据;祥困宽不需要管文件系统内部的处理过程。

一个FAT文件系统包括四个不同的部分。

保留扇区,位于最开始的位置。第一个保留扇区是引导区(分区启动记录)。它包括一个称为基本输入输出参数块的区域(包括一些基本的文件系统信息尤其是它的类型和其它指向其它扇区的指针),通常包括 *** 作系统的启动调用代码。保留扇区的总数记录在引导扇区中的一个参数中。引导扇区中的重要信息可以被DOS和OS/2中称为驱动器参数块的 *** 作系统结构访问。

FAT区域。它包含有两份文件分配表,这是出于系统冗余考虑,尽管它很少使用,即使是磁盘修复工具也很少使用它。它是分区信息的映射表,指示簇是如何存储的。

目录区域。它是在根目录中存储文件和目录信息的目录表。在FAT32下它可以存在分区中的任何位置,但是在早期的版本悔盯中它永远紧随FAT区域之后。

数据区域。这是实际的文件和目录数据存储的区域,它占据了分区的绝大部分。通过简单地在FAT中添加文件链接的个数可以任意增加文件大小和子目录个数(只要有空簇存在)。然而需要注意的是每个簇只能被一个文件占有,这样的话如果在32KB大小的簇中有一个1KB大小的文件,那么31KB的空间就浪费掉了。 例外情况

Apricot PC的MS-DOS所用FAT的实现有一个不同的启动扇区组织以使用计算机与IBM不兼容的基本输入输出系统。跳转指令和OEM名被省略并且MS-DOS文件系统参数位于0x50(在标准扇区中偏移为0x0B - 0x17)。后来的Apricot MS-DOS版本除了Apricot特有的引导区之外也具有了读写标准启动分区的能力。

BBC Master 512 上的DOS Plus根本就不使用传统的引导区。数据磁盘省略了引导区并且以一个单份的FAT开始(FAT的第一个字节用来确定磁盘容量),启动磁盘使用一个包含启动调用程序的小型ADFS文件系统,后面跟随一个单份的FAT。

文件分配表

一个分区分成同等大小的簇,也就是连续空间的小块。簇的大小随着FAT文件系统的类型以及分区大小而不同,典型的簇大小介于2KB到32KB之间。每个文件根据它的大小可能占有一个或者多个簇;这样,一个文件就由这些这些(称为单链表)簇链所察猛表示。然而,这些链并不一定一个接着一个在磁盘上存储,它们经常是在整个数据区域零散的储存。

文件分配表(FAT)是映射到分区每个簇的条目列表。每个条目记录下面五种信息中的一种。

链中下一个簇的地址

一个特殊的文件结束符(EOF)符号指示链的结束

一个特殊的符号标示坏簇

一个特殊的符号标示保留簇

0来表示空闲簇

每个版本的FAT文件系统使用不同大小的FAT条目。这个大小已经由名字表示出来,例如FAT16文件系碧没和统的每个条目使用16位表示,32位文件系统使用32位表示。这个不同意味着FAT32系统的文件分配表能比FAT16映射更多的簇,它也允许FAT32有更大的分区大小。这也使得FAT32比FAT16更能有效地利用磁盘空间,因为每个驱动器能够寻址更小的簇,这也就意味着更少的空间浪费。

目录表

目录表是一个表示目录的特殊类型文件(现今通常称为文件夹)。它里面保存的每个文件或目录使用表中的32位条目表示。每个条目记录名字、扩展名、属性(档案、目录、隐藏、只读、系统和卷)、创建的日期和时间、文件/目录数据第一个簇的地址,最后是文件/目录的大小。

除了FAT12和FAT16文件系统中的根目录表占据特殊的根目录区域位置之外,所有其它的目录表都存在数据区域。

合法的DOS文件名包括下面一些字符:

大写字母A-Z

数字0-9

空格(尽管结尾的空格被作为填充而不是文件名的一部分)

! # $ % &( ) - @ ^ _ ` { } ~ '

数值 128-255

DOS文件名位于OEM字符集。

长文件名(LFN)使用一个技巧存储在FAT文件系统上——在目录表中添加假的条目。这些条目使用一个普通文件无法使用的卷标属性标识,普通文件无法使用是由于它们被大多数旧的MS-DOS程序忽略。很显然,一个只包含卷标的目录被当作空卷,这样就允许删除;使用长文件名创建的文件在从普通的DOS删除就会发生这样的情形。

校验和也允许检验长文件名是否与8.3文件名匹配;当一个文件删除之后使用DOS在同一个目录位置重新创建之后就会出现不匹配现象。校验和使用下面的算法计算。(注意pFcbName是指向如正常目录条目中所显示的文件名的指针,例如前八个字符是文件名,最后三个是扩展名。点是隐含的。文件名中没有使用的空间将使用空格(ASCII 0x20)补齐。例如,“Readme.txt”将记录为"README TXT"。

unsigned char lfn_checksum(const unsigned char *pFcbName)

{

int i

unsigned char sum=0

for (i=11ii--)

sum = ((sum &1) ? 0x80 : 0) + (sum >>1) + *pFcbName++

return sum

}

旧版的PC-DOS错误地将根目录中的长文件名当作卷标,这样它们就会显示错误的卷标。

每个假条目包含13UTF-16个字符(26字节),通过使用包含文件大小或者时间记录的区域获得除了旧的8+3之外的另外15个字节(但是出于安全和磁盘检查工具的考虑开始簇的区域没有使用保留值为0)。参见8.3中另外的解释。

如果一个文件名只包含小写字母、或者是一个小写字母的名加上大写扩展名的混合或者与此相反,没有特殊的字符并且满足8.3的限制,在视窗NT上就不创建VFAT的条目。相反,在目录条目的偏移0x0c处的没有说明的位用来指示文件名全部或者部分是小写字母。特别明确的是,位4意味着小写字母的扩展名,位3意味着名是小写字母,这样就允许如“example.TXT”和“HELLO.txt”这样的组合,但是不允许“Mixed.txt”这样的组合。很少有 *** 作系统支持这种功能。非NT视窗版本当这个扩展使用时将把文件名当作大写字母。缺省情况下,Linux的最近版本将认识这个扩展但是在写时并不使用它。

第三方扩展

在微软公司添加长文件名和创建/访问时间戳之前,其它的 *** 作系统使用目录表字节0x0C-0x15存储其它的元数据。

SD的优势之一是它的便携性,它可以自由插拔,可以在嵌入式设备和PC机之间交换数据。如果使用FAT(File Allocation Table)文件系统,它便可以方便在安装windows的PC和嵌入式设备之间交换数据。一个完整的FAT文件系统代码量敏族稿非常庞大,不适合资源较少的嵌入式系统,于是就需要一个微型的FAT文件系统,FatFs就是基于这样的目的而开发的。

FatFS是一个专为小型嵌入式系统设计的通用FAT文件系统模块。FatFs具有较高的可配置性,最小配置仅使用1K的RAM空间,非常适用于嵌入式系统。FatFs 的编写遵循ANSI C,并且完全与磁盘I/O层分开。因此,它独立(不依赖)于桥孝硬件架构。它可以被嵌入到低成本的微控制器中,如AVR, 8051, PIC, ARM, Z80, 68K 等等,而不需要做任何修改。

特点

Windows兼容的FAT文件系统

不依赖于穗姿平台,易于移植

代码和工作区占用空间非常小

多种配置选项:

多卷(物理驱动器和分区)

多ANSI/OEM代码页,包括DBCS

在ANSI/OEM或Unicode中长文件名的支持

RTOS的支持

多扇区大小的支持

只读,最少API,I/O缓冲区等等

FatFs的源代码只有几个文件:diskio.c,ff.c,ff_util.c,tff.c及头文件。diskio.c是磁盘 *** 作的代码文件(这个文件是移植时要实现的),ff.c是一般FatFs的代码文件,tff.c是微型FatFs的代码文件,ff_util.c是几个辅助函数。integer.h是内部基本类型的定义,ff.h是一般FatFs包含的头文件,tff.h是微型FatFs包含的头文件。

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片

#if _FATFS_TINY != 1

#include <fatfs/src/ff.h>

#else

#include <fatfs/src/tff.h>

#endif

#include <fatfs/src/ff_util.h>

微型FatFs配置最小时仅占用内存1KB,但它是一个只读的FAT系统。

FatFs的配置文件是fatfs_config.h:

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片

//------------------------------------------------------------------------------

// General Definitions (previously in ff.h)

//------------------------------------------------------------------------------

#define _FATFS_TINY 0

/* When _FATFS_TINY is set to 1, fatfs is compiled in Tiny mode

/ Else, it is compiled in normal mode

/ Tiny FatFs feature : Very low memory consumption, suitable for small memory

/ system. (1KB RAM) : Supports only single drive, no disk format,

/ only read functions, no write functions */

//------------------------------------------------------------------------------

// Definitions for normal FATFS (previously in ff.h)

//------------------------------------------------------------------------------

#if _FATFS_TINY == 0

#define _MCU_ENDIAN 2

/* The _MCU_ENDIAN defines which access method is used to the FAT structure.

/ 1: Enable word access.

/ 2: Disable word access and use byte-by-byte access instead.

/ When the architectural byte order of the MCU is big-endian and/or address

/ miss-aligned access results incorrect behavior, the _MCU_ENDIAN must be set to 2.

/ If it is not the case, it can also be set to 1 for good code efficiency. */

#define _FS_READONLY0

/* Setting _FS_READONLY to 1 defines read only configuration. This removes

/ writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename,

/ f_truncate and useless f_getfree. */

#define _FS_MINIMIZE0

/* The _FS_MINIMIZE option defines minimization level to remove some functions.

/ 0: Full function.

/ 1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename are removed.

/ 2: f_opendir and f_readdir are removed in addition to level 1.

/ 3: f_lseek is removed in addition to level 2. */

#define _USE_STRFUNC0

/* To enable string functions, set _USE_STRFUNC to 1 or 2. */

#define _USE_FSINFO 1

/* To enable FSInfo support on FAT32 volume, set _USE_FSINFO to 1. */

#define _USE_SJIS 1

/* When _USE_SJIS is set to 1, Shift-JIS code transparency is enabled, otherwise

/ only US-ASCII(7bit) code can be accepted as file/directory name. */

#define _USE_NTFLAG 1

/* When _USE_NTFLAG is set to 1, upper/lower case of the file name is preserved.

/ Note that the files are always accessed in case insensitive. */

#define _USE_MKFS 1

/* When _USE_MKFS is set to 1 and _FS_READONLY is set to 0, f_mkfs function is

/ enabled. */

#define _DRIVES 2

/* Number of logical drives to be used. This affects the size of internal table. */

#define _MULTI_PARTITION0

/* When _MULTI_PARTITION is set to 0, each logical drive is bound to same

/ physical drive number and can mount only 1st primaly partition. When it is

/ set to 1, each logical drive can mount a partition listed in Drives[]. */

//------------------------------------------------------------------------------

// Definitions for normal FATFS TINY (previously in tff.h)

//------------------------------------------------------------------------------

#else

#define _MCU_ENDIAN 2

/* The _MCU_ENDIAN defines which access method is used to the FAT structure.

/ 1: Enable word access.

/ 2: Disable word access and use byte-by-byte access instead.

/ When the architectural byte order of the MCU is big-endian and/or address

/ miss-aligned access results incorrect behavior, the _MCU_ENDIAN must be set to 2.

/ If it is not the case, it can also be set to 1 for good code efficiency. */

#define _FS_READONLY1

/* Setting _FS_READONLY to 1 defines read only configuration. This removes

/ writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename,

/ f_truncate, f_getfree and internal writing codes. */

#define _FS_MINIMIZE0

/* The _FS_MINIMIZE option defines minimization level to remove some functions.

/ 0: Full function.

/ 1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename are removed.

/ 2: f_opendir and f_readdir are removed in addition to level 1.

/ 3: f_lseek is removed in addition to level 2. */

#define _USE_STRFUNC0

/* To enable string functions, set _USE_STRFUNC to 1 or 2. */

#define _USE_FSINFO 1

/* To enable FSInfo support on FAT32 volume, set _USE_FSINFO to 1. */

#define _USE_SJIS 1

/* When _USE_SJIS is set to 1, Shift-JIS code transparency is enabled, otherwise

/ only US-ASCII(7bit) code can be accepted as file/directory name. */

#define _USE_NTFLAG 1

/* When _USE_NTFLAG is set to 1, upper/lower case of the file name is preserved.

/ Note that the files are always accessed in case insensitive. */

#define _USE_FORWARD0

/* To enable f_forward function, set _USE_FORWARD to 1. */

#define _FAT32 1

/* To enable FAT32 support in addition of FAT12/16, set _FAT32 to 1. */

#endif

//------------------------------------------------------------------------------

// Other definitions

//------------------------------------------------------------------------------

/*-----------------------------------------------------------------------*/

/* Correspondence between drive number and physical drive*/

/* Note that Tiny-FatFs supports only single drive and always*/

/* accesses drive number 0. */

#define DRV_MMC 0

#define DRV_SDRAM1

#define DRV_ATA 2

#define DRV_USB 3

#define SECTOR_SIZE_SDRAM 512

#define SECTOR_SIZE_SDCARD 512


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12286478.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存