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 FATFS和disk I/O模块公用的包含文件
interger.h 数据类型定义
option 可选的外部功能(比如支持中文等)
与平台相关的代码(需要用户提供)是:
diskio.c FATFS和disk I/O模块接口层文件
FATFS模块在移植的时候,我们一般只需要修改2个文件,即ffconf.h和diskio.c。FATFS模块的所有配置项都是存放在ffconf.h里面,我们可以通过配置里面的一些选项,来满足自己的需求。接下来我们介绍几个重要的配置选项。
1)_FS_TINY。选择开关的缓冲区的配置。 (0:正常或1:微型)一般默认为0.
2)_FS_READONLY。这个用来配置是不是只读,本章我们需要读写都用,所以这里设置为0即可。
3)_USE_STRFUNC。这个用来设置是否支持字符串类操作,比如f_putc,f_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~3。0,表示不支持长文件名,1~3是支持长文件名,但是存储地方不一样,我们选择使用3,通过ff_memalloc函数来动态分配长文件名的存储区域。
8)_VOLUMES。用于设置FATFS支持的逻辑设备数目,我们设置为2,即支持2个设备。
9)_MAX_SS。扇区缓冲的最大值,一般设置为512。
10)#define _FS_MINIMIZE 0 在r0.10出现,定义了最小化水平,以消除一些API函数。
#define _USE_LABEL 此选项切换卷标功能,f_getlabel()和f_setlabel()。
默认为0.
其他配置项,我们这里就不一一介绍了,FATFS的说明文档里面有很详细的介绍,大家自己阅读即可。下面我们来讲讲FATFS的移植,FATFS的移植主要分为3步:
① 数据类型:在integer.h 里面去定义好数据的类型。这里需要了解你用的编译器的数
据类型,并根据编译器定义好数据类型。
② 配置:通过ffconf.h配置FATFS的相关功能,以满足你的需要。
③ 函数编写:打开diskio.c,进行底层驱动编写,一般需要编写6 个接口函数,
该函数都在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.c在diskio.c里增加#include””
在SD_DISK.c内增加.
SD_Initialize();
SD_WriteDisk((u8*)buff,sector,count);
SD_ReadDisk(buff,sector,count);
另外我们可以移植原子的程序,可以加封装,方便调用。本移植没有使用内存管理。