FATFS文件系统移植和应用

合集下载

FATFS文件系统的移植

FATFS文件系统的移植

FatFs文件系统的移植因为需要,又不想自己写,所以就移植了一个文件系统。

说下我的硬件和开发工具:接成 TRUE IDE 模式下的CF卡(也就是相当于一块硬盘了),三星S3C2440的ARM9,开发工具是很老很老的D版的ADS1.2。

我在网上看到的嵌入式系统上面常用的文件系统有UCOSII公司的UC/FS,支持CF卡,硬盘,SD/MMC卡,还有NAND FLASH等等,比较多,不过是商用的,需要银子的,有周立功的用于教学用(为什么说是用于教学用的,呵呵,等下就说)的ZLG/FS,还找到了开源、免费的两个,其中一个叫做 efsl ,另一个叫做 FatFs 。

现在先不考虑版权的问题,选择一个比较合适的文件系统。

第一个UC/FS 文件系统没得什么说的,UCOSII那个公司开发的,稳定性,兼容性应该都不会差。

第二个是ZLG/FS。

周立功的很多的开发板上面都送了这个文件系统的源代码的,在网上找到一个现成的读写硬盘的,只是是基于LPC2200系列的处理器的。

第三个是efsl,是一个开源的项目,免费,只需要提供读扇区和写扇区2个函数。

第四个是FatFs,跟efsl一样,也是一个开源的项目,移植的时候比efsl 多几个简单的函数。

这里补充一下CF卡和硬盘的简单的资料,CF卡有三种模式,其中有一个叫TRUE IDE,接成这个模式以后,就跟他的模式名字一样,他就是一个硬盘,对他进行读写,也就相当于对一个硬盘进行读写。

当引脚OE(好像是叫OE,具体参考 CF卡文档)在上电的时候检测到拉低,那么CF卡就进入TRUE IDE模式。

读写硬盘的时候,在只写一次LBA,只发送一个命令(读或者写)的情况下,最多可以读或者写256个扇区(当然也可以读一个扇区,读或者写多少个扇区在扇区计数器count里面),其中,发一个读或者写命令,读或者写256个扇区所需要的时间,比分256次去读写这些扇区所需要的时间要短得多,效率要高得多,我现在需要的是一个读写的速度比较快,效率比较高的文件系统,因此,底层的读写扇区必须要每写一个命令就可以读写多个扇区,读写扇区的函数必须要有扇区计数器(前面的count)这个参数,才可能满足要求。

STM32F407移植FATFS文件系统(版本R0.09b)到SD卡(硬件SPI总线)

STM32F407移植FATFS文件系统(版本R0.09b)到SD卡(硬件SPI总线)

STM32F407移植FATFS⽂件系统(版本R0.09b)到SD卡(硬件SPI总线)⼀、序⾔经常在⽹上、群⾥看到很多⼈问关于STM32的FATFS⽂件系统移植的问题,刚好⾃⼰最近的⼯程项⽬需要使⽤SD卡,为了让⼤家少⾛弯路,我把我的学习过程和⽅法贡献给⼤家。

⼆、SD卡简介安全数字卡(简称SD卡),最初引进应⽤于⼿持式可携带电⼦产品,在⼀个⼩尺⼨产品上可靠的存储数据,如移动电话,数码相机等。

1、SD卡简介请参考如下博⽂2、SD卡种类请参考如下博⽂3、SD卡简介和种类请参考如下博⽂4、MMC、SD、TF、SDIO、SDMMC简介三、SD卡总线协议简介SD卡⽀持2种总线协议,即SDIO总线协议和SPI总线协议。

SDIO总线协议速度快,SPI总线相对SDIO总线速度要慢很多,但是⽬前市⾯上很多单⽚机不⽀持SDIO总线协议,只有中⾼端单⽚机(例如:STM32F407)才⽀持SDIO总线协议。

1、SDIO总线协议利⽤该总线协议,可以使⽤最多四条数据线实现主机与SD卡之间的数据传输,所以速度相对⽽⾔可以达到最⾼,但是需要主机具有SDIO控制器,才可以使⽤该协议。

2、SPI总线协议如果主机不⽀持SDIO协议,那么可以使⽤SPI协议对SD卡进⾏操作。

虽然速度⽐SDIO慢,但是硬件上更加简单,只需要四根线便可以实现与SD卡进⾏通讯。

3、SDIO协议与SPI协议的⽐较SDIO协议与SPI协议相较⽽⾔,SDIO协议读写SD卡的速度更快,再加上其⽀持4线模式,即利⽤4条数据线,同时发送4Bits数据,数据的传输效率就更⾼了,但是由于使⽤的引脚较多,所以也导致了控制相对⽐较困难。

⽽SPI外设只具有两条数据线MISO和MOSI,分别⽤作数据的输⼊和输出,由于引脚较少,所以控制相对较容易。

但是,数据的传输效率相对⽽⾔就⽐较低了。

但是,两中协议的共同之处在于:均是通过命令实现对SD卡的控制,仍然是结合状态机实现编程。

4、SD卡如何⼯作在SPI模式下当SD卡上电之后,只有第⼀次发送的CMD0命令才可以选择SD卡⼯作在SPI模式下。

petit_fatfs文件系统移植

petit_fatfs文件系统移植

FatFS文件系统的优点我就不赘述了,我需要的功能不多,所以我移植是FatFS的精简版petit fatfs,现将我的一直步骤写下来供大家参考。

工程暂不能分享,见谅。

1、移植的文件系统为petit fatfs R0.02。

下载地址:/fsw/ff/pff2.zip2、本人选用的单片机是STC12C5A56S2(容量够大)。

3、选用的SD卡为macro SD,容量512M,格式化为fat32文件系统,分配大小为512字节。

Petit fatfs文件系统的修改步骤及说明如下:一、integer.h,pff.c,diskio.h这三个文件不需要修改。

二、pff.h的修改:1、使能FAT32文件系统的支持#define_FS_FAT3212、选择简体中文编码格式#define_CODE_PAGE936三、diskio.c的修改:1、添加必要头文件:reg51.h,sd.h,spi.h。

2、填写设备初始化函数DSTATUS disk_initialize(void)这个函数我是参考别人写的:DSTATUS disk_initialize(void){DSTATUS stat;//Put your code herestat=STA_NOINIT;if(!SD_Init()){stat&=~STA_NOINIT;}return stat;}3、填写读函数:DRESULT disk_readp(BYTE*dest,DWORD sector,WORD sofs,WORD count)这个函数写法各异,就不具体说了,BYTE*dest这个就是指你要讲读出来的数据存在哪里的指针变量。

DWORD sector是要读扇区的地址,看一下SD卡的读写命令你就知道了。

WORD sofs是偏移量,简单就是说,要读的数据相对于扇区开始的字节数,这个读出来,直接忽略掉。

WORD count是要读的字节个数,读完偏移量的字节数,就是要读这个,将读出来的数据存在干才说的那个BYTE*dest。

STM32F429利用CUBEMX移植FATFS文件系统成功!!!

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。

在pc机上移植fatfs文件系统(windowslinux)(一)

在pc机上移植fatfs文件系统(windowslinux)(一)

在pc机上移植fatfs⽂件系统(windowslinux)(⼀)开始我的技术⽣涯~哈哈,⽼⼤给我分配了⼀个以前都没接触到的任务。

在PC机上移植fatfs⽂件系统。

以前我认为的移植是调⽤底层提供的API接⼝,在PC机上模拟,测试通过后再移植到⽬标板上。

这次的移植竟然是移植到PC机上。

我的开始考虑到的硬件基础:⽂件系统要在硬件存储介质上运⾏,例如u盘啊、SD卡啊。

那这次没有硬件设备,怎么模拟呢。

diskio.c是和底层硬件相关的⽂件。

解决⽅案是⽤创建⼀个具有⼀定⼤⼩的⽂件来作为存储载体。

开始有了⼀点思路。

我就开始了⼈⽣的第⼀次移植。

我⽤的是fatfs 0.08b 最新版。

0.08b版本多了⼏个API接⼝。

并且前辈们反映移植遇到的问题解决了。

下到了源代码有2个⽂件夹。

doc ⾥⾯我没仔细看。

src⾥⾯就是源代码了。

diskio.c是⾃⼰写的。

是⼀些贴近底层硬件的函数。

我看了CSDN⾥⾯⼀些前辈关于移植fatfs的资料。

⾸先第⼀步就是配置ffconf.hfatfs有2个版本。

⼀个是tiny版本。

这个版本适合⽐较⼩的RAM,eg:单⽚机。

我⽤的是正常版。

#define_FS_TINY0/* 0:Normal or 1:Tiny */因为移植后要测试读与写是否匹配,所以设置为读写功能。

#define _FS_READONLY 0/* 0:Read/Write or 1:Read only */#define _FS_MINIMIZE3/* 0 to 3 */ 我⽤了全部功能,因为没要求要裁剪。

这个具体实现以后再慢慢琢磨。

#define_USE_MKFS1/* 0:Disable or 1:Enable */ 如果是在PC机上模拟,这个必须设置成1.因为这个参数,我搞了1天。

下⾯再详述。

#define _CODE_PAGE936 简体中⽂#define_MAX_SS512/* 512, 1024, 2048 or 4096 */ ⼀个扇区512字节#define_USE_ERASE1/* 0:Disable or 1:Enable */ 具备擦除功能,这个功能我⽬前还没测试过。

基于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中设置响应格式相对应的响应内容(短响应与长响应),两者的细节在下面讲到。

FATFS移植、调试过程(在STM32上使用W25Q64)

FATFS移植、调试过程(在STM32上使用W25Q64)

FATFS移植、调试过程(在STM32上使用W25Q64)花了几天的时间好不容易自己移植好了FATFS,以前一般都是用别个现成的东西,真的自己移植还是有一点点的操蛋。

移植FATFS其实不难,当然这是对于一个成功移植好的人来说。

FATFS移植资料网上有一大堆,但是在移植成功之前还是搞得我一头雾水.1、准备工作硬件:STM32F4+W25Q64软件:FATFS 0.1版本,好像现在最高的就是0.1版的吧,没去细查。

FATFS官方源码下载好之后只有几个文件。

添加两个C文件进去就好了,添加文件这种事比较基础,没什么好说的。

只要我这截图上有的文件都加上去了,基本上就可以了。

这里面需要我们修改的是diskio.c,其它文件不用动,当然有时候动动也没事,我用别人的东西总喜欢看看里面是什么。

在diskio.c里面,一共有6个接口函数,我按照重要性从最不重要的开始讲参考正点原子的代码,我在开头宏定义了扇区大小等内容。

[cpp] view plain copyprint?1.#define FLASH_SECTOR_SIZE 5122.#define FLASH_BLOCK_SIZE 83.uint32_t FLASH_SECTOR_COUNT = 2048*6;这三个内容在diskio.c都会用到。

这里解释一下这三个东西,我之前查这个搞了半天没理解[cpp] view plain copyprint?1.FLASH_SECTOR_SIZE 是指一个扇区块的大小 512个字节[cpp] view plain copyprint?1.<pre name="code" class="cpp">FLASH_BLOCK_SIZE 一个扇区分成了8块,也就是4K的大小,为什么是八块,百度后发现是因为与FAT类型有关,具体解释在正点原子<h1 class="ph" style="word-wrap: break-word; margin: 0px; padding: 15px 0px 10px; font-size: 20px; font-family: 'Microsoft YaHei', 'Hiragino Sans GB', STHeiti, Tahoma, Si mHei, sans-serif; font-weight: 100; color: rgb(68, 68, 68);">-第四十五章 FATFS实验里面有说明</h1></pre><p></p>2.<pre></pre>3.<pre name="code" class="cpp">FLASH_SECTOR_COUNT 这一段的内容是指有多少个扇区块,有什么用呢,在格式化W25Q64的时候,这个就可以认为是我的W25Q64的容量</pre>因为在W25Q64里面是没有MBR/DBR这些大小的,所以需要使用FATFS格式化成一个存储设备4.<p></p>5.<p>要使用格式化就需要使用diskio.c里面的disk_ioctl函数</p>6.<p>这是第一个函数。

移植和使用的文件系统FatFs

移植和使用的文件系统FatFs

一种易于移植和使用地文件系统引言随着信息技术地发展,当今社会地信息量越来越大,以往由单片机构成地系统简单地对存储媒介按地址、按字节地读/写已经不满足人们实际应用地需要,于是利用文件系统对存储媒介进行管理成了今后单片机系统地一个发展方向.目前常用地文件系统主要有微软地、、、,以及系统下地、等.由于微软地广泛应用,在当前地消费类电子产品中,用得最多地还是文件系统,如盘、、、数码相机等,所以找到一款容易移植和使用、占用硬件资源相对较小而功能又强大地开源文件系统,对于单片机系统设计者来说是很重要地.是一种完全免费开源地文件系统模块,专门为小型地嵌入式系统而设计.它完全用标准语言编写,所以具有良好地硬件平台独立性,可以移植到、、、、、、等系列单片机上而只需做简单地修改.它支持、和,支持多个存储媒介;有独立地缓冲区,可以对多个文件进行读/写,并特别对位单片机和位单片机做了优化. 有个简化版本—,它跟完全版地不同之处主要有两点:①占用内存更少,只要;②次仅支持个存储介.和—地用法一样,仅仅是包含不同地头文件即可,非常方便,本文主要介绍.移植前地准备一开始就是为了能在不同地单片机上使用而设计地,所以具有良好地层次结构,如图所示.最顶层是应用层,使用者无需理会地内部结构和复杂地协议,只需要调用提供给用户地一系列应用接口函数,如、等,就可以像在上读/写文件那样简单.中间层实现了文件读/写协议. 地完全版提供地是.、.,简化版—提供地是.、..除非有必要,使用者一般不用修改,使用时将需要版本地头文件直接包含进去即可.需要使用者编写移植代码地是提供地底层接口,它包括存储媒介读/写接口和供给文件创建修改时间地实时时钟.本移植硬件平台使用型号为地单片机和卡.是一种位单片机,具有多达地、地内部和丰富地外设.软件平台是,具有代码优化能力强和完全免费地优点..移植步骤..编写和卡接口代码本文使用卡地通信模式.卡地接,接,接.这就需要提供读/写接口代码,主要包括初始化、读和写.初始化包括相关寄存器地初始化和相关/口地初始化.将地配置成主机模式、数据高位先传、时钟速率为二分之一系统时钟等.代码如下:(<<)(<<)(<<)(<<)(<<)(<<)(<<);(<<);接着配置/口地输入/输出.脚和脚配置成输出,脚配置成输入.然后,就可以进行读/写了.读个字节地接口代码:(){;(,);;}写个字节地接口代码:( ){;(,)}在具备读/写接口地基础上编写卡接口代码,需要编写个基本接口函数:①向卡发送条命令:( ,);②向卡发送个数据包:—( *,);③从卡接收个数据包:] (*,);..编写编写好存储媒介地接口代码后,就可以编写了,结构如图所示.—地移植实际上需要编写个接口函数,分别是:① ( );存储媒介初始化函数.由于存储媒介是卡,所以实际上是对卡地初始化.是存储媒介号码,由于—只支持一个存储媒介,所以应恒为.执行无误返回,错误返回非.② ( );状态检测函数.检测是否支持当前地存储媒介,对—来说,只要为,就认为支持,然后③ ( ,*,,.);读扇区函数.在卡读接口函数地基础上编写,*存储已经读取地数据,是开始读地起始扇区,是需要读地扇区数.个扇区个字节.执行无误返回,错误返回非.④ ( ,*,,);写扇区函数.在卡写接口函数地基础上编写,*存储要写入地数据,是开始写地起始扇区是需要写地扇区数.个扇区个字节.执行无误返回,错误返回非.⑤ ( ,,*);存储媒介控制函数.是控制代码,*存储或接收控制数据.可以在此函数里编写自己需要地功能代码,比如获得存储媒介地大小、检测存储媒介地上电与否存储媒介地扇区数等.如果是简单地应用,也可以不用编写,返回即可.⑥ ();实时时钟函数.返回一个位无符号整数,时钟信息包含在这位中,如下所示::年(..)从年到现在地年数:月(…):日(..).] 时(..):分(..):秒/(..)如果用不到实时时钟,也可以简单地返回一个数.正确编写完,移植工作也就基本完成了,接下来地工作就是对—进行配置.—地配置—是一款可配置可裁减地文件系统,使用者可以选择自己需要地功能.—总共有个文件,分别是.、.、.、.和..和.一般不用改动,前面地移植工作主要更改地是.,而配置—则主要修改.和..在.中,使用者可以根据需要使能—或.以下代码使能和:—'—在.中,使用者可以根据需要对整个文件系统进行全面地配置:①.有和两个值可设,默认情况下设,以获得较好地系统性能.如果单片机是大端模式或者设为时系统运行不正常,则必须设为.② .设为时将使能只读操作,程序编译时将文件系统中涉及写地操作全部去掉,以节省空间.③.有、、、四个选项可设.设表示可以使用全部提供地用户函数;设将禁用、、、、和;设将在地基础上禁用和;设将在和地基础上再禁用.使用者可以根据需要进行裁减,以节省空间.地读写测试地功能很强大,提供了丰富而易于使用地用户接口函数,如图所示.—地功能很全,本文仅测试、、、和五个函数来读一个地文件和写一个地文件,文件名分别为.和..主要代码如下:经过实际测试,在单片机系统时钟为.下读一个.文件耗时约,平均约/;写一个文件耗时约,平均约/,在资源有限地单片机系统下这个读/写速度是相当令人满意地.综上所述,具有容易移植、功能强大和易于使用地优点,适用于小型嵌入式系统;又是完全地免费和开源,也可以用于教育科研及其商业用途.。

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

FATFS文件系统的移植
作者:LJ
时间:2010年11月12日
随着信息技术的发展,目前常用文件系统主要有微软的FAT12、FAT16、FAT32、NTES文件系统,以及Linux系统的EXT2、EXT3等。

由于Windows操作系统的广泛应用,当前很多嵌入式产品中用的最多的还是FAT文件系统。

所以,选择一款容易移植和使用,并且占用资源少而功能全面的文件系统就显得非常重要了。

FATFS文件系统是一个完全免费且开源的FAT文件系统模块,由小日本工程师编写,它支持FAT12、FAT16和FAT32文件系统,专门为小型的嵌入式系统而设计。

模块用标准的C语言编写,可以很容易地移植到各种硬件平台。

在“驱动程序”文件夹中有一个“FatFs R0.07c”文件夹,这是官方提供的FATFS文件系统的源码和文档,版本为R0.07c。

打开“doc”文件夹下的“00index_e.html”英文网页文档,里面有FATFS文件系统的全部API函数说明,相对应的应用实例和如何编写硬件接口程序的说明。

如果您的英文不怎么好,建议您先装一个有道词典,使用屏幕取词功能,能帮助我们阅读和理解。

“00index_j.html”则是日文版的网页,毕竟是小日本写的。

“src”文件夹存放有FATFS文件系统源码,下面是该文件夹下各个文件或文件夹存放的内容说明:“ff.h”文件:FATFS文件系统的配置和API函数声明;
“ff.c”文件:FATFS源码;
“diskio.h”文件:FATFS与存储设备接口函数的声明;
“diskio.c”文件:FATFS与存储设备接口函数;
“integer.h”文件:FATFS用到的所有变量类型的定义;
“option”文件夹:存放一些外接函数,下一实例有实际的讲解;
“00readme.txt”文件:FATFS版本及相关信息说明;
编译工程,没有通过,根据编译信息提示在“diskio.c”文件中在几个函数没有定义。

这很正常,因为我们还没有编写文件系统与存储设备的接口函数。

下面来分析“diskio.c”文件中各个函数的功能:“DSTATUS disk_initialize ( BYTE drv )”是存储媒介的初始化函数,由于我们使用的是SD卡,所以实际上是对SD卡的初始化;
“DSTATUS disk_status ( BYTE drv )”状态检测函数,检测是否支持当前的存储设备,支持返回0;
“DRESULT disk_read (BYTE drv, BYTE *buff, DWORD sector, BYTE count)”是读扇区函数,drv是要读扇区的存储媒介号,*buff 存储读取的数据,sector是读数据的开始扇区,count是要读的扇区数。

在SD卡的驱动程序中,分别提供了读一个扇区和读多个扇区的函数。

当count == 1时,用读一个扇区函数;当 count > 1时,用读多个扇区的函数,这样提高了文件系统读效率。

操作成功返回0。

“DRESULT disk_write(BYTE drv, BYTE *buff, DWORD sector, BYTE count)”写扇区函数,drv是要写扇区的存储媒介号,*buff存储写入的数据,sector是写开始扇区,count是要写的扇区数。

同样在SD卡的驱动程序中,分别提供了写一个扇区和写多个扇区的函数。

当count == 1时,用写一个扇区函数;当 count > 1时,用写多个扇区的函数,这样提高了文件系统写效率。

操作成功返回0。

“DRESULT disk_ioctl (BYTE drv, BYTE ctrl, void *buff)”是存储媒介控制函数,drv是存储媒介号,ctrl是控制代码,*buff 存储控制数据,可以在此函数编写自己需要的功能代码。

比如,获得存储媒介的大小,检查存储媒介上电已否,读取存储媒介的扇区数等。

在我们的系统中没有用到,直接返回0。

在“ff.c”文件中,需要用户提供一个“get_fattime”实时时钟函数,要求返回一个32位无符号整数,时钟信息包含如下:Bit31:25 ,年(0..127)从1980年到现在的年数;
Bit24:21,月(1..12);
Bit20:16,日(1..31);
Bit15:11,时(0..23);
Bit10:5,分(0..59);
Bit4:0,秒/2(0..29)
我们没有用到实时时钟,可以直接返回0;最后,在“diskio.c”文件中应包含“SD_Device.h”头文件。

通过上面对文件系统硬件接口函数的修改,再次编译工程,发现BOOL变量类型被重复定义,我们打开“stm32f10x.h”文件,注释掉自行定义的BOOL变量类型,编译通过。

将“ff.h”文件包含到“include.h”文件中。

届时,我们就可以在整个工程里使用FATFS 文件系统了。

相关文档
最新文档