FATFS移植stm32

    首先将官方网站http://elm-chan.org/fsw/ff/00index_e.html 这个网站下载到 ,下载下来的fatfs源文件保存至您的工程目录下,起名字为fatfs

将要移植的文件有两个.c文件和4.h文件。C文件就是diskio.c,该文件包含了底层驱动部分,和硬件部分的接口就在这里边的改动。该文件从底层定义了驱动盘的来源,有ata读盘,ATA_disk_read(buff, sector, count);sd卡 MMC_disk_read(buff, sector, count);,有usb读盘USB_disk_read(buff, sector, count);定义了三种读盘类型。而我们需要将sd卡的驱动文件也就是mmc换成我们的自己定义的,在fatfs中这些底层驱动文件并没有,所以需要我们i自己来写。当然网上例子众多,也可以借鉴移植。

其中,与平台无关的是:

ffconf.h                 FATFS模块配置文件

ff.h                       FATFS和应用模块公用的包含文件

ff.c                       FATFS模块

diskio.h                 FATFSdisk I/O模块公用的包含文件

interger.h               数据类型定义

option                   可选的外部功能(比如支持中文等)

与平台相关的代码(需要用户提供)是:

diskio.c                 FATFSdisk I/O模块接口层文件

FATFS模块在移植的时候,我们一般只需要修改2个文件,即ffconf.hdiskio.cFATFS模块的所有配置项都是存放在ffconf.h里面,我们可以通过配置里面的一些选项,来满足自己的需求。接下来我们介绍几个重要的配置选项。

1_FS_TINY选择开关的缓冲区的配置。 (0:正常或1:微型)一般默认为0.

2_FS_READONLY。这个用来配置是不是只读,本章我们需要读写都用,所以这里设置为0即可。

3_USE_STRFUNC。这个用来设置是否支持字符串类操作,比如f_putcf_puts等,本章我们需要用到,故设置这里为1

4_USE_MKFS。这个用来定时是否使能格式化,本章需要用到,所以设置这里为1

5_USE_FASTSEEK。这个用来使能快速定位,我们设置为1,使能快速定位。

6_CODE_PAGE。这个用于设置语言类型,包括很多选项(见FATFS官网说明),我们这里设置为936,即简体中文(GBK码,需要c936.c文件支持,该文件在option文件夹)。

7_USE_LFN。该选项用于设置是否支持长文件名(还需要_CODE_PAGE支持),取值范围为0~30,表示不支持长文件名,1~3是支持长文件名,但是存储地方不一样,我们选择使用3,通过ff_memalloc函数来动态分配长文件名的存储区域。

8_VOLUMES。用于设置FATFS支持的逻辑设备数目,我们设置为2,即支持2个设备。

9)_MAX_SS。扇区缓冲的最大值,一般设置为512

10)#define _FS_MINIMIZE r0.10出现,定义了最小化水平,以消除一些API函数

#define _USE_LABEL  此选项切换卷标功能,f_getlabel()和f_setlabel()。

默认为0.

其他配置项,我们这里就不一一介绍了,FATFS的说明文档里面有很详细的介绍,大家自己阅读即可。下面我们来讲讲FATFS的移植,FATFS的移植主要分为3步:

①     数据类型:在integer.h 里面去定义好数据的类型。这里需要了解你用的编译器的数

据类型,并根据编译器定义好数据类型。

②     配置:通过ffconf.h配置FATFS的相关功能,以满足你的需要。

③     函数编写:打开diskio.c,进行底层驱动编写,一般需要编写个接口函数,

该函数都在diskio.c里。

下面是源文件

DSTATUS disk_status (

BYTE pdrv /* Physical drive nmuber to identify the drive */

)

{

DSTATUS stat;

int result;

switch (pdrv) {

case ATA :

result = ATA_disk_status();//没有用可以注释掉

// translate the reslut code here

return stat;

case MMC ://调用此 应该给MMC宏定义  可以参考sd_MMC.H文件

result = MMC_disk_status();

// translate the reslut code here

return stat;

case USB :

result = USB_disk_status();没有用可以注释掉

// translate the reslut code here

return stat;

}

return STA_NOINIT;

}

/*-----------------------------------------------------------------------*/

/* Inidialize a Drive                                                    */

/*-----------------------------------------------------------------------*/

DSTATUS disk_initialize (

BYTE pdrv /* Physical drive nmuber to identify the drive */

)

{

DSTATUS stat;

int result;

switch (pdrv) {

case ATA :

result = ATA_disk_initialize();没有用可以注释掉

// translate the reslut code here

return stat;

case MMC :

result = MMC_disk_initialize();////换成自己的借口

// translate the reslut code here

return stat;

case USB :

result = USB_disk_initialize();没有用可以注释掉

// translate the reslut code here

return stat;

}

return STA_NOINIT;

}

.

..

....

........下面的一样。

提醒根据需要可以定义读写使能。

在移植的过程中,我们需要增加6个函数的编写,就是上述提到过的。这六个函数的所在文件我们可以编写一个.c.h文件,也可以直接包含在已有的文件里。为思路清晰,在这里,我增加至sd_mmc.cdiskio.c里增加#include””

SD_DISK.c内增加.

SD_Initialize();

SD_WriteDisk((u8*)buff,sector,count);

SD_ReadDisk(buff,sector,count);  

另外我们可以移植原子的程序,可以加封装,方便调用。本移植没有使用内存管理。

sitemap