stm32sdiofatfs文件系统源码分析

合集下载

STM32+SDIO+FATFS文件系统直读SD卡

STM32+SDIO+FATFS文件系统直读SD卡

STM32+SDIO+FATFS文件系统直读SD卡STM32+SDIO+FATFS文件系统直读SD卡网上关于小型嵌入式的文件系统有好多~当然要数FATFS 很是出名一来小巧,二来免费。

当然了国产的振南的znFAT 一样开源好用而且极其的省资源~!非常适合51单片。

更重要的是国语的支持,呵呵!这次在STM32上为SD卡移植文件系统还是非常简单顺利的,这多亏了ST 官方提供的驱动,而我自己不用动手编写SD卡的命令省了很多时间而且官方做的驱动虽然效率一般但是极其严谨我很是佩服。

FATFS的官方网站是znFAT的官方网站是SD卡可以用SPI驱动也可以直接用SDIO 驱动STM32 256KB FLASH 以上的片子全部都有SDIO,我们当然要用高速快捷的SDIO 方式了!至于 SDIO 又有 1位 4位 8 位的之分我想不来8位SDIO 是怎么回事?SD卡上最多只能接4位嘛~网上有人说4位的SDIO 不好用多半是固件版本太老的缘故了。

呵呵这里还是要靠库~STM32真适合懒人用。

网上关于的FATFS 的文章很多不过都太老旧,很多东西已经不适用了。

我建议阁下到官方去下载最新的版本目前是最新是R0.08b,使用最新的版本好处是很多网上很多要改来改去的地方只要你使用了新版本那就是完全可以规避的。

另外STM32 的SDIO驱动也一定要用最新的,老版本问题很多不少人的失败就在这。

我这次用的是V3.3的库没有任何改动就可以了,现在最新的好像在3.4以上了。

好了说说移植ffconf.h是配置的头文件简单的修改宏就可以了,英文注释的很完全而且网上也有翻译我不多说了自己看主要在这里进行功能裁剪写写我的配置。

#define _FS_TINY 0 /* 0:Normal or 1:Tiny 完整的FATFS 精简版的是Tiny */#define _FS_READONLY 0 /* 0:Read/Write or 1:Read only 能读能写*/#define _FS_MINIMIZE 1 /* 0 to 3 简单的裁剪f_mkdir, f_chmod..这些功能没法用的*//* 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 1./ 3: f_lseek is removed in addition to 2. */#define _USE_STRFUNC 0 /* 0:Disable or 1/2:Enable是否使用字符串文件接口 *//* To enable string functions, set _USE_STRFUNC to 1 or 2. */#define _USE_MKFS 0 /* 0:Disable or 1:Enable 制作文件系统我在PC上一般已经格式化好了*//* To enable f_mkfs function, set _USE_MKFS to 1 and set _FS_READONLY to 0 */#define _USE_FORWARD 0 /* 0:Disable or 1:Enable 发文件流?*//* To enable f_forward function, set _USE_FORWARD to 1 and set _FS_TINY to 1. */#define _USE_FASTSEEK 0 /* 0:Disable or 1:Enable 搜索*//* To enable fast seek feature, set _USE_FASTSEEK to 1. */#define _CODE_PAGE 1 / /1 - ASCII only (Valid for non LFN cfg.)#define _USE_LFN 0 /* 0 to 3 */#define _MAX_LFN 255 /* Maximum LFN length to handle (12 to 255) 这些都是长文件名或是汉字文件支持很费资源所以不开启这些*/#define _FS_SHARE 0 /* 0:Disable or >=1:Enable 不使用相对路径*/#define _FS_SHARE 0 /* 0:Disable or >=1:Enable 文件共享多任务的操作系统会用到的*/#define _FS_REENTRANT 0 /* 0:Disable or 1:Enable 这些是啥用?同步什么呢?默认就好了*/#define _FS_TIMEOUT 1000 /* Timeout period in unit of time ticks */#define _SYNC_t HANDLE /* O/S dependent type of sync object. e.g. HANDLE, OS_EVENT*, ID and etc.. */integer.h主要定义了文件的类型若是最新的可以不用修改。

stm32-SD卡FatFS文件系统

stm32-SD卡FatFS文件系统

stm32-SD卡FatFS文件系统STM32平台SD卡的FatFS文件系统开发系统平台:STM32系列的STM32F103ZESPI方式与SD卡通信SD上移植FatFS系统1 FatFS文件系统1.1 FatFS简介FatFS是一个为小型嵌入式系统设计的通用FAT(File Allocation Table)文件系统模块。

FatFs 的编写遵循ANSI C,并且完全与磁盘I/O 层分开。

因此,它独立(不依赖)于硬件架构,可以被嵌入到低成本的微控制器中,如A VR, 8051, PIC, ARM, Z80, 68K 等等,而不需要做任何修改。

特点:Windows兼容的FAT文件系统不依赖于平台,易于移植代码和工作区占用空间非常小多种配置选项多卷(物理驱动器和分区)多ANSI/OEM代码页,包括DBCS在ANSI/OEM或Unicode中长文件名的支持RTOS的支持多扇区大小的支持只读,最少API,I/O缓冲区等等1.2 FatFS文件系统移植FatFS文件系统移植需要的几个关键文件如下。

●ff.c(不动)文件系统的实现代码,里面主要是FatFS文件系统源码,移植的时候不需要修改;●diskio.h(不动)声明diskio.c文件中需要的一些接口函数和命令格式;●diskio.c(自写)这个文件是文件系统底层和SD驱动的中间接口的实现代码,移植的时候需要改写在diskio.h中声明的那几个函数,代码在ff.c中被调用;●integer.h(微改)这是FatFS用到的数据类型定义,按移植的平台修改;●ff.h(不动)是FatFS的文件系统的函数(在ff.c中)声明,以及一些选项的配置,具体选项及详细说明在文件中都有;●ffconf.h(按需要)这个是在FatFS的0.08a版本中有看到,0.06版本中还没有,是关于FatFS系统模块的一些配置;综上,需要修改的就是diskio.c文件,主要是6个函数,描述如下。

stm32 fatfs 中文编码

stm32 fatfs 中文编码

stm32 fatfs 中文编码摘要:1.STM32概述2.FATFS简介3.中文编码概述4.STM32中实现FATFS中文编码的方案5.应用实例及代码分析6.总结与展望正文:一、STM32概述STM32是意法半导体(STMicroelectronics)公司推出的一款基于ARM Cortex-M内核的微控制器(Microcontroller Unit,MCU)。

STM32具有高性能、低功耗、多功能、易扩展等特点,广泛应用于各种嵌入式系统中。

二、FATFS简介FATFS(FAT File System,文件系统)是一种通用的、基于FAT(File Allocation Table,文件分配表)结构的文件系统,主要用于管理存储设备上的文件和目录。

在嵌入式系统中,FATFS常用于闪存、SD卡等存储介质的管理。

三、中文编码概述中文编码是一种将中文文字转换为计算机内部存储和处理的形式。

目前常用的中文编码有GBK、GB18030、UTF-8等。

其中,GBK是我国自主研发的一种编码方式,主要适用于简体中文环境;GB18030是我国规定的另一种汉字编码标准,支持GBK以外的汉字;UTF-8是一种跨平台的编码方式,支持多种语言,包括中文。

四、STM32中实现FATFS中文编码的方案在STM32嵌入式系统中,实现FATFS中文编码主要通过以下几种方式:1.使用GBK编码:在系统初始化时,设置FATFS的相关参数,如文件名编码方式为GBK。

同时在创建、读取、写入等操作中,使用GBK编码进行字符串处理。

2.使用UTF-8编码:与GBK编码类似,在系统初始化时,设置FATFS的相关参数,如文件名编码方式为UTF-8。

同时在创建、读取、写入等操作中,使用UTF-8编码进行字符串处理。

3.自定义中文编码:针对特定应用场景,可以自定义一种适用于中文的编码方式。

在FATFS中,通过编写相应的处理函数,实现对中文文件名的存储和读取。

STM32笔记(六)SD卡的读写和FatFS文件系统

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卡初始化函数。

基于STM32的FATFS文件系统移植

基于STM32的FATFS文件系统移植

基于STM32的FATFS文件系统移植经过将近1个月的时间,终于完成了STM32是FATFS文件系统移植,说来是够艰辛的,SDIO章节是我学习cortex m3以来消耗时间最多的章节。

这里说一些个人对于SDIO的看法,其实SDIO属于意法半导体公司在cortex m3内核之外(在芯片之内)添加的功能外设,完全属于意法的杰作了。

关于SD卡的读写,分为SPI模式和SD模式(专用模式),这两种模式都必须遵循SD2.0协议。

SPI模式控制方法相对较为简单,操作简洁,但失去了速度;SD模式控制方法相对较为复杂一点,操作繁琐,但具有高速的特点。

FATFS文件系统是一种兼容性比较高的文件管理系统,兼容FAT32、FAT16。

关于文件系统的细节,如果认真研究的话,应该会觉得作者的伟大,惊叹代码的绝妙。

我们要想移植FATFS,首先要做的是编写基于SDIO模式的SD卡底层驱动,这部份完整的驱动代码较多,大概有2000多行,但我们首先需要克服心理作用,再长的代码只要理解之后,都很简单。

意法在参考手册中介绍SDIO时,上下文比较乱,其中还夹杂讲解了一些SD2.0协议,使得初学者云里雾里。

因为SDIO是属于一种完全的外设接口,所以在讲解的过程中必须与实际的外设SD卡联系起来。

STM32的SDIO接口兼容性很高,可以兼容SD1.0卡、2.0卡、MMC 卡、多媒体卡等,与多媒体卡4.2支持三种不同的数据总线模式:1位、4位和8位,在8位的模式下速度可以达到48MHZ,但在SD2.0协议中只支持两种总数总线模式:1位和4位,在SDIO中存在两种状态机:命令状态机(CPSM)和数据状态机(DPSM),两者的使能信号独立,用于控制外部双向驱动器,命令是通过CMD命令线单线串行发送的,而数据是由于DATx数据线传输(1位或4位),每当CPSM发送一条命令给卡时,如工作正常的话,卡都会有与CPSM中设置响应格式相对应的响应内容(短响应与长响应),两者的细节在下面讲到。

stm32 fatfs 中文编码

stm32 fatfs 中文编码

深度探讨STM32 FATFS中文编码1. 介绍STM32是一款由意法半导体推出的微控制器,广泛应用于各种嵌入式系统中。

而FATFS是一种用于处理文件系统的软件库,可以方便地在STM32上使用。

在实际开发中,中文编码是一个常见的需求,然而在使用STM32 FATFS时,对中文编码的处理可能会遇到一些问题。

本文将深入探讨在STM32 FATFS中的中文编码处理,以及解决方案和个人观点。

2. 了解中文编码中文编码是指将汉字转换成计算机能够识别和处理的代码。

常见的中文编码方式包括GBK、UTF-8、UTF-16等。

在STM32开发中,由于资源和性能的限制,一般会选择使用较为轻量级的UTF-8编码。

然而,FATFS库本身对中文编码的支持并不完善,这就需要开发者在实际应用中进行一些处理和调整。

3. STM32 FATFS中的中文编码处理在使用STM32 FATFS进行文件操作时,如果需要处理中文编码,需要考虑以下几个方面:- 文件名的编码:在创建、读取和写入文件时,需要确保文件名的编码是正确的。

FATFS库本身对中文文件名的支持并不完善,可能会出现乱码或无法识别的情况。

- 文件内容的编码:对于文件内容中包含的中文字符,同样需要注意编码的正确性。

在读取和写入文件时,需要进行正确的编码转换,以确保数据的完整性和准确性。

针对以上问题,可以通过修改FATFS库的底层代码,或者在应用层进行特定的编码处理来解决。

可以使用一些第三方的中文编码库,或者自行实现中文编码的处理逻辑。

4. 解决方案和个人观点针对STM32 FATFS中的中文编码问题,个人认为可以从以下几个方面进行解决:- 定制化开发:针对具体的应用场景,可以进行定制化开发,实现针对性的中文编码处理逻辑。

这样可以最大程度地满足需求,但相对而言工作量较大。

- 使用第三方库:可以选择一些成熟的第三方中文编码库,比如iconv 等,来简化中文编码的处理。

这样能够节省开发时间,但可能会引入一些额外的依赖问题。

STM32之FATFS文件系统(SPI方式)笔记

STM32之FATFS文件系统(SPI方式)笔记

STM32之FATFS文件系统(SPI方式)笔记BY:T7Date:20171202At:YSU_B307开发环境:uVision: V5.12.0.0STM32F103V8T6库版本: STM32F10x_StdPeriph_Lib_V3.5.0FATSF : ff13a工程版本:FATFS_V1日期:硬件连接:SPI1_CS -> PA4 SPI1_CLK -> PA5 SPI1_MISO -> PA6 SPI1_MOSI -> PA7工程功能:建立在SPI_SD的基础上,完成文件系统的初步接触。

一、FATFS文件系统1.使用开源的FAT文件系统模块,其源代码的获取从官网:目前最新版本是:ff13a2.解压后得到两个文件:其中,documents相当于STM32的固件库使用手册,介绍FATFS系统的函数使用方法,source 中则是需要用到的源代码。

因为FATFS使用SD卡,所以FATFS的基础是SD卡的正常读写,这里采用SPI模式。

二、STM32之SD卡_SPI模式1.硬件连接:SPI1_CS -> PA4 SPI1_CLK -> PA5 SPI1_MISO -> PA6 SPI1_MOSI -> PA72.SPI模式下STM32读写SD卡的工程结构在确定STM32使用SPI模式读写SD卡没有问题后,进入FATSF文件系统的实验,另源代码在文档最后。

三、FATSF文件系统移植1.配置工程环境1)STM32读写SD卡-SPI模式成功2)将解压后的ff13a整个文件夹赋值到工程目录下,如图:3)返回到MDK界面下,添加ff13a项目组,并把ff13a\source\目录下ff.c,diskio.c,ffunicode.c,ffsystem.c添加到项目组中,如下图:4)在Target Options的C++编译器选项中添加文件包含路径,如下图四、为FATSF文件系统添加底层驱动(一)在diskio.c中添加函数代码1.DSTATUS disk_status (BYTE pdrv); 添加完成后如下图2.DSTATUS disk_initialize (BYTE pdrv); 添加完成后如下图3.DRESULT disk_read (BYTE pdrv, BYTE* buff, DWORD sector, UINT count);4.DRESULT disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, UINT count);5.DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff);6.DWORD get_fattime (void);注意:在diskio.c中DEV_MMC的宏定义要为0,如下图(二)打开Ffconf.h函数1.改变FF_CODE_PAGE的值如下2.改变FF_USE_LFN的值如下五、Main主函数Main.c函数如下代码:#include "main.h"#define ONE_BLOCK 512#define TWO_BLOCK 1024uint8_t sd_RxBuf[TWO_BLOCK];//SD卡数据j接收缓存区uint8_t sd_TxBuf[TWO_BLOCK] = {0};//SD卡数据j接收缓存区FRESULT res;//读写文件的返回值FIL ;//文件系统结构体,包含文件指针等成员UINT br,bw;//Fil R/W countBYTE [ONE_BLOCK];// BUFFER//BYTE Tx[] = "This is the FATFS System!\r\n";BYTE Tx[] = "中文文件系统实验!\r\n";static const char * FR_Table[]={"FR_OK:成功", /* (0) Succeeded */"FR_DISK_ERR:底层硬件错误", /* (1) A hard error occurred in the low level disk I/O layer */"FR_INT_ERR:断言失败", /* (2) Assertion failed */"FR_NOT_READY:物理驱动没有工作", /* (3) The physicaldrive cannot work */"FR_NO_FILE:文件不存在", /* (4) Could not find the file */"FR_NO_PATH:路径不存在", /* (5) Could not find the path */"FR_INVALID_NAME:无效文件名", /* (6) The path name format is invalid */"FR_DENIED:由于禁止访问或者目录已满访问被拒绝", /* (7) Access denied due to prohibited access or directory full */"FR_EXIST:由于访问被禁止访问被拒绝", /* (8) Access denied due to prohibited access */"FR_INVALID_OBJECT:文件或者目录对象无效", /* (9) The object is invalid */"FR_WRITE_PROTECTED:物理驱动被写保护", /* (10) The physical drive is write protected */"FR_INVALID_DRIVE:逻辑驱动号无效", /* (11) The logical drive number is invalid */"FR_NOT_ENABLED:卷中无工作区", /* (12) The volume has no work area */"FR_NO_:没有有效的FAT卷", /* (13) There is no valid FAT volume */"FR_MKFS_ABORTED:由于参数错误f_mkfs()被终止", /* (14) The f_mkfs() aborted due to any parameter error */"FR_TIMEOUT:在规定的时间内无法获得访问卷的许可", /* (15) Could not get a grant to access the volume within defined period */"FR_LOCKED:由于文件共享策略操作被拒绝", /* (16) The operation is rejected according to the policy */"FR_NOT_ENOUGH_CORE:无法分配长文件名工作区", /* (17) LFN working buffer could not be allocated */"FR_TOO_MANY_OPEN_FILES:当前打开的文件数大于_FS_SHARE", /* (18) Number of open files > _FS_SHARE */"FR_INVALID_PARAMETER:参数无效" /* (19) Given parameter is invalid */};int main(void){int i = 0;FATFS fs;//记录文件系统盘符信息的结构体LED_Init();USARTx_Init();/* 调用f_mount()创建一个工作区,另一个功能是调用了底层的disk_initialize()函数,进行SDIO借口的初始化*/res = f_mount(&fs, "0:", 1 );if (res != FR_OK){printf("挂载文件系统失败(%s)\r\n", FR_Table[res]);}else{printf("挂载文件系统成功(%s)\r\n", FR_Table[res]);}/* 调用f_open()函数在刚刚开辟的工作区的盘符0下打开一个名为Demo.TXT的文件,以创建新文件或写入的方式打开(参数"FA_CREATE_NEW | FA_WRITE"),如果不存在的话则创建这个文件。

STM32Cube学习之十四:SDIO FATFS

STM32Cube学习之十四:SDIO FATFS

STM32Cube学习之十四:SDIO+FATFS前提:默认已经装好MDK V5和STM32CubeMX。

硬件平台:STM32F4xx系列,并通过SDIO连接SD卡。

Step1.新建工程。

选择芯片型号。

Step2.配置时钟引脚。

Step3.配置SDIO为SD 4bit宽度总线。

Step4.使用FATFS中间件。

Step5.配置时钟树,SDIO模块输入要求为48MHz时钟Step6.配置SDIO时钟分频系数CLKDIV。

计算公式为SDIO_CK = 48MHz/(CLKDIV+2)。

如下图,CLKDIV=2,则SDIO时钟SDIO_CK=48MHz/(2+2)=12MHz。

Step7.使用DMA传输。

Step8.使能SDIO中断。

Step9.配置NVIC。

注意,此处要求SDIO中断优先级必须高于DMA2 stream3和DMA2 stream6的中断优先级。

因此,将DMA2 stream3和DMA2 stream6的中断优先级都将为2(或者更低)。

Step10.配置FATFS文件系统。

如果要支持中文文件名,则要配置PAGE_CODE项为中文。

如果要支持长文件名,要使能USE_LFN。

本程序全部使用默认值。

Step11. 生成MDK工程及代码。

特别注意,一定要加大堆栈大小,默认的堆栈大小不够用。

Step12.打开MDK工程。

Step13.选择芯片型号Step14.编译工程。

Step15.添加代码。

这时,就需要参考STM32CubeF4的例程了。

解压stm32cubef4.zip支持包,可以得到如STM32Cube_FW_F4_V1.9.0的文件夹。

其中就包含了STM32CubeF4的使用例程。

SD+FATFS的例程在STM32Cube_FW_F4_V1.9.0\Projects\STM324xG_EVAL\Applications\FatFs\FatFs_uSD目录下。

打开其中的MDK-ARM目录下的工程,参考其中main.c的代码。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

、概述1、目的在移植之前,先将源代码大概的阅读一遍,主要是了解文件系统的结构、各个函数的功能和接口、与移植相关的代码等等。

2、准备工作在官方网站下载了0.07c 版本的源代码,利用记事本进行阅读。

二、源代码的结构1、源代码组成源代码压缩包解压后,共两个文件夹,doc是说明,src里就是代码。

src文件夹里共五个文件和一个文件夹。

文件夹是option,还有OOreadme.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. You have to provide a low level disk I/O module that writtento control your storage device .主要是说不包含底层10代码,这是个通用文件系统可以在各种介质上使用。

我们移植时针对具体存储设备提供底层代码。

接下来做了版权声明-可以自由使用和传播。

然后对版本的变迁做了说明。

3、源代码阅读次序先读integer.h,了解所用的数据类型,然后是ff.h, 了解文件系统所用的数据结构和各种函数声明,然后是diskio.h,了解与介质相关的数据结构和操作函数。

再把ff.c和diskio.c两个文件所实现的函数大致扫描一遍。

最后根据用户应用层程序调用函数的次序仔细阅读相关代码。

三、源代码阅读1、integer.h 头文件这个文件主要是类型声明。

以下是部分代码。

typedef intINT;typedef unsigned int UINT;typedef signed charCHAR;/* These types must be 8-bit integer */都是用typedef 做类型定义。

移植时可以修改这部分代码,特别是某些定义与你所在工程的类型定义有冲突的时候。

2、ff.h 头文件以下是部分代码的分析#include “ intege使用i n teger.h 的类型定义#ifndef _FATFS#define _FATFS 0x007版本号007c, 0.07c#define _WORD_ACCESS 0如//果定义为1,则可以使用word 访问。

中间有一些看着说明很容易弄清楚意思。

这里就不例举了。

#define _CODE_PAGE 936/* The _CODE_PAGE specifies the OEM code page to be used on the target system./936 -Simplified Chinese GBK (DBCS, OEM, WindoW跟据这个中国应该是936.打开option文件夹看一下。

打开CC936.C文件,里面有一个很大的数组static const WCHAR uni2oem[。

]根据英文说明,这个数组用于uni code码和OEM码之间的相互转换。

接下来又有两个函数ff_convert()和ff_wtoupper()具体执行码型转换和将字符转换为大写。

百度一下:看OEM码什么意思。

unicode 是一种双字节字符编码,无论中文还是英文,或者其他语言统一到2 个字节。

与现有的任何编码(ASCII,GB等)都不兼容。

Win dowsNT(2000的内核即使用该编码,所有数据进入内核前转换成UNICODE退出内核后在转换成版本相关的编码(通常称为OEM,在简体中文版下即为GB).(百度所得)继续往下阅读。

#define _USE_LFN 1/这/ 个估计是长文件名支持了,以前的0.06 版本好像是不支持。

#define _MAX_LFN 255//最长支持255个双字节字符。

#define _FS_RPATH 0/是/ 否文件相对路径选项。

/* When _FS_RPATH is set to 1, relative path feature is enabled and f_chdir,/f_chdrive function are available.// 有些函数会受影响。

/Note that output of the f_readdir fnction is affected by this option. */#define _FS_REENTRANT 0如//果要支持文件系统可重入,必须加入几个函数。

#define _TIMEOUT1000/* Timeout period in unit of time ticks of the OS */#define _SYNC_tHANDLE/* Type of sync object used on the OS. e.g. HANDLE,OS_EVENT*, ID and etc.. */ /* To make the FatFs module re-entrant, set _FS_REENTRANT to 1 and add user /provided synchronization handlers, ff_req_grant, ff_rel_grant, ff_del_syncobj /and ff_cre_syncobj function to the project. */ #elif _CODE_PAGE == 936 /* Simplified Chinese GBK */ #define _DF1S 0 x 81 #define _DF1E 0xFE #define DS1S0 x 40 #define _DS1E 0x7E #define DS2S 0 x 80 #define _DS2E 0xFE接下来很大一部分都是与语言相关的因素,略过。

#if _MULTI_PARTITION/* Multiple partition configuration */ // 该变量定义为 1 时,支持一个磁盘的多个分区。

typedef struct _PARTITION {BYTE pd;/* Physical drive# */BYTE pt;/* Partition # (0-3) */ } PARTITION;Externc on st PARTITION Drives[];如果支持分区,则声明变量 Drivers #defi ne LD2 PD(drv) (Drives[drv]. pd)/*获得磁盘对应的物理磁盘 #defi ne LD2 PT(drv) (Drives[drv]. pt)/*获得磁盘对应的分区 #else/* Single partition configuration */ #define LD2PD(drv) (drv)/* Physicaldrive# is equal to the logical drive# */ #define LD2PT(drv) 0/* Always mounts the 1st partition */ #if _MAX_SS == 512/一/ 般扇区长度取 512字节。

#defineSS(fs)512U #if _LFN_UNICODE && _USE_LFN typ edef WCHAR XCHAR;/* Un icode */ XCHA 是文件名的码型所用。

#else typedef char XCHAR;/* SBCS, DBCS */ #endif typedef struct _FATFS_ {BYTEfs_type;/* FAT sub type */BYTEdrive;/*对应实际驱动号01 —*/ #define IsUpper(c) (((c)>= 'A')&&((c)<= ' Z'))#define IsLower(c) (((c)>=' a')&&((c)<= ' z')) #define IsDigit(c) (((c)>= '0,)&&((c)v 二 ' 9 , /* Character code support macros */ 三个宏判断是否大写、)) #if _DF1S/* DBCS configuration */双字节编码相关的设定,小写、数字。

暂时不理会它。

BYTEcsize;/*每个簇的扇区数目*/先查一下簇的含义:应该是文件数据分配的基本单位。

BYTEn_fats;/*文件分配表的数目*/FAT文件系统依次应该是:引导扇区、文件分配表两个、根目录区和数据区。

BYTEwflag;/* win[] dirty flag (1:must be written back) *///文件是否改动的标志,为1时要回写。

WORDid;/* File system mount ID文件系统加载ID*/WORDn_rootdir;/*根目录区目录项的数目*/#if _FS_REENTRANT_SYNC_tsobj;/*允许重入,则定义同步对象*/#endif#if _MAX_SS != 512WORDs_size;/* Sector size */#endif#if! FS READONLY文件为可写BY TEfsi_flag;/* fsinfo dirty flag (1:must be writte n back) */// 文件需要回写的标志DWORDlast_clust;/* Last allocated cluster */DWORDfree_clust;/* Number of free clusters */DWORDfsi_sector;/* fsinfo sector */#endif#if _FS_RPATHDWORDcdir;/*使用相对路径,则要存储文件系统当前目录#endifDWORDsects_fat;/*文件分配表占用的扇区DWORDmax_clust;/*最大簇数DWORDfatbase;/*文件分配表开始扇区DWORDdirbase;/*如果是FAT32根目录开始扇区需要首先得到。

相关文档
最新文档