[STM32]-stm32+sdio+fatfs文件系统-源码分析要点
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主要定义了文件的类型若是最新的可以不用修改。
stm32sdiofatfs文件系统源码分析

、概述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两个文件所实现的函数大致扫描一遍。
最后根据用户应用层程序调用函数的次序仔细阅读相关代码。
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 中文编码摘要: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文件系统因为要用,学习了一下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卡初始化函数。
STM32F429利用CUBEMX移植FATFS文件系统成功!!!

STM32F429利⽤CUBEMX移植FATFS⽂件系统成功⽂件系统对于⼀个专业的嵌⼊式系统⽽⾔必不可少,博主这两天利⽤STM32F429成功移植了FATFS,特来分享⼀下学习⼼得,避免新⼈采坑。
我是在SD卡上实现的,因此你需要利⽤SDIO接⼝扩展⼀个SD卡,具体实现如下:进⼊Configuration界⾯,基本参数的不⽤配置,但是需要开启中断和DMA,配置如下:点击OK,关闭Configuration窗⼝。
在MiddleWares下拉列表中打开FATFS,选中SD卡。
进⼊FATFS的Configuration界⾯,配置如下:解释⼀下改动的两个参数,⼀个选择读取中⽂类型的⽂件,另⼀个是使能长字节名称命名(如果不选择,只有8字节,超过8字节会出现Hardware Fault),⽂件系统的磁盘选择3个(⽅便挂载其他内存)最后,再设置选择中,把stack的空间⼤⼩设置为0X1000⼤⼩。
以上,便完成可在CUBEMX中配置FATFS⽂件系统,点击⽣成⼯程⽂件。
可以看到,在⼯程⽬录下,⽣成了这样⼀些⽂件:具体什么内容先不管,我们需要在main中添加⼀些代码测试我们的⽂件管理系统。
⾸先添加如下所⽰的全局变量:/* USER CODE BEGIN PV *//* Private variables ---------------------------------------------------------*/uint32_t byteswritten; /* File write counts */uint32_t bytesread; /* File read counts */uint8_t wtext[] = "This is STM32 working with FatFs"; /* File write buffer */uint8_t rtext[100]; /* File read buffers */char filename[] = "STM32cube.txt";/* USER CODE END PV */在初始化之后,while(1)之前添加如下代码int main(void){/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration----------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_DMA_Init();MX_TIM6_Init();MX_FMC_Init();MX_USART1_UART_Init();MX_TIM7_Init();MX_USART3_UART_Init();MX_DMA2D_Init();MX_LTDC_Init();MX_SPI5_Init();MX_SDIO_SD_Init();MX_FATFS_Init();/* Initialize interrupts */MX_NVIC_Init();/* USER CODE BEGIN 2 */delay_init(180);LED_Init();KEY_Init();SDRAM_Init();LCD_Init();ESP8266_Init(); //WIFI ͨѶģ¿éW25QXX_Init(); //Íⲿ SPI FLASH --- 32MBFTL_Init(); //Íⲿ NAND FLASH --- 512MBmy_mem_init(SRAMIN); //½«SRAMÖÐ60KBÄÚ´æÓÃÓÚÄÚ´æ¹ÜÀíϵͳ my_mem_init(SRAMEX); //½«SDRAMÖÐ15MBÄÚ´æÓÃÓÚÄÚ´æ¹ÜÀíϵͳ ITEnable();PeriphInit();GUI_Init();Show_SDcard_Info();LCD_ShowString(400,400,400,24,24,"****** FatFs Example ******");retSD = f_mount(&SDFatFS, "0:", 0);if(retSD){LCD_ShowString(400,440,400,24,24,"****** mount error ******");LCD_ShowNum(800,440,retSD,2,24);Error_Handler();}elseLCD_ShowString(400,440,400,24,24,"****** mount success ******");retSD = f_open(&SDFile, filename, FA_CREATE_ALWAYS | FA_WRITE);if(retSD){LCD_ShowString(400,480,400,24,24,"****** open file error ******");LCD_ShowNum(800,480,retSD,2,24);Error_Handler();}elseLCD_ShowString(400,480,400,24,24,"****** open file success ******");retSD = f_write(&SDFile, wtext, sizeof(wtext), (void *)&byteswritten);if(retSD){LCD_ShowString(400,520,400,24,24,"****** write file error ******");LCD_ShowNum(800,520,retSD,2,24);Error_Handler();}elseLCD_ShowString(400,520,400,24,24,"****** write file success ******");retSD = f_close(&SDFile);if(retSD){LCD_ShowString(400,560,400,24,24,"****** close file error ******");LCD_ShowNum(800,560,retSD,2,24);Error_Handler();}elseLCD_ShowString(400,560,400,24,24,"****** close file success ******");/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */}OK,编译通过,下载程序,运⾏结果如下所⽰:之后你便可以在SD卡中找到你创建的⽂件STM32cube.txt。
基于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中文编码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 等,来简化中文编码的处理。
这样能够节省开发时间,但可能会引入一些额外的依赖问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
[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 FatFs module is only a generic file system layer and not depend on any specific storage device. You have to provide a low level disk I/O module that written to control your storage device.主要是说不包含底层IO代码,这是个通用文件系统可以在各种介质上使用。
我们移植时针对具体存储设备提供底层代码。
接下来做了版权声明-可以自由使用和传播。
然后对版本的变迁做了说明。
3、源代码阅读次序先读integer.h,了解所用的数据类型,然后是ff.h,了解文件系统所用的数据结构和各种函数声明,然后是diskio.h,了解与介质相关的数据结构和操作函数。
再把ff.c和diskio.c两个文件所实现的函数大致扫描一遍。
最后根据用户应用层程序调用函数的次序仔细阅读相关代码。
三、源代码阅读1、integer.h头文件这个文件主要是类型声明。
以下是部分代码。
typedef int INT;typedef unsigned int UINT;typedef signed char CHAR;/* These types must be 8-bit integer */都是用typedef做类型定义。
移植时可以修改这部分代码,特别是某些定义与你所在工程的类型定义有冲突的时候。
2、ff.h头文件以下是部分代码的分析#include "integer.h" 使用integer.h的类型定义#ifndef _FATFS#define _FATFS 0x007C 版本号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.OEM code page什么意思不大明白。
/ 936 - Simplified Chinese GBK (DBCS, OEM, Windows)跟据这个中国应该是936.打开option文件夹看一下。
打开cc936.c文件,里面有一个很大的数组static const WCHARuni2oem[] 。
根据英文说明,这个数组用于unicode码和OEM码之间的相互转换。
接下来又有两个函数ff_convert()和ff_wtoupper()具体执行码型转换和将字符转换为大写。
百度一下:看OEM码什么意思。
unicode是一种双字节字符编码,无论中文还是英文,或者其他语言统一到2个字节。
与现有的任何编码(ASCII,GB等)都不兼容。
WindowsNT(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 _TIMEOUT 1000 /* Timeout period in unit of time ticks of the OS */#define _SYNC_t HANDLE /* 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 0x81#define _DF1E 0xFE#define _DS1S 0x40#define _DS1E 0x7E#define _DS2S 0x80#define _DS2E 0xFE接下来很大一部分都是与语言相关的因素,略过。
/* Character code support macros */ 三个宏判断是否大写、小写、数字。
#define IsUpper(c) (((c)>='A')&&((c)<='Z'))#define IsLower(c) (((c)>='a')&&((c)<='z'))#define IsDigit(c) (((c)>='0')&&((c)<='9'))#if _DF1S /* DBCS configuration */双字节编码相关的设定,暂时不理会它。
#if _MULTI_PARTITION /* Multiple partition configuration */ //该变量定义为1时,支持一个磁盘的多个分区。
typedef struct _PARTITION {BYTE pd; /* Physical drive# */BYTE pt; /* Partition # (0-3) */} PARTITION;Extern const PARTITION Drives[];//如果支持分区,则声明变量Drivers#define LD2PD(drv) (Drives[drv].pd) /* 获得磁盘对应的物理磁盘#define LD2PT(drv) (Drives[drv].pt) /*获得磁盘对应的分区#else/* Single partition configuration */#define LD2PD(drv) (drv) /* Physical drive# is equal to the logical drive# */#define LD2PT(drv) 0 /* Always mounts the 1st partition */#if _MAX_SS == 512 //一般扇区长度取512字节。
#define SS(fs) 512U#if _LFN_UNICODE && _USE_LFNtypedef WCHAR XCHAR; /* Unicode */ XCHAR是文件名的码型所用。
#elsetypedef char XCHAR; /* SBCS, DBCS */#endiftypedef struct _FATFS_ {BYTE fs_type; /* FAT sub type */BYTE drive; /*对应实际驱动号01--- */BYTE csize; /* 每个簇的扇区数目 */先查一下簇的含义:应该是文件数据分配的基本单位。
BYTE n_fats; /* 文件分配表的数目 */FAT文件系统依次应该是:引导扇区、文件分配表两个、根目录区和数据区。
BYTE wflag; /* win[] dirty flag (1:must be written back) *///文件是否改动的标志,为1时要回写。
WORD id; /* File system mount ID 文件系统加载ID*/WORD n_rootdir; /* 根目录区目录项的数目 */#if _FS_REENTRANT_SYNC_t sobj; /* 允许重入,则定义同步对象 */#endif#if _MAX_SS != 512WORD s_size; /* Sector size */#endif#if !_FS_READONLY //文件为可写BYTE fsi_flag; /* fsinfo dirty flag (1:must be written back) *///文件需要回写的标志DWORD last_clust; /* Last allocated cluster */DWORD free_clust; /* Number of free clusters */DWORD fsi_sector; /* fsinfo sector */#endif#if _FS_RPATHDWORD cdir; /* 使用相对路径,则要存储文件系统当前目录#endifDWORD sects_fat; /*文件分配表占用的扇区DWORD max_clust; /* 最大簇数DWORD fatbase; /*文件分配表开始扇区DWORD dirbase; /* 如果是FAT32,根目录开始扇区需要首先得到。