打印

一种易于移植和使用的文件系统FatFs Moule

[复制链接]
845|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
heping517|  楼主 | 2015-11-24 20:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
随着信息技术的发展,当今社会的信息量越来越大,以往由单片机构成的系统简单地对存储媒介按地址、按字节的读/写已经不满足人们实际应用的需要,于是利用文件系统对存储媒介进行管理成了今后单片机系统的一个发展方向。目前常用的文件系统主要有微软的FATl2、FATl6、FAT32、NTFS,以及Linux系统下的EXT2、EXT3等。由于微软Windows的广泛应用,在当前的消费类电子产品中,用得最多的还是FAT文件系统,如U盘、MP3、MP4、数码相机等,所以找到一款容易移植和使用、占用硬件资源相对较小而功能又强大的FAT开源文件系统,对于单片机系统设计者来说是很重要的。
沙发
heping517|  楼主 | 2015-11-24 20:46 | 只看该作者
FatFs Module是一种完全免费开源的FAT文件系统模块,专门为小型的嵌入式系统而设计。它完全用标准C语言编写,所以具有良好的硬件平**立性,可以移植到8051、PIC、AVR、SH、Z80、H8、ARM等系列单片机上而只需做简单的修改。它支持FATl2、FATl6和FAT32,支持多个存储媒介;有独立的缓冲区,可以对多个文件进行读/写,并特别对8位单片机和16位单片机做了优化。FatFs Module有个简化版本Tiny—FatFs,它跟完全版FatFs的不同之处主要有两点:
    ①占用内存更少,只要1 KB RAM;
    ②1次仅支持1个存储介。

使用特权

评论回复
板凳
heping517|  楼主 | 2015-11-24 22:10 | 只看该作者
FatFs和Tiny—FatFs的用法一样,仅仅是包含不同的头文件即可,非常方便,本文主要介绍Tiny-FatFs.

使用特权

评论回复
地板
zb0830| | 2015-11-24 22:11 | 只看该作者
FatFs Module一开始就是为了能在不同的单片机上使用而设计的,所以具有良好的层次结构,如图1所示。最顶层是应用层,使用者无需理会FatFs Module的内部结构和复杂的FAT协议,只需要调用FatFs Module提供给用户的一系列应用接口函数,如f_open,f_read,f_write、f_close等,就可以像在PC上读/写文件那样简单。

使用特权

评论回复
5
heping517|  楼主 | 2015-11-24 22:11 | 只看该作者
中间层FatFs Module实现了FAT文件读/写协议。FatFs Module的完全版提供的是ff.c、ff.h,简化版Tiny—FatFs提供的是tff.c、tff.h。除非有必要,使用者一般不用修改,使用时将需要版本的头文件直接包含进去即可。

使用特权

评论回复
6
heping517|  楼主 | 2015-11-24 22:17 | 只看该作者
需要使用者编写移植代码的是FatFs Module提供的底层接口,它包括存储媒介读/写接口DiskIO和供给文件创建修改时间的实时时钟。
     本移植硬件平台使用型号为ATmegal28的AVR单片机和SD卡。ATmegal28是一种8位RISC单片机,具有多达4 KB的RAM、128 KB的内部Flash和丰富的外设。软件平台是WINAVR,具有代码优化能力强和完全免费的优点。

使用特权

评论回复
7
peace555| | 2015-11-24 22:18 | 只看该作者
编写好存储媒介的接口代码后,就可以编写DiskIO了,DiskIO结构如图2所示。
      Tiny—FatFs的移植实际上需要编写6个接口函数,分别是:

使用特权

评论回复
8
zb0830| | 2015-11-24 22:18 | 只看该作者
①DSTATUS disk_initialize(BYTE drv);
     存储媒介初始化函数。由于存储媒介是SD卡,所以实际上是对SD卡的初始化。drv是存储媒介号码,由于Tinv—FatFs只支持一个存储媒介,所以drv应恒为O。执行无误返回0,错误返回非O。
    ②DSTATUS disk_status(BYTE drV);
     状态检测函数。检测是否支持当前的存储媒介,对Tinv—FatFs来说,只要drv为0,就认为支持,然后返回O。
    ③DRESULT disk_read(BYTE drv,BYTE*buff,DWORD sector,BYTE.count);
     读扇区函数。在SD卡读接口函数的基础上编写,*buff存储已经读取的数据,sector是开始读的起始扇区,count是需要读的扇区数。1个扇区512个字节。执行无误返回O,错误返回非0。
    ④DRESULT disk_write(BYTE drv,const BYTE*buff,DWORD sector,BYTE count);
     写扇区函数。在SD卡写接口函数的基础上编写,*buff存储要写入的数据,sector是开始写的起始扇区count是需要写的扇区数。1个扇区512个字节。执行无误返回O,错误返回非0。
    ⑤DRESULT disk_ioctl(BYTE drv,BYTE ctrl,VoiI*buff);

使用特权

评论回复
9
zb0830| | 2015-11-24 22:19 | 只看该作者
存储媒介控制函数。ctrl是控制代码,*buff存储或接收控制数据。可以在此函数里编写自己需要的功能代码,比如获得存储媒介的大小、检测存储媒介的上电与否存储媒介的扇区数等。如果是简单的应用,也可以不用编写,返回O即可。
    ⑥DWORD get_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进行配置。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

90

主题

648

帖子

0

粉丝