移植和使用的文件系统FatFsWord格式.docx
- 文档编号:22741845
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:5
- 大小:18.66KB
移植和使用的文件系统FatFsWord格式.docx
《移植和使用的文件系统FatFsWord格式.docx》由会员分享,可在线阅读,更多相关《移植和使用的文件系统FatFsWord格式.docx(5页珍藏版)》请在冰豆网上搜索。
FatFsModule有个简化版本Tiny—FatFs,它跟完全版FatFs的不同之处主要有两点:
①占用内存更少,只要1KBRAM;
②1次仅支持1个存储介。
FatFs和Tiny—FatFs的用法一样,仅仅是包含不同的头文件即可,非常方便,本文主要介绍Tiny-FatFs.
1Tiny-FatFs
1.1移植前的准备
FatFsModule一开始就是为了能在不同的单片机上使用而设计的,所以具有良好的层次结构,如图1所示。
最顶层是应用层,使用者无需理会FatFsModule的内部结构和复杂的FAT协议,只需要调用FatFsModule提供给用户的一系列应用接口函数,如f_open,f_read,f_write、f_close等,就可以像在PC上读/写文件那样简单。
中间层FatFsModule实现了FAT文件读/写协议。
FatFsModule的完全版提供的是ff.c、ff.h,简化版Tiny—FatFs提供的是tff.c、tff.h。
除非有必要,使用者一般不用修改,使用时将需要版本的头文件直接包含进去即可。
需要使用者编写移植代码的是FatFsModule提供的底层接口,它包括存储媒介读/写接口DiskIO和供给文件创建修改时间的实时时钟。
本移植硬件平台使用型号为ATmegal28的AVR单片机和SD卡。
ATmegal28是一种8位RISC单片机,具有多达4KB的RAM、128KB的内部Flash和丰富的外设。
软件平台是WINAVR,具有代码优化能力强和完全免费的优点。
1.2移植步骤
1.2.1编写SPI和SD卡接口代码
本文使用SD卡的SPI通信模式。
SD卡的DI接MOSI,DO接MISO,CS接SS。
这就需要ATmegal28提供SPI读/写接口代码,主要包括初始化、读和写。
SPI初始化包括SPI相关寄存器的初始化和相关I/O口的初始化。
将ATmega128的SPI配置成主机模式、数据高位先传、时钟速率为二分之一系统时钟等。
代码如下:
SPCR=(O<
<
SPIE)|
(1<
SPE)|
(O<
DORD)|
MSTR)|
CPOL)|
CPHA)|
SPR1)|
SPRO);
SPSR|=(1<
SPI2X);
接着配置I/O口的输入/输出。
MOSI脚和Ss脚配置成输出,MISO脚配置成输入。
然后,就可以进行读/写了。
读1个字节的SPI接口代码:
staticBYTErcvr_spi(void){
SPDR=OxFF;
loop_until_bit_is_set(SPSR,SPIF);
returnSPDR;
}
写1个字节的SPI接口代码:
staticvoidxmit_spi(BYTEdat){
SPDR=dat;
loop_until_bit_is_set(SPSR,SPIF)
在具备SPI读/写接口的基础上编写SD卡接口代码,需要编写3个基本接口函数:
①向SD卡发送1条命令:
StaticBYTEsend-cmd(BYTEcmd,DWORDarg);
②向SD卡发送1个数据包:
StaticBOOLxmit—datablock(constBYTE*buff,BYTEtoken);
③从SD卡接收1个数据包:
staticBCK]Lrcvr-datablock(BYTE*buff,UINTbtr);
1.2.2编写DiskIO
编写好存储媒介的接口代码后,就可以编写DiskIO了,DiskIO结构如图2所示。
Tiny—FatFs的移植实际上需要编写6个接口函数,分别是:
①DSTATUSdisk_initialize(BYTEdrv);
存储媒介初始化函数。
由于存储媒介是SD卡,所以实际上是对SD卡的初始化。
drv是存储媒介号码,由于Tinv—FatFs只支持一个存储媒介,所以drv应恒为O。
执行无误返回0,错误返回非O。
②DSTATUSdisk_status(BYTEdrV);
状态检测函数。
检测是否支持当前的存储媒介,对Tinv—FatFs来说,只要drv为0,就认为支持,然后返回O。
③DRESULTdisk_read(BYTEdrv,BYTE*buff,DWORDsector,BYTE.count);
读扇区函数。
在SD卡读接口函数的基础上编写,*buff存储已经读取的数据,sector是开始读的起始扇区,count是需要读的扇区数。
1个扇区512个字节。
执行无误返回O,错误返回非0。
④DRESULTdisk_write(BYTEdrv,constBYTE*buff,DWORDsector,BYTEcount);
写扇区函数。
在SD卡写接口函数的基础上编写,*buff存储要写入的数据,sector是开始写的起始扇区count是需要写的扇区数。
⑤DRESULTdisk_ioctl(BYTEdrv,BYTEctrl,VoiI*buff);
存储媒介控制函数。
ctrl是控制代码,*buff存储或接收控制数据。
可以在此函数里编写自己需要的功能代码,比如获得存储媒介的大小、检测存储媒介的上电与否存储媒介的扇区数等。
如果是简单的应用,也可以不用编写,返回O即可。
⑥DWORDget_fattime(Void);
实时时钟函数。
返回一个32位无符号整数,时钟信息包含在这32位中,如下所示:
bit31:
25年(O..127)从1980年到现在的年数
bit24:
21月(1…12)
bit20:
16日(1..31)
bitl5.1]时(O..23)
bitl0:
5分(O..59)
bit4:
0秒/2(0..29)
如果用不到实时时钟,也可以简单地返回一个数。
正确编写完DiskIO,移植工作也就基本完成了,接下来的工作就是对Tiny—FatFs进行配置。
2Tiny—FatFs的配置
Tiny—FatFs是一款可配置可裁减的文件系统,使用者可以选择自己需要的功能。
Tiny—FatFs总共有5个文件,分别是tff.c、tff.h、diskio.c、diskio.h和integer.h。
tff_c和integer.h一般不用改动,前面的移植工作主要更改的是diskio.c,而配置Tiny—FatFs则主要修改tff.h和diskio.h。
在diskio.h中,使用者可以根据需要使能disk—write或disk_ioetl。
以下代码使能disk_write和disk_ioctl:
#define—R'
EADONLY0
#define—USE_IOCTL1
在tff.h中,使用者可以根据需要对整个文件系统进行全面的配置:
①
#define_MCU_ENDIAN。
有1和2两个值可设,默认情况下设1,以获得较好的系统性能。
如果单片机是大端模式或者设为1时系统运行不正常,则必须设为2。
②#define_FS_READONLY。
设为1时将使能只读操作,程序编译时将文件系统中涉及写的操作全部去掉,以节省空间。
③#define_FS_MINIMIZE。
有0、1、2、3四个选项可设。
设0表示可以使用全部Tiny-FatFs提供的用户函数;
设1将禁用f_stat、f_getfree、f_unlink、f_mkdir、f_chmod和f_rename;
设2将在1的基础上禁用f_opendir和f_readdir;
设3将在1和2的基础上再禁用f_lseek。
使用者可以根据需要进行裁减,以节省空间。
3TINY-FatFs的读/写测试
Tiny-FatFs的功能很强大,提供了丰富而易于使用的用户接口函数,如图3所示。
Tiny—FatFs的功能很全,本文仅测试f_mount、f_open、f_read、f_write和f_close五个函数来读一个3.4MB的文件和写一个1MB的文件,文件名分别为testl.dat和test2.dat。
主要代码如下:
经过实际测试,在单片机系统时钟为11.0592MHz下读一个3.4MB文件耗时约20s,平均约170KB/s;
写一个1MB文件耗时约6s,平均约166KB/s,在资源有限的单片机系统下这个读/写速度是相当令人满意的。
综上所述,FatFsModule具有容易移植、功能强大和易于使用的优点,适用于小型嵌入式系统;
又是完全的免费和开源,也可以用于教育科研及其商业用途。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 移植 使用 文件系统 FatFs