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的代码。

【STM32】使用SDIO进行SD卡读写,包含文件管理FatFs(六)-FatFs使用的思路介绍

【STM32】使用SDIO进行SD卡读写,包含文件管理FatFs(六)-FatFs使用的思路介绍

f_open打开/创建⽂件f_close关闭⽂件f_read读取⽂件f_write写⼊⽂件f_lseek移动读/写指针,扩展⼤⼩f_truncate 截断⽂件f_sync 刷新缓存数据f_forward 转移⽂件数据到⼀个数据流f_expand 为⽂件分配⼀个连续的块f_gets 读取⼀个字符串(string )f_putc写⼊⼀个字符(character )f_puts写⼊⼀个字符串(string )f_printf写⼊⼀个格式化字符串f_tell获取当前读/写指针f_eof⽂件结束测试f_size获取长度f_error测试错误f_opendir 打开⼀个⽬录f_closedir 关闭⼀个已打开的⽬录f_readdir 读取⽬录f_findfirst 打开⼀个⽬录并读取匹配的第⼀个项⽬f_findnext 查找下⼀个匹配的项⽬【STM32】使⽤SDIO 进⾏SD 卡读写,包含⽂件管理FatFs (六)-FatFs 使⽤的思路介绍本篇要来介绍⽂件管理FatFs官⽅的⽹站是:这是⼀个⽇本⼈写的,除了⽂件管理以外,还有其他的,例如解码JPEG 、红外遥控等在官⽹链接内,最下⽅有个Return ,点击后就可以看到相关的开源库以下开始正题(本⽂⾥提到的媒介,其实就是设备了,我不想改图了...)打开官⽅⽹站,页⾯简单明了,就分为4个区块(以下图⽚为FatFs 官⽹上截取的图⽚)第⼀区块、介绍及特性(Features ):FatFs 是⽂件管理系统,可⽤于SD 卡、硬盘(ATA )、RTC 时钟,FTL 和etc 不清楚是什么,另外,也可以⽤于Flash 或是EEPROM第⼆区块、应⽤接⼝(Application Interface ):FatFs 提供了接⼝,使得我们的应⽤可以和它交互。

官⽹左侧为⼀些接⼝的介绍,分四个部分第⼀部分:File Access (⽂件存取)第⼆部分:Directory Access (⽬录访问)f_stat 检查⽂件或⼦⽬录是否存在f_unlink 删除⽂件或⼦⽬录f_rename 重命名/移动⽂件或⼦⽬录f_chmod 更改⽂件或⼦⽬录的属性f_utime更改⽂件或⼦⽬录的时间戳f_mkdir创建⼦⽬录f_chdir 更改当前⽬录f_chdive 更改当前驱动f_getcwd 检索当前⽬录和驱动f_mount注册/注销⼀个⼯作区(挂起与否)f_mkfs在逻辑驱动上创建⼀个FAT 卷f_fdisk 在物理驱动上创建分区f_getfree 获取卷上的可⽤空间f_getlabel 获取卷标f_setlabel 设置卷标f_setcp设置活动代码页disk_status获取设备状态disk_initialize 初始化设备disk_read读取数据disk_write写⼊数据disk_ioctl控制设备相关功能get_fattime 获取当前时间第三部分:File and Dirextor Management (⽂件和⽬录管理)第四部分:Volume Management and System Configuration (卷管理和系统配置)第三区块、媒介访问接⼝(Media Access Interface ):你想管理的存储设备,必须要和FatFs 链接。

stm32 fatfs 中文编码

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编码,以确保文件系统能够正确识别。

调试STM32+FATFS+SDIO的总结

调试STM32+FATFS+SDIO的总结

这两天调试stm32单片机的sdio接口读写sd卡,把调试经验总结一下。

我首先采用的是官方例程里面得dma方式,直接使用官方提供的sdcard.c文件。

首先声明一个uint32类型的数据缓冲区,读写sd卡的每个扇区完全正常,随后添加fatfs的文件,然后改好接口函数,其中有一处做了强制转换,就是fatfs声明的缓冲区都是uint8*类型的,而sdcard.c文件要求为uint32*类型,所以我把uint8*强制转换为uint32*类型。

编译成功后执行,结果fatfs的初始化函数返回“没有文件系统”,经过多次小改动后重试,问题依然如此,后来我怀疑是我强制转换出的问题,为了验证我的想法,我做了如下程序:#include <stdio.h>#include <string.h>void main(void){unsigned char i;//AA[] = {0,1,2,3,4,5,6,7,8,9,0,4};unsigned char * aa;unsigned int * bb;for(i=0;i<10;i++){*(aa+i) = i;}bb = (unsigned int *)aa;printf("bb is: 0X%04x \n",*bb);bb = (unsigned int *)(aa+1);printf("bb is: 0X%04x \n",*bb);while(1);}以上程序验证结果为:在IAR EWARM 5.40中,强制转换不会对数据存取产生影响。

既然不是这个问题,那会是什么呢?!我只好单步执行程序,一步步追踪下去,看看到底问题出在哪里。

功夫不负有心人,最后终于发现出问题的地方,如下图:原来是DMA传输出了错误,fatfs声明的uint8*的缓冲区不是从整4倍字节地址开始的,而DMA控制器在操作uint32*类型地址的时候必须从整4倍字节地址开始,由于强制转换,产生了2个字节的偏移,从而导致最终的数据错误。

STM32下FatFs的移植,实现了坏块管理,硬件ECC,ECC纠错,并进行擦写均衡分析

STM32下FatFs的移植,实现了坏块管理,硬件ECC,ECC纠错,并进行擦写均衡分析

STM32 下FatFs的移植,实现了坏块管理,硬件ECC,ECC纠错,探写均衡分析作者:观海QQ:5316221、摘要在STM32 单片机上,成功移植 FatFs 0.12b,使用的 Nand Flash 芯片为K9F2G08 。

特点:系统配合 FatFs 实现了坏块管理,硬件ECC,软件 ECC 纠错2、代码分析2.1、擦写均衡分析在create_chain 函数中实现,每次分配都由当前scl 指向的free cluster 开始,逐块检查,是否有可用cluster 存在。

如果没有则取下一块,直到回到起始点,说明已经没有free cluster 了。

因为每次都紧邻scl 取free cluster, 那么每次的起始scl 值在哪里,就决定了擦写位置。

通过查看代码,很可惜,发现scl 每次都重新从1 开始查找free cluster。

所以,默认条件下,FatFs 不支持擦写均衡。

如果能把每次分配的cluster号记录下来,下次接着向后分配,则可实现擦写均衡。

未来有时间再来实现吧。

也许你现在就能实现哦,另忘了实现了分享一份给我。

2.2、坏块管理分析通过2.1对create_chain 函数的分析,我们知道get_fat是完成真实的free cluster的分配。

而每次get_fat 函数都会调用move_window 函数实际的读入一次该sector。

所以,我们只需要在读取函数中,对坏块进行检查,返回出错,则分配的cluster 自动移到下一个。

从而完成跳过坏块存储数据。

具体实现如下:如果FSMC_NAND_ReadSmallPage 检测到坏块,则NAND_disk_read 返回RES_ERROR。

2.3、STM32的硬件ECC在FSMC_NAND_Init 函数中打开STM32的硬件ECC配置。

如下红色字。

FSMC_NANDInitStructure.FSMC_Bank = FSMC_Bank2_NAND;FSMC_NANDInitStructure.FSMC_Waitfeature = FSMC_Waitfeature_Enable;FSMC_NANDInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;FSMC_NANDInitStructure.FSMC_ECC = FSMC_ECC_Enable;FSMC_NANDInitStructure.FSMC_ECCPageSize = FSMC_ECCPageSize_256Bytes;FSMC_NANDInitStructure.FSMC_TCLRSetupTime = 0x00;FSMC_NANDInitStructure.FSMC_TARSetupTime = 0x00;FSMC_NANDInitStructure.FSMC_CommonSpaceTimingStruct = &p;FSMC_NANDInitStructure.FSMC_AttributeSpaceTimingStruct = &p;这里使用的是FSMC_ECCPageSize_256Bytes,而K9F2G08 的最小page 为2048, 所以,我们在驱动中,会再把2048 的page 页再分为8个256的小页面分别进行ECC 运算。

stm32fatfs文件系统分析和代码解析

stm32fatfs文件系统分析和代码解析

stm32fatfs⽂件系统分析和代码解析⼀⽂件系统:⽂件系统是操作系统⽤于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的⽂件的⽅法和数据结构;即在存储设备上组织⽂件的⽅法。

操作系统中负责管理和存储⽂件信息的软件机构称为⽂件管理系统,简称⽂件系统。

⽂件系统由三部分组成:⽂件系统的接⼝,对对象操纵和管理的软件集合,对象及属性。

从系统⾓度来看,⽂件系统是对⽂件存储设备的空间进⾏组织和分配,负责⽂件存储并对存⼊的⽂件进⾏保护和检索的系统。

具体地说,它负责为⽤户建⽴⽂件,存⼊、读出、修改、转储⽂件,控制⽂件的存取,当⽤户不再使⽤时撤销⽂件等。

⼆ fatfs逻辑FatFs是⽤于⼩型嵌⼊式系统的通⽤FAT / exFAT⽂件系统模块。

FatFs模块是依据ANSI C(C89)标准编写的,并且与磁盘I / O层完全分开。

因此,它的运⾏独⽴于平台。

可以将其合并到资源有限的⼩型微控制器中,例如8051,PIC,AVR,ARM,Z80,RX等。

fatfs写的特别简洁,⾮常适合⼊门者学习和熟悉⽂件系统。

借着stm32的开发机会,笔者对fatfs做了⼀个⼤致的梳理。

stm32中的fatfs⽂件系统分层⼀般分成两层,⼀层是底层的逻辑,这部分主要是通过配置内存卡的寄存器来实现数据的读写。

另外⼀层是应⽤逻辑,这部分负责把函数封装成可以调⽤的⽂件。

让⽤户能清晰的操作⽂件。

三⽂件系统的底层逻辑DSTATUS SD_disk_initialize(BYTE drv)这个主要是初始化的内存设备,很多存储卡的设备都是标准的,不过,也不排除有些设备的兼容性问题是否可以。

这个初始化的时候,⼀定要对准⼿册,看⼀下内存卡命令接⼝信息。

从sd卡中读取信息:DRESULT SD_disk_read(BYTE pdrv, BYTE* buff, DWORD sector, UINT count)往sd卡中写信息,DRESULT SD_disk_write(BYTE pdrv, const BYTE* buff, DWORD sector, UINT count)对齐和复位存储设备DRESULT SD_disk_ioctl(BYTE drv, BYTE ctrl, void *buff)四⽂件系统的应⽤逻辑⽂件系统的应⽤逻辑⾮常简单,就是让⽤户可以⾃由简单的操作⽂件。

stm32sdiofatfs文件系统源码分析

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的fat32文件系统

(参考)基于stm32的fat32文件系统

(参考)基于stm32的fat32文件系统Main.c/******************************************************************* ** * * * STM32- 3.2寸TFT液晶屏字符和汉字显示程序 ** ********************************************************************* ***/#include "stm32f10x_lib.h"#include "LCD_driver.h"#include "fat.h"#include "MMC.h"struct FAT32_Init_Arg Init_Arg_SD; //初始化参数结构体实体struct FAT32_Init_Arg *pArg;struct FileInfoStruct FileInfo; //文件信息结构体实体uchar file_buf[150]; //文件数据缓冲区,读取到的文件数据放在其中uchar Dev_No=0; //设备号,SDCARD的SD卡设备号的宏定义,根据设备号,znFAT会将底层存储设备驱动连接到相应的存储设备驱动//动态的切换设备号,就可以实现在各种存储设备之间进行切换,这也是znFAT实现多设备的重要手段。

比如,我//可以将SD卡上的文件拷贝到CF卡或U盘上,这就是多设备的最典型应用#define COLOR(r,g,b)(((((((uint)r)>>3)<<6)|(((uint)g)>>2))<<5)|(((uint)b)>>3)) //r红色分量0~31 g绿色分量 0~63 b蓝色分量 0~31#include "LCD.c"/******************************** 变量定义---------------------------------------------------------*/GPIO_InitTypeDef GPIO_InitStructure;ErrorStatus HSEStartUpStatus;unsigned char csd_data[16];unsigned char cid_data[16];unsigned char by;unsigned int c_size, c_size_mult, read_bl_len; unsigned longdrive_size;unsigned long size_mb;/*********************************声明函数 -----------------------------------------------*/void RCC_Configuration(void);void NVIC_Configuration(void);void Delay(vu32 nCount);/******************************************************************* ************主函数******************************************************************** ***********/int main(void){uchar item;RCC_Configuration(); //系统时钟配置函数NVIC_Configuration(); //NVIC配置函数//启动GPIO模块时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);//把调试设置普通IO口GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //所有GPIO为同一类型端口GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出的最大频率为50HZGPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA端口GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOB端口GPIO_Write(GPIOA,0xffff); //将GPIOA 16个端口全部置为高电平GPIO_Write(GPIOB,0xffff); //将GPIOB 16个端口全部置为高电平GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //所有GPIO为同一类型端口GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出的最大频率为50HZGPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA端口LCD_Init();LCD_clear(2); // 这句是显示背景颜色。

stm32 fatfs 中文编码

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页。

[STM32]-stm32+sdio+fatfs文件系统-源码分析

[STM32]-stm32+sdio+fatfs文件系统-源码分析

[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. 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根目录开始扇区需要首先得到。

相关文档
最新文档