fatfs文件系统应用程序手册中文版)
fatfs使用流程
fatfs使用流程一、引言FAT文件系统(File Allocation Table,文件分配表)是一种常用的文件系统,广泛应用于嵌入式系统和移动存储设备中。
在使用FAT 文件系统之前,我们需要了解其使用流程,以便正确地操作和管理文件。
二、初始化FAT文件系统在开始使用FAT文件系统之前,我们需要对其进行初始化。
初始化的步骤如下:1. 创建一个FAT文件系统对象,通常命名为fs。
2. 调用初始化函数来初始化文件系统对象,例如:f_mount(&fs, "0:", 1)。
其中,第一个参数是文件系统对象,第二个参数是逻辑驱动器号,第三个参数表示是否格式化磁盘。
三、创建文件在FAT文件系统中,创建文件的步骤如下:1. 定义一个文件对象,通常命名为file。
2. 调用打开函数来创建文件,例如:f_open(&file, "test.txt", FA_CREATE_ALWAYS)。
其中,第一个参数是文件对象,第二个参数是文件名,第三个参数表示创建文件时如果文件已存在是否覆盖。
四、写入文件在FAT文件系统中,写入文件的步骤如下:1. 定义一个缓冲区用于存储待写入的数据。
2. 调用写入函数来写入数据到文件中,例如:f_write(&file, buffer, sizeof(buffer), &bytes_written)。
其中,第一个参数是文件对象,第二个参数是待写入的数据缓冲区,第三个参数是待写入的数据大小,第四个参数是实际写入的字节数。
五、读取文件在FAT文件系统中,读取文件的步骤如下:1. 定义一个缓冲区用于存储读取的数据。
2. 调用读取函数来从文件中读取数据,例如:f_read(&file, buffer, sizeof(buffer), &bytes_read)。
其中,第一个参数是文件对象,第二个参数是用于存储读取数据的缓冲区,第三个参数是待读取的数据大小,第四个参数是实际读取的字节数。
STM32笔记(六)SD卡的读写和FatFS文件系统
STM32笔记(六)SD卡的读写和FatFS文件系统因为要用,学习了一下SPI操作SD卡,同时移植了一个免费开源的FAT文件系统:FatFS。
感觉挺好,在单片机上实现了读写文件的操作,接下来就可以解释我的G代码咯!我的SD卡底层操作参考了网上几种常见的代码,但又对其结构做了一定的优化,至少看起来用起来比较方便。
既可以作为文件系统的diskio使用,也可以直接使用底层函数,把SD卡作为一块flash读写。
FatFs文件系统体积蛮小,6-7K足矣,对于128Kflash的STM32来说很合适,代价不大。
同时可移植性很高,最少只需要4个函数修改既可以实现文件系统的移植。
相关文件系统的介绍请看这里。
这里给一套比较完整的参考资料,包括fatfs文件系统的原版资料、几个重要的手册和网上下载的代码。
/bbs/bbs_content.jsp?bbs_sn=3210864&bbs_page_no=1&bbs_id=3020 下面是我的代码:其中底层的SPI总线对SD卡的操作在SPI_SD_driver.c/h中,而FATFS的移植文件diskio.c中对磁盘的操作函数中将调用底层的操作函数。
下面是一些底层操作函数:u8 SPI_ReadWriteByte(u8 TxData); //SPI总线读写一个字节u8 SD_WaitReady(void); //等待SD卡就绪u8 SD_SendCommand(u8 cmd, u32 arg, u8 crc); //SD卡发送一个命令u8 SD_SendCommand_NoDeassert(u8 cmd, u32 arg, u8 crc); //SD卡发送一个命令,不断线u8 SD_Init(void); //SD卡初始化u8 SD_ReceiveData(u8 *data, u16 len, u8 release); //SD卡读数据u8 SD_GetCID(u8 *cid_data); //读SD卡CIDu8 SD_GetCSD(u8 *csd_data); //读SD卡CSDu32 SD_GetCapacity(void); //取SD卡容量u8 SD_ReadSingleBlock(u32 sector, u8 *buffer); //读一个sectoru8 SD_WriteSingleBlock(u32 sector, const u8 *buffer); //写一个sectoru8 SD_ReadMultiBlock(u32 sector, u8 *buffer, u8 count); //读多个sectoru8 SD_WriteMultiBlock(u32 sector, const u8 *data, u8 count); //写多个sector这是diskio.c中的一段代码,在disk初始化中,我们调用了SPI_SD_driver.c中的SD卡初始化函数。
FATFS文件系统剖析(全)要点
FATFS文件系统剖析1:FAT16:数据按照其不同的特点和作用大致可分为5部分:MBR区、DBR区、FAT区、DIR区和DATA区,相比fat12多了DBR区Main boot record: MBR(0--1bdh)磁盘参数存放DPT(1beh--1fdh)磁盘分区表55,aa 分区结束标志DBR(Dos Boot Record)是操作系统引导记录区的意思FAT区(有两个,一个备份):对于fat16,每一个fat项16位,所以可寻址的簇项数为65535(2的16次方)。
而其每簇大小不超过32k,所以其每个分区最大容量为2G。
fat32,每一个fat项32位,可寻址簇数目为2的32次方。
DIR区(根目录区):紧接着第二FAT表(即备份的FAT表)之后,记录着根目录下每个文件(目录)的起始单元,文件的属性等。
定位文件位置时,操作系统根据DIR中的起始单元,结合FAT表就可以知道文件在硬盘中的具体位置和大小了。
DATA区:实际文件内容存放区。
FAT32:暂时放在这里,不讨论!Fatfs:嵌入式fat文件系统,支持fat16,fat32。
包含有ff.h,diskio.h,integer.h,ffconf.h 四个头文件以及ff.c 文件系统实现。
当然要实现具体的应用移植,自己要根据diskio.h实现其diskio。
c 底层驱动。
diskio.h : 底层驱动头文件ff.h : 文件系统实现头文件,定义有文件系统所需的数据结构ff.c : 文件系统的具体实现如下开始逐个文件加以分析:integer.h :仅实现数据类型重定义,增加系统的可移植性。
ffconf.h : 文件系统配置---逐个配置,先配置实现一个最小的fat文件系统,下面来分析各配置选项:#define _FFCONF 8255 //版本号#define _FS_TINY 0 /* 0:Normal or 1:Tiny */ //在这里与先前版本有些许变化,是通过配置头配置两种不同大小的文件系统,这里配置为0。
stm32 fatfs 中文编码
stm32 fatfs 中文编码摘要:1.简介- 介绍STM32- 介绍FATFS文件系统- 介绍中文编码2.STM32与FATFS的结合- 为什么选择FATFS文件系统- STM32如何支持FATFS- 实现过程的注意事项3.中文编码在FATFS中的处理- 中文编码的基本概念- FATFS文件系统对中文编码的支持- 中文编码在实际应用中的问题及解决方案4.总结- 回顾STM32、FATFS和中文编码的关系- 对未来发展的展望正文:1.简介STM32是一款由STMicroelectronics公司开发的基于ARM Cortex-M 内核的微控制器。
凭借其高性能、低功耗和丰富的外设资源,STM32在嵌入式领域得到了广泛应用。
为了更好地管理存储在STM32上的数据,文件系统成为了必不可少的组件。
FATFS(File Allocation Table File System)是一款经典的文件系统,适用于各种嵌入式系统。
然而,在处理中文编码文件时,STM32与FATFS的结合面临着一些挑战。
2.STM32与FATFS的结合FATFS文件系统以其简单、稳定、可移植性强等优点,成为了许多嵌入式系统的首选。
在STM32上实现FATFS,首先需要选择合适的库。
有许多开源库可供选择,如CubeMX、FatFS等。
这些库为开发者提供了丰富的例程和详细的文档,大大简化了开发过程。
在实际应用中,还需注意处理FATFS的初始化、挂载、卸载等操作,以确保文件系统的稳定运行。
3.中文编码在FATFS中的处理中文编码是指将中文字符映射为二进制序列的技术。
在FATFS中处理中文编码文件,需要确保文件系统能够正确识别并存储中文字符。
FATFS文件系统本身支持多种编码,如ASCII、UTF-8等。
为了在STM32上正确处理中文编码文件,开发者需在代码层面进行相应的处理。
例如,在写入文件时,需将中文字符转换为UTF-8编码,以确保文件系统能够正确识别。
FatFs使用流程
一、读文件流程。
1、程序结构res = f_mount(0, &fs);res = f_open(&file, "data.txt", FA_OPEN_EXISTING | FA_READ);while(1){ if(fgets(data, sizeof(data), &file)==NULL){ break; }prints(data);}f_close(&file);总共四个与文件系统相关的函数,下面就沿着函数执行路径去探索一下。
2、f_mount(0, &fs)的执行参数0是卷号,就像电脑上的CDE盘等。
fs是一个未初始化的一个文件系统对象,其定义在此:FATFS fs。
这个函数好像就做了两个个事,使全局文件系统指针FatFS指向fs对象,并使fs.fstype=0。
3、f_open(&file, "data.txt", FA_OPEN_EXISTING | FA_READ)的执行参数&file是提供一个文件对象指针,打开文件过程中获得的一些信息都填入这个结构体。
FA_OPEN_EXISTING | FA_READ表示要打开和读取相应的文件。
源程序如下:FRESULT f_open (FIL *fp, /* fp就指向传入的对象file */const char *path, /*path指向data.txt的地址*/BYTE mode /* Access mode and file open mode flags */){DIR dj; 目录对象BYTE *dir; 目录项指针char fn[8+3+1]; 8.3文件名。
// 程序开头定义了这么三个变量,007c版本中由于支持长文件名,最好一个改为NAMEBUF(sfn, lfn)。
fp->fs = NULL; 每个文件对象都指向具体的文件系统,这里先清0auto_mount(&path, &dj.fs, (BYTE)(mode) ); //这个函数看来很关键了。
fatfs使用例程
fatfs使用例程FATFS是一个用于嵌入式系统的开源文件系统模块,它提供了对FAT文件系统的支持。
下面是一个使用FATFS的简单例程:c.#include "ff.h"#include "diskio.h"FATFS fs; // 文件系统对象。
FIL file; // 文件对象。
FRESULT res; // 操作结果。
int main(void) {。
// 初始化文件系统。
res = f_mount(&fs, "", 1);if (res != FR_OK) {。
// 文件系统挂载失败。
while (1);}。
// 打开文件。
res = f_open(&file, "test.txt", FA_READ); if (res != FR_OK) {。
// 文件打开失败。
while (1);}。
// 读取文件内容。
char buffer[100];UINT bytesRead;res = f_read(&file, buffer, sizeof(buffer), &bytesRead);if (res != FR_OK) {。
// 文件读取失败。
while (1);}。
// 关闭文件。
f_close(&file);// 卸载文件系统。
f_mount(NULL, "", 0);while (1);}。
上述例程中,我们首先需要包含`ff.h`和`diskio.h`头文件,这些文件是FATFS库的必要文件。
然后我们定义了一个`FATFS`类型的文件系统对象`fs`,以及一个`FIL`类型的文件对象`file`,以及一个`FRESULT`类型的变量`res`用于存储操作的结果。
在`main`函数中,我们首先通过调用`f_mount`函数来挂载文件系统。
第一个参数是文件系统对象,第二个参数是逻辑驱动器号,这里使用空字符串表示默认驱动器。
FatFS文件系统的使用技术和移植方法总结
FatFS⽂件系统的使⽤技术和移植⽅法总结 最近想探索⼀下⽂件系统-FATFS相关的⼀些知识,于是乎收集了相关资料,将其总结在下。
⼀、介绍⼀下FATFS FatFs是⼀个通⽤的⽂件系统(FAT/exFAT)模块,⽤于在⼩型嵌⼊式系统中实现FAT⽂件系统。
其特点如下: (1)DOS/Windows兼容的FAT/exFAT⽂件系统 (2)平台独⽴性,容易使⽤ (3)程序代码量少,占⽤资源低 (4)配置参数丰富,配置详情可参考官⽅⽹站⼆、组件包内容 ⽂件系统在嵌⼊式软件开发中的运⽤: 应⽤可以使⽤FatFs提供的API函数来进⾏⽂件系统功能的实现,使⽤FatFs提供的底层设备接⼝对存储设备进⾏适配,才能正常使⽤FatFs⽂件系统。
三、组件包分析 资源架构: 图⽚展⽰了FatFs⽂件系统的资源架构。
可见其资源⽂件较少。
FatFs提供的API函数: 使⽤这些函数接⼝来进⾏⽂件系统功能的实现,包括⽂件和⽬录的操作等。
FatFs底层存储介质接⼝函数: 这⼏个函数在在项⽬开发中,往往需要⾃⼰提供代码,来适配不同的存储媒介环境。
四,移植和使⽤⽅法总结 下⾯是关于FatFS⽂件系统移植需要的⼏个关键⽂件: ff.c(不改动) ⽂件系统的实现源代码,主要包含FatFs⽂件系统源码,移植的时候不需要修改 diskio.h(不改动) 声明diskio.c中需要的⼀些接⼝函数和命令格式 diskio.c(需要⾃写)这个⽂件是⽂件系统底层和SD驱动的中间接⼝的实现代码。
在移植FatFs的时候需要完成在diskio.h中声明的那⼏个函数。
函数在ff.c中被调⽤ integer.h(可以微改)⽂件中包含了FatFs⽤到的数据类型定义,根据移植的平台修改即可。
主要关注CPU相关的配置。
ff.h(不改动)是FatFs的⽂件系统的函数(在ff.c中)声明,以及⼀些选项的配置。
具体选项及详细说明可参见⽂件中注释。
ffconf.h(按需要) 这个是在FatFs的0.08a版本中有看到,0.06版本中还没有,是关于FatFs系统模块的⼀些配置,具体可以参考注释来进⾏配置。
[STM32]stm32sdiofatfs文件系统源码剖析[精品]
[STM32]stm32+sdio+fatfs文件系统源码分析一、概述1、目的在移植之前,先将源代码大概的阅读一遍,主要是了解文件系统的结构、各个函数的功能和接口、与移植相关的代码等等。
2、准备工作在官方网站下载了0.07c版本的源代码,利用记事本进行阅读。
二、源代码的结构1、源代码组成源代码压缩包解压后,共两个文件夹,doc是说明,src里就是代码。
src文件夹里共五个文件和一个文件夹。
文件夹是option,还有00readme.txt、diskio.c、diskio.h、ff.c、ff.h、integer.h。
对比网上的文章,版本已经不同了,已经没有所谓的tff.c和tff.h了,估计现在都采用条件编译解决这个问题了,当然文件更少,可能编译选项可能越复杂。
2、00readme.txt的说明Low level disk I/O module is not included in this archive because the FatFsmodule is only a generic file system layer and not depend on any specificstorage device. Y ou have to provide a low level disk I/O module that writtento control your storage device.主要是说不包含底层IO代码,这是个通用文件系统可以在各种介质上使用。
我们移植时针对具体存储设备提供底层代码。
接下来做了版权声明-可以自由使用和传播。
然后对版本的变迁做了说明。
3、源代码阅读次序先读integer.h,了解所用的数据类型,然后是ff.h,了解文件系统所用的数据结构和各种函数声明,然后是diskio.h,了解与介质相关的数据结构和操作函数。
再把ff.c和diskio.c两个文件所实现的函数大致扫描一遍。
fatfs使用例程 -回复
fatfs使用例程-回复如何使用fatfs 来读写文件。
第一步:了解FAT 文件系统FAT(File Allocation Table)是一种常见的文件系统类型,被广泛用于各种嵌入式设备和存储介质上。
FAT 文件系统有多个版本,包括FAT12、FAT16 和FAT32,其主要特点是简单、轻量级和易于实现。
FAT 文件系统使用一个文件分配表来管理磁盘空间的分配情况。
每个文件都有一个或多个簇(cluster)来存储其数据,而文件分配表则记录了每个簇的使用情况。
通过跟踪每个簇的使用状态,FAT 文件系统可以有效地管理磁盘空间,并允许文件的动态增长。
第二步:准备开发环境在开始使用fatfs 之前,我们首先需要准备好相应的开发环境。
你可以选择使用嵌入式开发板或者模拟器来进行开发,只要能够运行嵌入式操作系统即可(如FreeRTOS、ThreadX 等)。
另外,你还需要下载fatfs 的源代码,并将其添加到你的项目中。
fatfs 的源代码是一个单一的C 文件,几乎不需要任何外部依赖。
你只需要包含这个文件即可开始使用fatfs。
第三步:定义工作区和文件对象在使用fatfs 之前,你需要定义一个工作区和一个文件对象。
工作区是一个用来存储fatfs 内部数据结构的内存区域,而文件对象则用来表示一个打开的文件。
cFATFS fs;FIL file;第四步:初始化fatfs在开始使用fatfs 之前,你需要初始化fatfs 库,这可以通过调用`f_mount` 函数来完成。
在初始化之前,你可以为函数提供一个参数来指定要使用的驱动器号,或者使用默认的驱动器号(0)。
cf_mount(&fs, "", 0);第五步:打开文件在文件系统中,打开文件是一个常见的操作。
要打开一个文件,你需要使用`f_open` 函数,并指定文件对象、文件名和打开模式。
cf_open(&file, "example.txt", FA_READ);第六步:读取文件一旦文件打开成功,你就可以使用`f_read` 函数来读取文件的内容。
fatfs 详解
fatfs 详解【原创实用版】目录1.FATFS 简介2.FATFS 的特点3.FATFS 的应用领域4.FATFS 的优势与不足5.结论正文1.FATFS 简介FATFS(File Allocation Table File System)是一种适用于嵌入式系统的文件系统,由 Keil 公司开发。
FATFS 是一种可扩展的、可恢复的、易于使用的文件系统,适用于管理存储设备上的文件和数据。
它支持FAT12、FAT16 和 FAT32 三种文件分配表格式,因此可以适应不同存储容量的设备。
2.FATFS 的特点(1)可扩展性:FATFS 支持多种文件分配表格式,可以根据存储设备的容量进行选择,最大支持 2TB 的存储空间。
(2)可恢复性:FATFS 具有自动纠错功能,能够在读取数据时检测到错误并尝试修复。
同时,它还提供了一种称为“垃圾回收”的机制,用于回收已删除文件的存储空间。
(3)易于使用:FATFS 提供了丰富的应用程序编程接口(API),方便开发人员在嵌入式系统中进行文件操作。
3.FATFS 的应用领域FATFS 广泛应用于各种嵌入式系统,如智能家居、工业控制、消费电子等。
在这些领域,FATFS 可以提供可靠的文件存储和管理功能,满足设备对文件系统的需求。
4.FATFS 的优势与不足(1)优势:FATFS 具有较好的可扩展性和可恢复性,能够适应不同存储容量的设备。
同时,它提供了丰富的 API,便于开发人员进行文件操作。
(2)不足:尽管 FATFS 在嵌入式领域应用广泛,但它在某些方面存在局限性。
例如,与 extFS、yaffs 等其他文件系统相比,FATFS 在存储性能和空间利用率方面表现较差。
此外,FATFS 主要针对小容量存储设备,对于大容量存储设备而言,管理效率较低。
5.结论FATFS 是一种适用于嵌入式系统的文件系统,具有可扩展性、可恢复性和易于使用等特点。
在多种应用领域中,FATFS 都能提供可靠的文件存储和管理功能。
FatFs 使用说明
FatFs 使用说明移植到不同平台的考虑事项The FatFs module is assuming following terms on portability.▪ANSI CThe FatFs module is a middleware that written in ANSI C. There is no platform dependence, so long as the compiler is in compliance with ANSI C.FatFs模块是用ANSI C编写的中间件,只要编译器遵循ANSI C,它都是平台无关的。
▪Size of integer typesThe FatFs module assumes that size of char/short/long are 8/16/32-bit and int is 16 or 32 bit. These correspondence are defined in integer.h. This willnot be a problem on most compilers. When any conflict with existing definitions is occured, you must resolve it with care.FatFs假定char/short/long的长度为8/16/32位,而int为16位或32位,这些相应的定义位于integer.h文件。
这在大多数的编译器上都不会是问题,但是当与预定义的内容发生冲突时,你必须小心地解决。
内存使用(R0.07)AVR H8/300HPICTLCS-870/CV850ESSH2ARM7TDMIIA-32编译器gcc(WinAVR)CH38gcc(C30)CC870CCA850SHCgcc(WinARM)MSC_WORD_ACCESS1 0 0 1 1 0 0 1ROM (Full, R/W) 1113610356108381516776828654106287232ROM (Min, R/W) 7072 6696 7007 98004634557065644647ROM (Full, R/O) 5218 4626 4949 67863528382646763267ROM (Min, R/O) 3626 3418 3536 49412558287432722397RAM (Static) D*2 + 2D*4+ 2D*2+ 2D*2 +2D*4+ 2D*4 +2D*4 + 2D*4 +2RAM (Dynamic) (_FS_TIN Y == 0) D*560+F*544D*560 +F*55D*560 +F*544D*560 +F*550D*560 +F*550D*560+F*550D*560 +F*550RAM (Dynamic) (_FS_TIN Y == 1) D*560+F*32D*560 +F*36D*560 +F*32D*560+F*32D*560 +F*36D*560 +F*36D*560+F*36D*560 +F*36These are the memory usage on some target systems with following condition. The memory sizes are in unit of byte, D means number of volumes and F means nu mber of open files. All samples are optimezed in code size.这是在以下情形时一些目标系统的内存用量,内存大小以字节计算,D代表卷数量,F代表打开文件的数量。
fatfs文件系统ff12c移植头文件中英文翻译ffconf.h
fatfs文件系统ff12c移植头文件中英文翻译ffconf.h//FAT文件系统模块配置文件#define _FFCONF 68300 /* Revision ID 版本标识*//*68的ascii的字符是D,300是0x012c*///功能配置#define _FS_READONLY 0/*配置只读取文件*//*0:读/写1:只读只读配置开启,禁用有关写操作的API函数,和可选的写操作的函数f_write(), f_sync(), f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree()*/#define _FS_MINIMIZE 0/*定义了最小化级别,以删除一些基础的API函数*//*0:所有基础函数都启用1:禁用这些函数f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_truncate(), f_rename()2:在1的基础上禁用这些函数f_opendir(), f_readdir(), f_closedir() 3:在2的基础上禁用这些函数f_lseek()*/#define _USE_STRFUNC 0/*启用字符串函数*//*0:禁用字符串函数1:启用字符串函数,不带LF-CRLF转换2:启用字符串函数,带LF-CRLF转换*/#define _USE_FIND 0/*启用筛选目录读取函数f_findfirst()和f_findnext()*//*0:禁用筛选目录读取函数1:启用筛选目录读取函数2:启用筛选目录读取函数并带匹配别名 altname[]f_findfirst()(打开一个目录并读取匹配的第一项)f_findnext()(阅读下一个匹配的条目)*/#define _USE_MKFS 0/*启用f_mkfs()函数(在逻辑驱动器上创建一个FAT卷)*//*0:禁用1:启用*/#define _USE_FASTSEEK 0/*启用快速查找功能*//*0:禁用1:启用*/#define _USE_EXPAND 0/*启用f_expand函数(为文件分配一个连续的块)*//*0:禁用1:启用*/#define _USE_CHMOD 0/*启用属性操作函数f_chmod()和f_utime()*//*0:禁用1:启用另外,_FS_READONLY需要为0时,才能启用该选项*/#define _USE_LABEL 0/*启用卷标函数f_getlabel()和f_setlabel()*//*0:禁用1:启用*/#define _USE_FORWARD 0/*启用f_forward()函数(将数据转发到流)*//*0:禁用1:启用*///地区和命名空间配置#define _CODE_PAGE 936/*指定目标系统上要使用的OEM代码页,代码页936表示使用简体中文*//*不正确的代码页设置可能导致文件打开失败1 - ASCII (No support of extended character不支持扩展字符. Non-LFN cfg. only)437 - U.S.720 - Arabic737 - Greek771 - KBL775 - Baltic850 - Latin 1852 - Latin 2855 - Cyrillic857 - Turkish860 - Portuguese861 - Icelandic862 - Hebrew863 - Canadian French864 - Arabic865 - Nordic866 - Russian869 - Greek 2932 - Japanese (DBCS)936 - Simplified Chinese (DBCS)949 - Korean (DBCS)950 - Traditional Chinese (DBCS)*/#define _USE_LFN 0/*启用长文件名(LFN)的支持*//*0:禁用LFN的支持,_MAX_LFN没有影响1:在BSS上使用静态工作缓冲区启用LFN,总是不是线程安全的2:在栈上使用动态工作缓冲区启用LFN3:使用堆上的动态工作缓冲区启用LFN*/#define _MAX_LFN 255/**//*要启用LFN,必须将Unicode处理函数(选项/unicode.c)添加到项目中工作缓冲区占用(_MAX_LFN + 1) * 2字节和启用exFAT时的额外608字节MAX_LFN可以在12到255之间当使用栈作为工作缓冲区时,要注意堆栈溢出当使用堆作为工作缓冲区时,内存管理函数,必须添加到项目中*/#define _LFN_UNICODE 0/*使用Unicode字符串*//*此选项切换API上的字符编码若路径名使用Unicode字符串,请启用LFN并设置_LFN_UNICODE = 1这个选项还会影响字符串I/O函数的行为*/#define _STRF_ENCODE 3/*字符串I/O函数字符编码*//*当_LFN_UNICODE == 1时,此选项选择要通过字符串I/O函数f_gets(), f_putc(), f_puts和 f_printf()读取/写入的文件上的字符编码0:ANSI/OEM1:UTF-16LE2:UTF-16BE3:UTF-8当_LFN_UNICODE == 0时,此选项无效*/#define _FS_RPATH 0/*配置相对路径的支持*//*0:禁用相对路径并删除相关函数1:支持相对路径. f_chdir()和 f_chdrive()是有效的.2:在1的基础上,f_getcwd()函数是有效的.*///驱动/卷配置#define _VOLUMES 1/*磁盘数量*//*要使用的卷(逻辑驱动器)的数量(1-10)*/#define _STR_VOLUME_ID 0/*卷ID的字符串支持*//*当_STR_VOLUME_ID设置为1时,还可以在路径名中使用预定义的字符串作为驱动器号*/#define _VOLUME_STRS "RAM","NAND","CF","SD","SD2","USB","USB2","USB3"/*定义驱动器ID字符串*//*_VOLUME_STRS为每个逻辑驱动器定义驱动器ID字符串_VOLUME_STRS项目数量必须等于_VOLUMES,驱动器ID字符串的有效字符是:A-Z和0-9*/#define _MULTI_PARTITION 0/*物理驱动器上的多分区支持*/ /*默认情况下(0),每个逻辑驱动器号都绑定到相同的物理驱动器号,并且只有一个FAT卷会被发现在将要挂载的物理驱动器上当启用多分区时(1),每个逻辑驱动器号都可以绑定到VolT oPart[]中列出的任意物理驱动器和分区此外f_fdisk()函数也是可用的。
18-STM32CubeMX系列教程18文件系统FATFS
在main.c文件前面添加错误处理函数声明。
5/7
/* USER CODE BEGIN PFP */ /* Private function prototypes -----------------------------------------------*/ static void Error_Handler(void); /* USER CODE END PFP */
在FATFS配置中选择简体中文字GBK编码支持 中文,使能长文件名,缓存存储在堆 (STACK)中。
1/7
点击菜单栏中Project->Setting修改堆的大小,堆设置为0x1000。(注意:由于刚才设置长文件名 动态缓存存储在堆中,故需要增大堆大小,如果不修改则程序运行时堆会生成溢出,程序进入硬件错误 中断(HardFault),死循环)。
编译程序并下载到开发板。将Micro SD卡插入Micro SD Storage Board中,再插到Open746I-C开发的 SDMMC接口中。打开串口调试助手,设置波特率为115200,按下复位串口助手上面会显示如下信息。
下载简介一下FATFS的几个操作函数。 1.f_mount 在FatFs模块上注册、注销一个工作区(文件系统对象)。
在main函数中添加应用程序。程序中首先注 册一个文件系统对象,然后新 建STM32cube.txt文件,将数据写文件中再读 出来,判断文件系统是否工作正常。
4/7
/* USER CODE BEGIN 2 */ printf("\r\n ****** FatFs Example ******\r\n\r\n"); /*##-1- Register the file system object to the FatFs module ##############*/ retSD = f_mount(&fs, "", 0); if(retSD) { printf(" mount error : %d \r\n",retSD); Error_Handler(); } else printf(" mount sucess!!! \r\n"); /*##-2- Create and Open new text file objects with write access ######*/ retSD = f_open(&fil, filename, FA_CREATE_ALWAYS | FA_WRITE); if(retSD) printf(" open file error : %d\r\n",retSD); else printf(" open file sucess!!! \r\n"); /*##-3- Write data to the text files ###############################*/ retSD = f_write(&fil, wtext, sizeof(wtext), (void *)&byteswritten); if(retSD) printf(" write file error : %d\r\n",retSD); else { printf(" write file sucess!!! \r\n"); printf(" write Data : %s\r\n",wtext); } /*##-4- Close the open text files ################################*/ retSD = f_close(&fil); if(retSD) printf(" close error : %d\r\n",retSD); else printf(" close sucess!!! \r\n"); /*##-5- Open the text files object with read access ##############*/ retSD = f_open(&fil, filename, FA_READ); if(retSD) printf(" open file error : %d\r\n",retSD); else printf(" open file sucess!!! \r\n"); /*##-6- Read data from the text files ##########################*/ retSD = f_read(&fil, rtext, sizeof(rtext), (UINT*)&bytesread); if(retSD) printf(" read error!!! %d\r\n",retSD); else { printf(" read sucess!!! \r\n"); printf(" read Data : %s\r\n",rtext); } /*##-7- Close the open text files ############################*/ retSD = f_close(&fil); if(retSD) printf(" close error!!! %d\r\n",retSD); else printf(" close sucess!!! \r\n"); /*##-8- Compare read data with the expected data ############*/ if(bytesread == byteswritten) { printf(" FatFs is working well!!!\r\n"); } /* USER CODE END 2 */
FatFS文件系统详解
FatFS文件系统详解最近做的spi flash,本打算弄个文件系统,由于之前用过了JFFS、YAFFS和TrueFFS,代码量都相当的大,这次想找款代码量不那么吓人的,学习一下,听说配置会相对复杂一些。
选来选去,最终选定了FatFS,代码量足够的小,最新的R0.09版本只有1个.c文件(当然,还有一个底层的要自己写,option文件夹里的无视),老点版本就更小了。
而且更新很频繁,用户量也够大,就选定它了。
尽管最后由于硬件和项目原因未能实际的移植它到vxWorks,但学过的还是要记录下。
在这里下载源码,只有800多K,小的可怜,还可以下载示例程序,有AVR、Win32、lpc等多平台已实现的方案。
打开看src文件夹,一个option文件夹、00readme.txt、diskio.h、ff.c、ff.h、ffconf.h 和interger.h。
移植时需要修改的文件主要包括ffconf.h和interger.h,后者是在它的定义与目标平台上的有冲突,或者用的不习惯时修改的。
在做具体修改之前,先大概阅读下FatFS的源代码,可以先读integer.h,了解所用的数据类型,然后是ff.h,了解文件系统所用的数据结构和各种函数声明,再就是diskio.h,了解与介质相关的数据结构和操作函数。
ff.c这个文件相对较大,可以在最后将所实现的函数大致扫描一遍,之后根据用户应用层程序调用函数的次序仔细阅读相关代码。
各个文件都可以直接用记事本打开查阅,非常方便。
ff.h中的几个结构体十分重要,列举如下,首先是最基础的文件系统结构体:[cpp] view plain copyprint?1./* File system object structure (FATFS) */2.typedef struct {3.BYTE fs_type; /* FAT子类型,一般在mount时用,置0表示未挂载*/4.BYTE drv; /* 物理驱动号,一般为0*/5.BYTE csize; /* 每个簇的扇区数目(1,2,4...128) */6.BYTE n_fats; /* 文件分配表的数目(1,2) */7./*FAT文件系统依次为:引导扇区、两个文件分配表、根目录区和数据区*/8.BYTE wflag; /* 标记文件是否被改动过,为1时要回写*/9.BYTE fsi_flag; /* 标记文件系统信息是否被改动过,为1时要回写*/10.WORD id; /* 文件系统挂载ID */11.WORD n_rootdir; /* 根目录区入口(目录项)的个数(用于FAT12/16)*/12.#if _MAX_SS != 51213.WORD ssize; /* 每扇区的字节数(用于扇区大于512Byte的flash) */14.#endif15.#if _FS_REENTRANT16._SYNC_t sobj; /* 允许重入,即定义同步对象,用在tiny中*/17.#endif18.#if !_FS_READONLY19.DWORD last_clust; /* 最后一个被分配的簇*/20.DWORD free_clust; /* 空闲簇的个数*/21.DWORD fsi_sector; /* 存放fsinfo的扇区(用于FAT32) */22.#endif23.#if _FS_RPATH24.DWORD cdir; /* 允许相对路径时用,存储当前目录起始簇(0:root)*/25.#endif26.DWORD n_fatent; /* FAT入口数(簇的数目 + 2)*/27.DWORD fsize; /* 每个FAT所占扇区*/28.DWORD fatbase; /* FAT起始扇区*/29.DWORD dirbase; /* 根目录起始扇区(FAT32:Cluster#) */30.DWORD database; /* 数据目录起始扇区*/31.DWORD winsect; /* 当前缓冲区中存储的扇区号*/32.BYTE win[_MAX_SS]; /* 单个扇区缓存*/33.} FATFS;然后是与之相关的文件和文件夹结构体,附上具体注释:[cpp] view plain copyprint?1./* File object structure (FIL) */2.typedef struct {3.FATFS* fs; /* 所在的fs指针*/4.WORD id; /* 所在的fs挂载编号*/5.BYTE flag; /* 文件状态*/6.BYTE pad1; /* 不知道含义,也未见程序使用*/7.DWORD fptr; /* 文件读写指针*/8.DWORD fsize; /* 大小*/9.DWORD sclust; /* 文件起始簇(fsize=0时为0) */10.DWORD clust; /* 当前簇*/11.DWORD dsect; /* 当前数据扇区*/12.#if !_FS_READONLY13.DWORD dir_sect; /* 包含目录项的扇区 */14.BYTE* dir_ptr; /* Ponter to the directory entry in the window */15.#endif16.#if _USE_FASTSEEK17.DWORD* cltbl; /*指向簇链接映射表的指针*/18.#endif19.#if _FS_SHARE20.UINT lockid; /* File lock ID (index of file semaphore table) */21.#endif22.#if !_FS_TINY23.BYTE buf[_MAX_SS]; /* File data read/write buffer * /24.#endif25.} FIL;下面是目录的:[cpp] view plain copyprint?1./* Directory object structure (DIR) */2.typedef struct {3.FATFS* fs; /* 同上*/4.WORD id;5.WORD index; /* 当前读写索引号 */6.DWORD sclust; /* 文件数据区开始簇*/7.DWORD clust; /* 当前簇*/8.DWORD sect; /* 当前扇区*/9.BYTE* dir; /* 扇区缓存中当前SFN入口指针,SFN含义未知,猜测和LFN类似,与文件名相关*/10.BYTE* fn; /* Pointer to the SFN (in/out) {file[8] ,ext[3],status[1]} */11.#if _USE_LFN12.WCHAR* lfn; /* Pointer to the LFN working buf fer */13.WORD lfn_idx; /* Last matched LFN index numb er (0xFFFF:No LFN) */14.#endif15.} DIR;其他类似f_mount、f_open等接口API就不细说了,在挂载的时候其实真正起作用的是chk_mounted函数,在这里才会将挂载分区的相关信息分配到FatFS结构体中;还有一个get_fat函数,也比较重要,在f_open和许多目录操作的函数中都有用到,而且FAT入口这个表达也十分晦涩,而它又调用了一个move_window的函数,也是十分晦涩难懂,可能是我英语太烂的缘故吧。
FatFs中文译文
原网络的地址如下,下面是我做的一些中文解释。
大家可以到原网站获取更多的信息。
/fsw/ff/00index_e.html英文原文:FatFs is a generic file system module to implement the FAT file system to small embedded systems. The FatFs is written in compliance with ANSI C, therefore it is independent of hardware architecture. It can be incorporated into cheap microcontrollers, such as 8051, PIC, AVR, SH, Z80, H8, ARM and etc..., without any change.中文译文:FatFs是一个通用的文件系统模块,以小的嵌入式系统的FAT文件系统。
FatFs的编程遵守的ANSI C格式语法标准,因此,它是具有独立于硬件架构。
在不做任何改变就可以被移植到常用的微控制器中,如8051, PIC, AVR, SH, Z80, H8, ARM等。
FatFs 特点的FAT协议,只需要调用FatFs Module提供给用户的一系列应用接口函数,如f_open,f_read,f_write、f_close等,就可以像在PC上读/写文件那样简单。
中间层FatFs Module实现了FAT文件读/写协议。
FatFs Module的完全版提供的是ff.c、ff.h,简化版Tiny—FatFs提供的是tff.c、tff.h。
除非有必要,使用者一般不用修改,使用时将需要版本的头文件直接包含进去即可。
需要使用者编写移植代码的是FatFs Module提供的底层接口,它包括存储媒介读/写接口DiskIO和供给文件创建修改时间的实时时钟。
fatfs 详解
fatfs 详解摘要:一、FatFs简介二、FatFs文件系统结构三、FatFs操作方法四、FatFs应用场景五、FatFs优缺点六、总结正文:一、FatFs简介FatFs是一款开源的文件系统库,主要用于嵌入式系统中对FAT32和exFAT文件系统进行操作。
它是由Chris W.contention开发的,具有开源、高效、易于使用等特点。
在很多嵌入式设备的开发中,FatFs都发挥着重要作用。
二、FatFs文件系统结构FatFs文件系统是基于FAT32和exFAT文件标准的。
它包括以下几个部分:1.文件系统初始化:创建文件系统结构体,初始化操作环境。
2.挂载文件系统:将FatFs挂载到指定的目录。
3.文件操作:包括创建、删除、重命名、读取、写入等操作。
4.目录操作:包括创建、删除、重命名、列出目录内容等操作。
5.存储空间管理:分配和释放存储空间。
6.文件名解析:将文件名解析为文件路径。
三、FatFs操作方法FatFs提供了丰富的API供开发者使用。
以下是一些常用的操作方法:1.初始化文件系统:FF_Init;2.挂载文件系统:FF_Mount;3.卸载文件系统:FF_Unmount;4.创建文件:FF_Create;5.删除文件:FF_Delete;6.重命名文件:FF_Rename;7.读取文件:FF_Read;8.写入文件:FF_Write;9.列出目录内容:FF_List;10.查找文件:FF_Find;11.设置文件属性:FF_SetAttribute;12.获取文件属性:FF_GetAttribute;四、FatFs应用场景FatFs适用于以下场景:1.嵌入式设备:如智能家居、工业控制系统等;2.移动存储设备:如U盘、SD卡等;3.网络存储设备:如NAS、云存储等;4.需要使用FAT32或exFAT文件系统的各类项目。
五、FatFs优缺点优点:1.开源:源代码公开,便于二次开发和修改;2.高效:具有良好的性能,占用资源少;3.易于使用:提供了丰富的API,上手简单;4.跨平台:支持多种操作系统和硬件平台。
stm32 fatfs 中文编码
stm32 fatfs 中文编码(最新版)目录1.STM32 和 FATFS 简介2.中文编码在 STM32 FATFS 中的应用3.如何实现 STM32 FATFS 中文编码正文【1.STM32 和 FATFS 简介】STM32 是一款由 ST 公司推出的基于 ARM Cortex-M 内核的微控制器,具有高性能、低功耗、多功能等特点,广泛应用于各种嵌入式系统中。
而 FATFS 是一种用于嵌入式系统的文件系统,是 FAT 文件系统的一个变种,可以支持多种存储设备,如 SD 卡、硬盘等。
【2.中文编码在 STM32 FATFS 中的应用】在 STM32 中,我们可以使用 FATFS 来存储和读取中文字符。
为了实现这一功能,我们需要了解中文编码在 FATFS 中的存储方式。
中文字符通常采用 UTF-8 编码,这种编码方式可以将中文字符与英文字符、数字和特殊符号统一起来,方便存储和传输。
【3.如何实现 STM32 FATFS 中文编码】要实现 STM32 FATFS 中文编码,我们需要进行以下几个步骤:(1)配置 STM32 的 GPIO 和串口,以便与外部存储设备进行通信。
(2)使用 FATFS 库函数初始化文件系统,包括分配内存、初始化 FATFS 结构体等。
(3)使用 FATFS 库函数创建目录和文件,以便存储中文字符。
(4)读取或写入中文字符时,使用 UTF-8 编码将中文字符转换成字节,然后通过 FATFS 库函数进行读写操作。
(5)当需要显示中文字符时,使用 LCD 显示屏或串口将中文字符输出。
通过以上步骤,我们可以实现 STM32 FATFS 中文编码的功能。
第1页共1页。
Fatfs文件系统2015-04
2015-04-18FATFS文件管理系统一、FATFS简介FATFS 是一个完全免费开源的FAT 文件系统模块,专门为小型的嵌入式系统而设计。
它完全用标准 C 语言编写,所以具有良好的硬件平台独立性,可以移植到8051、PIC、AVR、SH、Z80、H8、ARM 等系列单片机上而只需做简单的修改。
它支持FATl2、FATl6 和FAT32,支持多个存储媒介;有独立的缓冲区,可以对多个文件进行读/写,并特别对8 位单片机和16 位单片机做了优化。
FATFS 的特点有:✧ 代码量少、效率高✧ 多种配置选项✧ 支持多卷(物理驱动器或分区,最多10 个卷)✧ 多个ANSI/OEM 代码页包括DBCS✧ 支持长文件名、ANSI/OEM 或Unicode✧ 支持RTOS✧ 支持多种扇区大小✧ 只读、最小化的API 和I/O 缓冲区等二、FATFS层次结构图最顶层是应用层,使用者无需理会FATFS 的内部结构和复杂的FAT 协议,只需要调用FATFS 模块提供给用户的一系列应用接口函数,如f_open,f_read,f_write 和f_close 等,就可以像在PC 上读/写文件那样简单。
中间层FATFS 模块,实现了FAT 文件读/写协议。
FATFS 模块提供的是ff.c 和ff.h。
除非有必要,使用者一般不用修改,使用时将头文件直接包含进去即可。
需要我们编写移植代码的是FATFS 模块提供的底层接口,它包括存储媒介读/写接口(disk I/O)和供给文件创建修改时间的实时时钟。
三、FATFS源码1.源码下载(1)在/fsw/ff/00index_e.html下载FatFs源码R0.10b版本;(2)打开压缩包,里面有doc和src两个文件夹,doc是对FatFs的一些介绍及更新说明,src为FatFs的源码;2.FatFs源码介绍(1)与硬件平台无关的文件✧ffconf.h FATFS 模块配置文件✧ff.h FATFS 和应用模块公用的包含文件✧ff.c FATFS 模块✧diskio.h FATFS 和disk I/O 模块公用的包含文件✧interger.h 数据类型定义✧option 可选的外部功能(比如支持中文等)(2) 与硬件平台相关的文件✧diskio.c FATFS 和disk I/O 模块接口层文件(3) 移植时,重要的选项配置✧_FS_TINY。
FATFS文件系统应用程序手册(中文版)
FA_CREATE_NEW, FA_OPEN_ALWAYS 是无效的。
返回值
FR_OK (0)
函数成功,该文件对象有效。
FR_NO_FILE
找不到该文件。
FR_NO_PATH
找不到该路径。
FR_INVALID_NAME
文件名无效。
FR_INVALID_DRIVE 驱动器号无效。
FR_EXIST
该文件已存在。
if (res || bw < br) break; /* 磁盘满错误 */ }
/* 关闭打开的文件 */ f_close(&fsrc); f_close(&fdst);
/* 注销工作区(在废弃前) */ f_mount(0, NULL); f_mount(1, NULL); }
3. f_close
预分配) 。
FRESULT f_lseek (
FIL* FileObject,
/* 文件对象结构指针 */
DWORD Offset
/* 文件字节偏移 */
);
参数
FileObject 打开的文件对象的指针
Offset 相对于文件起始处的字节数
返回值
FR_OK (0) 函数执行成功。
FR_DISK_ERR 由于底层磁盘 I/O 函数中的错误,而导致该函数失败。
FileSystemObject 工作区(文件系统对象)指针。
返回值
FR_OK (0) 函数成功。
FR_INVALID_DRIVE 驱动器号无效
描述
f_mount 函数在 FatFs 模块上注册/ 注销一个工作区。在使用任何其他文
件函数之前,必须使用该函数为每个卷注册一个工作区。要注销一个工作区,只
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
FATFS-------基于R0.009A 版本 函数名描述 f_mount注册/ 注销一个工作区 f_open打开/ 创建一个文件 f_close关闭一个文件 f_read读取文件 f_write写文件 f_lseek移动读/ 写指针,扩展文件大小 f_truncate截断文件大小 f_sync清空缓冲数据 f_opendir打开一个目录 f_readdir读取一个目录项 f_getfree获取空闲簇 f_stat获取文件状态 f_mkdir创建一个目录 f_unlink删除一个文件或目录 f_chmod修改属性 f_utime修改日间戳 f_rename删除/ 移动一个文件或目录 f_chdir修改当前目录 f_chdrive修改当前驱动器 f_getcwd恢复当前目录 f_forward直接输出文件数据流 f_mkfs在驱动器上创建一个文件系统 f_fdisk划分一个物理驱动器 f_gets读取一个字符串 f_putc写一个字符 f_puts写一个字符串 f_printf写一个格式化的字符串 f_tell获取当前读/ 写指针 f_eof测试一个文件是否到达文件末尾 f_size获取一个文件的大小 f_error 测试一个文件是否出错文件系统应用程序技术手册(中文版)FATFS文件系统应用程序目录:一.应用程序1. f_mount在FatFs模块上注册/ 注销一个工作区(文件系统对象)。
FRESULT f_mount (BYTE Drive, /* 逻辑驱动器号 */FATFS* FileSystemObject /* 工作区指针 */);参数Drive注册/ 注销工作区的逻辑驱动器号(0-9)。
FileSystemObject工作区(文件系统对象)指针。
返回值FR_OK (0) 函数成功。
FR_INVALID_DRIVE 驱动器号无效描述f_mount 函数在 FatFs模块上注册/ 注销一个工作区。
在使用任何其他文件函数之前,必须使用该函数为每个卷注册一个工作区。
要注销一个工作区,只要指定FileSystemObject为NULL 即可,然后该工作区可以被丢弃。
该函数只初始化给定的工作区,以及将该工作区的地址注册到内部表中,不访问磁盘I/O 层。
卷安装过程是在f_mount 函数执行后或存储介质改变后的第一次文件访问时完成的。
2. f_open创建/ 打开一个用于访问文件的文件对象FRESULT f_open (FIL* FileObject, /* 空白文件对象结构指针 */const XCHAR* FileName, /* 文件名指针 */BYTE ModeFlags /* 模式标志 */);参数FileObject将被创建的文件对象结构的指针。
FileName NULL结尾的字符串指针,该字符串指定了将被创建或打开的文件名。
ModeFlags指定文件的访问类型和打开方法。
由以下标志的一个组合指定的。
模式描述FA_READ 指定读访问对象。
可以从文件中读取数据。
与FA_WRITE 结合可以进行读写访问。
FA_WRITE 指定写访问对象。
可以向文件中写入数据。
与FA_READ 结合可以进行读写访问。
FA_OPEN_EXISTING 打开文件。
如果文件不存在,则打开失败。
(默认)FA_OPEN_ALWAYS 如果文件存在,则打开;否则,创建一个新文件。
FA_CREATE_NEW 创建一个新文件。
如果文件已存在,则创建失败。
FA_CREATE_ALWAYS 创建一个新文件。
如果文件已存在,则它将被截断并覆盖。
注意:当 _FS_READONLY == 1 时,模式标志 FA_WRITE, FA_CREATE_ALWAYS, FA_CREATE_NEW, FA_OPEN_ALWAYS 是无效的。
返回值FR_OK (0) 函数成功,该文件对象有效。
FR_NO_FILE 找不到该文件。
FR_NO_PATH 找不到该路径。
FR_INVALID_NAME 文件名无效。
FR_INVALID_DRIVE 驱动器号无效。
FR_EXIST 该文件已存在。
FR_DENIED 由于下列原因,所需的访问被拒绝:•以写模式打开一个只读文件。
•由于存在一个同名的只读文件或目录,而导致文件无法被创建。
•由于目录表或磁盘已满,而导致文件无法被创建。
FR_NOT_READY 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。
FR_WRITE_PROTECTED 在存储介质被写保护的情况下,以写模式打开或创建文件对象。
FR_DISK_ERR 由于底层磁盘 I/O 接口函数中的一个错误,而导致该函数失败。
FR_INT_ERR 由于一个错误的 FAT 结构或一个内部错误,而导致该函数执行失败。
FR_NOT_ENABLED 逻辑驱动器没有工作区。
FR_NO_FILESYSTEM 磁盘上没有有效地FAT 卷。
描述如果函数成功,则创建一个文件对象。
该文件对象被后续的读/ 写函数用来访问文件。
如果想要关闭一个打开的文件对象,则使用f_close 函数。
如果不关闭修改后的文件,那么文件可能会崩溃。
在使用任何文件函数之前,必须使用 f_mount 函数为驱动器注册一个工作区。
只有这样,其他文件函数才能正常工作。
示例(文件拷贝)void main (void){FATFS fs[2]; /* 逻辑驱动器的工作区(文件系统对象) */FIL fsrc, fdst; /* 文件对象 */BYTE buffer[4096]; /* 文件拷贝缓冲区 */FRESULT res; /* FatFs 函数公共结果代码 */UINT br, bw; /* 文件读/写字节计数 *//* 为逻辑驱动器注册工作区 */f_mount(0, &fs[0]);f_mount(1, &fs[1]);/* 打开驱动器 1 上的源文件 */res = f_open(&fsrc, "1:srcfile.dat", FA_OPEN_EXISTING | FA_READ);if (res) die(res);/* 在驱动器 0 上创建目标文件 */res = f_open(&fdst, "0:dstfile.dat", FA_CREATE_ALWAYS | FA_WRITE);if (res) die(res);/* 拷贝源文件到目标文件 */for (;;) {res = f_read(&fsrc, buffe r, sizeof(buffer), &br);if (res || br == 0) break; /* 文件结束错误 */res = f_write(&fdst, buffer, br, &bw);if (res || bw < br) break; /* 磁盘满错误 */}/* 关闭打开的文件 */f_close(&fsrc);f_close(&fdst);/* 注销工作区(在废弃前) */f_mount(0, NULL);f_mount(1, NULL);}3. f_close关闭一个打开的文件FRESULT f_close (FIL* FileObject /* 文件对象结构的指针 */);参数FileObject指向将被关闭的已打开的文件对象结构的指针。
返回值FR_OK (0) 文件对象已被成功关闭。
FR_DISK_ERR 由于底层磁盘 I/O 函数中的错误,而导致该函数失败。
FR_INT_ERR 由于一个错误的 FAT 结构或一个内部错误,而导致该函数失败。
FR_NOT_READY 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。
FR_INVALID_OBJECT 文件对象无效。
描述f_close 函数关闭一个打开的文件对象。
无论向文件写入任何数据,文件的缓存信息都将被写回到磁盘。
该函数执行成功后,文件对象不再有效,并且可以被丢弃。
如果文件对象是在只读模式下打开的,不需要使用该函数,也能被丢弃。
4. f_read从一个文件读取数据FRESULT f_read (FIL* FileObject, /* 文件对象结构的指针 */void* Buffer, /* 存储读取数据的缓冲区的指针 */UINT ByteToRead, /* 要读取的字节数 */UINT* ByteRead /* 返回已读取字节数变量的指针 */);参数FileObject指向将被读取的已打开的文件对象结构的指针。
Buffer 指向存储读取数据的缓冲区的指针。
ByteToRead 要读取的字节数,UINT范围内。
ByteRead 指向返回已读取字节数的 UINT 变量的指针。
在调用该函数后,无论结果如何,数值都是有效的。
返回值FR_OK (0) 函数执行成功。
FR_DENIED 由于文件是以非读模式打开的,而导致该函数被拒绝。
FR_DISK_ERR 由于底层磁盘 I/O 函数中的错误,而导致该函数失败。
FR_INT_ERR 由于一个错误的 FAT 结构或一个内部错误,而导致该函数失败。
FR_NOT_READY 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。
FR_INVALID_OBJECT 文件对象无效。
描述文件对象中的读/ 写指针以已读取字节数增加。
该函数执行成功后,应该检查 *ByteRead 来检测文件是否结束,如果 *ByteRead < ByteToRead ,则表示读/写指针到达了文件结束位置。
5. f_write写入数据到一个文件FRESULT f_write (FIL* FileObject, /* 文件对象结构的指针 */const void* Buffer, /* 存储写入数据的缓冲区的指针 */UINT ByteToWrite, /* 要写入的字节数 */UINT* ByteWritten /* 返回已写入字节数变量的指针 */);参数FileObject指向将被写入的已打开的文件对象结构的指针。
Buffer 指向存储写入数据的缓冲区的指针。
ByteToRead 要写入的字节数,UINT范围内。
ByteRead 指向返回已写入字节数的 UINT 变量的指针。
在调用该函数后,无论结果如何,数值都是有效的。
返回值FR_OK (0) 函数执行成功。
FR_DENIED 由于文件是以非写模式打开的,而导致该函数被拒绝。
FR_DISK_ERR 由于底层磁盘 I/O 函数中的错误,而导致该函数失败。
FR_INT_ERR 由于一个错误的 FAT 结构或一个内部错误,而导致该函数失败。