当前位置:首页 > 单片机 > 单片机

引 言

    随着信息技术的发展,当今社会的信息量越来越大,以往由单片机构成的系统简单地对存储媒介按地址、按字节的读/写已经不满足人们实际应用的需要,于是利用文件系统对存储媒介进行管理成了今后单片机系统的一个发展方向。目前常用的文件系统主要有微软的FATl2、FATl6、FAT32、NTFS,以及Linux系统下的EXT2、EXT3等。由于微软Windows的广泛应用,在当前的消费类电子产品中,用得最多的还是FAT文件系统,如U盘、MP3、MP4、数码相机等,所以找到一款容易移植和使用、占用硬件资源相对较小而功能又强大的FAT开源文件系统,对于单片机系统设计者来说是很重要的。

    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个存储介。

    FatFs和Tiny—FatFs的用法一样,仅仅是包含不同的头文件即可,非常方便,本文主要介绍Tiny-FatFs.

1 Tiny-FatFs 

1.1 移植前的准备

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

     中间层FatFs Module实现了FAT文件读/写协议。FatFs Module的完全版提供的是ff.c、ff.h,简化版Tiny—FatFs提供的是tff.c、tff.h。除非有必要,使用者一般不用修改,使用时将需要版本的头文件直接包含进去即可。

    需要使用者编写移植代码的是FatFs Module提供的底层接口,它包括存储媒介读/写接口DiskIO和供给文件创建修改时间的实时时钟。

    本移植硬件平台使用型号为ATmegal28的AVR单片机和SD卡。ATmegal28是一种8位RISC单片机,具有多达4 KB的RAM、128 KB的内部Flash和丰富的外设。软件平台是WINAVR,具有代码优化能力强和完全免费的优点。

1.2 移植步骤
  1.2.1 编写SPI和SD卡接口代码

    本文使用SD卡的SPI通信模式。SD卡的DI接MOSI,DO接MISO,CS接SS。这就需要ATmegal28提供SPI读/写接口代码,主要包括初始化、读和写。SPI初始化包括SPI相关寄存器的初始化和相关I/O口的初始化。将ATmega 128的SPI配置成主机模式、数据高位先传、时钟速率为二分之一系统时钟等。代码如下:

SPCR=(O<<SPIE)|
     (1<<SPE)|
     (O<<DORD) |
     (1<<MSTR)|
     (O<<CPOL) |
     (O<<CPHA)|
     (O<<SPR1) |
     (O<<SPRO);
SPSR|=(1<<SPI2X);

    接着配置I/O口的输入/输出。MOSI脚和Ss脚配置成输出,MISO脚配置成输入。然后,就可以进行读/写了。

    读1个字节的SPI接口代码:

    static BYTE rcvr_spi(void){
           SPDR=OxFF;
           loop_until_bit_is_set(SPSR,SPIF);
           return SPDR;
    }
    写1个字节的SPI接口代码:
    static void xmit_spi(BYTE dat){
           SPDR=dat;
           loop_until_bit_is_set(SPSR,SPIF)
    }

    在具备SPI读/写接口的基础上编写SD卡接口代码,需要编写3个基本接口函数:

    ①向SD卡发送1条命令:
    Static BYTE send-cmd(BYTE cmd,DWORD arg);
    ②向SD卡发送1个数据包:
    Static BOOL xmit—datablock(const BYTE *buff,BYTE token);
    ③从SD卡接收1个数据包:
    static BCK]L rcvr-datablock(BYTE*buff,UINT btr);

1.2.2 编写DiskIO
    编写好存储媒介的接口代码后,就可以编写DiskIO了,DiskIO结构如图2所示。

    Tiny—FatFs的移植实际上需要编写6个接口函数,分别是:


    ①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);

    存储媒介控制函数。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进行配置。

2 Tiny—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'EADONLY 0
    #define—USE_IOCTL 1

    在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。使用者可以根据需要进行裁减,以节省空间。


3 TINY-FatFs 的读/写测试

    Tiny-FatFs的功能很强大,提供了丰富而易于使用的用户接口函数,如图3所示。

    Tiny—FatFs的功能很全,本文仅测试f_mount、f_open、f_read、f_write和f_close五个函数来读一个3.4 MB的文件和写一个1MB的文件,文件名分别为testl.dat和test2.dat。主要代码如下:

   

    经过实际测试,在单片机系统时钟为11.059 2 MHz下读一个3.4 MB文件耗时约20 s,平均约170 KB/s;写一个1 MB文件耗时约6s,平均约166 KB/s,在资源有限的单片机系统下这个读/写速度是相当令人满意的。综上所述,FatFs Module具有容易移植、功能强大和易于使用的优点,适用于小型嵌入式系统;又是完全的免费和开源,也可以用于教育科研及其商业用途。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

伦敦2024年4月16日 /美通社/ -- ATFX宣布任命Siju Daniel为首席商务官。Siju在金融服务行业拥有丰富的经验和专业知识,曾在全球各地的高管职位上工作了19年以上。Siju之前担任FXCM首席商务官...

关键字: NI AN SI BSP

常州2023年9月25日 /美通社/ -- 9月23日,由江苏省商务厅指导,世界中餐业联合会、常州市人民政府主办的"第三届中华节气菜大会暨首届江南美食节"在江苏常州开幕。文化和旅游部国际交流与合作局一...

关键字: BSP 可持续发展 大赛 质量控制

北京2023年9月25日 /美通社/ -- 9月21日,由中国质量报刊社·中国质量新闻网主办的第六届食品高质量发展交流会在北京举行,会议主题为"高质量,新生活",旨在推动食品行...

关键字: 自动化 BSP ISO9001 NAS

北京2023年9月23日 /美通社/ -- 近日,主线科技正式获准在北京市智能网联汽车政策先行区道路开启常态化测试与示范,将与物流客户在真实开放的城区道路场景中,率先开启基于L4级别自动驾驶能力的智能卡车运输示范。 随...

关键字: 智能卡 测试 高速公路 BSP

曼谷2023年9月18日 /美通社/ -- 作为东南亚的旅游胜地,泰国一直在全球范围内吸引着无数游客的目光。泰国旅游和体育部近日公布的报告显示,今年前7个月,泰国旅游业总收入约为1.08万亿泰铢(约合人民币2233亿元)...

关键字: BSP GEN 国美 AN

哥伦比卡尔达斯2023年9月22日 /美通社/ -- 近日,天合跟踪与中国电建签订拉美地区哥伦比亚泰普伊光伏电站跟踪支架供货协议,将为其提供108MW智能跟踪系统,其中包含开拓者1P智能跟踪支架、智能算法、以及智慧云平台...

关键字: 光伏电站 跟踪系统 控制器 BSP

2型炎症领域新突破 上海2023年9月22日 /美通社/ -- 赛诺菲今天宣布,达必妥®(度普利尤单抗注射液)获得中国国家药品监督管理局(NMPA)批准,用于治疗适合系统治疗的中度至重度结节性痒疹的成...

关键字: PRIME BSP REPORT SAR

欧莱雅中国旗下上海美次方投资有限公司达成首次开放式创新投资 法国克里希2023年9月22日 /美通社/ -- 欧莱雅集团宣布对中国创新型生物科技公司杉海创新进行少数股权投资,以建立长期合作伙伴关系,共同开发新...

关键字: AN BSP DEVELOPMENT FOR

赋能企业实现业务数据的可识别、可见、可协作和安全数据的可操作 北京2023年9月22日 /美通社/ -- 亚马逊云科技持续加速分析与安全服务创新,守护安全基座,助力企业进一步释放数据要素价值,实现创新增长。在数字经济时...

关键字: 亚马逊 BSP 生成式AI SECURITY

重庆2023年9月22日 /美通社/ -- 全球领先的高端半导体封装载板和印制电路板制造商奥特斯连续第八年受邀,出席重庆市市长国际经济顾问团于9月22日举行的第十七届年会。 奥特斯连续第八年受邀,出席重庆市市...

关键字: BSP 印制电路板 微型 微电子
关闭
关闭