stm32的USB(二)Fatfs在stm32上的移植

前言

相信大家不会对FAT文件系统感到陌生,在Windows上就能够直接操作FAT文件,Fatfs是一个完全免费和开源的文件系统模块,它支持FATl2、FATl6 和FAT32,支持多个存储媒介,有独立的缓冲区,可以对多个文件进行读/写,在嵌入式系统中得到广泛应用。Fatfs有Fatfs和FatFs/Tiny两个版本,FatFs/Tiny占用RAM较小,但是以更慢的读写速度和更少的API函数为代价,下面以Fatfs版本作介绍大家可以从以下链接下载源码:http://elm-chan.org/fsw/ff/00index_e.html

移植

Fatfs的层次结构如下图所示:


应用层提供了接口函数,如f_open,f_read,f_write和f_close等,用户调用这些接口函数就可以像在PC机上那样读/写文件。

中间层Fatfs模块,实现了FAT文件读/写协议,除非有必要,一般不用修改,使用时将头文件包含进去即可。

移植时需要修改的是Fatfs的底层接口,包括存储媒介读/写接口(disk I/O)和在文件创建时附上修改时间的实时时钟。一般只需要修改ffconf.h、integer.h和diskio.c这三个文件。

ffconf.h存放着模块的配置项,用户可以按照自己的需求来修改这些配置项,下面介绍几个移植时需要注意的配置项。

_FS_TINY:用来配置是否使用FatFs/Tiny版本,这里我用的是FatFs版本,所以把它配置为0;

_FS_READONLY:用来配置是否为只读模式,我需要读写都要用,所以也配置为0;

_FS_MINIMIZE:配置使用的功能数量,可以配置为0~3四个等级,数字越小功能越齐全,这里配置为0,使用所有的功能;

_USE_STRFUNC:设置是否支持字符串类操作,如f_putc,f_puts等,设置这里为1;

_USE_MKFS:是否使能格式化,设置为1;

_USE_FASTSEEK:是否使能快速定位,设置为1,使能快速定位;

_USE_LABEL:设置是否支持磁盘盘符(磁盘名字)读取与设置,我不需要通过相关函数读取或者设置磁盘的名字,所以置0;

_CODE_PAGE:用于设置语言类型,有很多选项可以选择,具体见FATFS官网说明,这里设置为1252,即拉丁文;

_USE_LFN:设置是否支持长文件名(还需要_CODE_PAGE支持),可以设置为0~3,0表示不支持长文件名,1~3是支持长文件名,但是存储地方不一样,我选择0;

_VOLUMES:设置FATFS支持的逻辑设备数目,设置为1,即支持1个设备;

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

在integer.h定义好数据类型,这个要根据编译器所使用的数据类型来定,我使用的是MDK-ARM 5.15.0,所以integer.h中的数据定义如下:

/* These types must be 16-bit, 32-bit or larger integer */
typedef int				INT;
typedef unsigned int	UINT;

/* These types must be 8-bit integer */
typedef signed char		CHAR;
typedef unsigned char	UCHAR;
typedef unsigned char	BYTE;

/* These types must be 16-bit integer */
typedef short			SHORT;
typedef unsigned short	USHORT;
typedef unsigned short	WORD;
typedef unsigned short	WCHAR;

/* These types must be 32-bit integer */
typedef long			LONG;
typedef unsigned long	ULONG;
typedef unsigned long	DWORD;

FATFS模块与磁盘I/O 层分开的,因此需要以下函数来实现底层物理磁盘的读写与获取当前时间,底层磁盘I/O 模块并不是FATFS的一部分,并且必须由用户提供。在diskio.c中需要编写的6个驱动函数,如下图所示:



disk_initialize函数:


disk_status函数:


disk_read函数:


disk_write函数:


disk_ioctl函数:



get_fattime函数:


以上的这六个函数要根据实际项目的硬件电路以及所要操作的存储媒介来编写,针对stm32的USB,st公司提供了整套的库和一些例程,配合Fatfs对u盘进行读/写操作,st公司提供的usbh_msc_fatfs.c文件中已完成了对这六个函数的编写,不需要将diskio.c这个文件加到项目中了。

通过以上的修改就完成了Fatfs的移植工作。




  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丰年稻香

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值