• 易迪拓培训,专注于微波、射频、天线设计工程师的培养
首页 > 无线通信 > 技术文章 > MC9S12UF32的嵌入式文件系统数据存储模块

MC9S12UF32的嵌入式文件系统数据存储模块

录入:edatop.com     点击:

设定DSl2887的时间和从DSl2887中读取时间信息的底层程序比较简单,只需参照芯片手册对寄存器进行合理配置。但是,需要特别注意的是,在写时钟和读取时钟之前需要锁存时钟信息相关的buffer,防止在读写过程中由于出现时钟信息自动更新情况而导致的错误。系统中,在每次读写实时钟之前,查询DSl2887内部控制寄存器A最高位UIP是否为O,以避免上述错误的产生。因为芯片手册中给出,一旦UIP=O,那么在244μs内实时钟模块都不会自动更新当前的时钟信息,而这段时间足以让单片机完成读写实时钟的过程。

3 FatFS文件系统的移植与配置

3.1 FatFS软件包简介

采用文件系统,是为了在单片机能够对SD卡进行数据读写的同时,保证其读写的数据能够被大多数通用设备识别。换言之,数据在存储器内的组织型式,需要遵循一些已有的工业标准和规范。例如使用FAT文件系统,数据存储单元的SD卡取下来后,可以使用任何标准的读卡器在windows、Linux等PC机上读出。

当前著名的嵌入式文件系统有若干种选择,比如EFSL(Embedded Filesystem Library)、uC/FS、/TinyFatFS等。这之中EFSL和FatFs都是开放源码的,具有十分详尽的文档和函数手册,除错更新也十分及时,在本文的设计中我们采用的是FatFS。

FatFS采用使用ANSI C编写,具有很好的硬件平台独立性,使用者只需要对源程序进行简单的修改和配置,就可以将其移植到各种系列的单片机上。此外,它的内存开销很小,ROM的占有量在十几KB的量级,使用者可以根据不同的应用方便的对代码进行裁减。FatFS支持FATl2、FATl6和FAT32,可以建立独立的缓冲区对多个文件进行读写。FatFs是一个不断更新完善的软件,大量的相关信息可以从原作者的主页上得到(http://elm-chan.org/fsw/ff/00index_e.html),同时原作者也做了很多性能测试的工作。

3.2 FatFS的移植

可从FatFS的主页上下载得到FatFS R0.07版本。FatFS的主程序包含5个文件,即diskio.c、diskio.h、ff.c、ff.h和integer.h。其中,diskio.c和diskio.h是与底层硬件I/O相关的函数;ff.c和ff.h是应用函数,主要涉及FatFS的配置和裁减;而integer.h中定义了FatFS软件所使用的各种数据类型。

移植FatFS的过程中基本不需要对diskio.h和ff.c进行修改。除了核实integer.h中的数据类型定义是否与MC9S12U32数据类型相符之外,移植的重点工作在于diskio.c中6个主要函数的实现和ff.h中对于文件系统的裁减配置。dikio.c包含的6个接口函数:disk_initial-ize,disk status,disk ioctl,disk read,disk write和disk_fattime。它们分别实现存储介质的初始化、读取/写入若干个扇区的数据和获取实时钟信息的功能。

具体移植过程如下:

(1)存储媒介初始化函数

DSTATUS disk_initialize(BYTE drv)

由于采用的存储媒介是SD卡,所以该函数的实际功能是对SD卡进行初始化。drv是存储介质号码,由于Tiny-FatFS只支持一个存储介质,所以此处drv始终取O值。执行无误,则返回值=O;执行中出现错误,则返回非O值。

(2)状态检测函数

DSTATUS disk_status(BYTE drv)

该函数用于检测是否支持当前的存储介质。此处的drv仍然恒为O。对Tiny-FatFS而言,只要drv为O,就认为支持当前介质,函数直接返回O值即可。

(3)读扇区函数

DRESULT disk read(BYTE drv,BYTE*buff,DWORD seetor,BYTE.count)

该函数是在"单片机从SD卡读取一个扇区"的函数基础上编写而成的,其功能是从SD卡读取一个或多个扇区的数据。*buff用于存储已经读取的数据,sector是待读取扇区的起始扇区数,count是需要读取的扇区数。如果执行无误则返回O值,否则返回非O值。

(4)写扇区函数

DRESULT disk_write(BYTE drv,const BYTE*buff。DWORD sector,BYTE count)

与disk_read相似,该函数是在"单片机向SD卡写入一个扇区"的函数基础上编写而成的,其功能是向SD卡导入一个或多个扇区的数据。*buff用于保存将要写入的数据,sector是待写入扇区的起始扇区数,count是需要写入的扇区数。如果执行无误,则返回0值;否则,返回非0值。

(5)存储介质控制函数

DRESULT disk_ioctl(BYTE drv,BYTE ctrl,VoiI*buff)

ctrl是控制代码,*buff用于保存或接收需要控制的数据数据。使用者可以在此函数里添加自己需要的功能代码,例如获得存储介质的容量、扇区数等。如果是简单的应用,也可以不执行任何功能,直接返回0值。本文采用的就是这一方法。

(6)实时钟函数

DWORD disk_fattime(Void)

该函数将读取的实时钟信息保存在一个32位无符号整数中,并将其作为函数的返回值。时钟信息在这32位中的具体分布如表1所列。

3.3 FatFS的裁减与配置Tiny-FatFS

FatFs提供了丰富的库函数,可以实现创建、读取文件夹,创建、读写文件,移动文件指针,向文件中写入或读取字符串,甚至是类似与C语言fprintf()的格式化输入等各种功能。使用者可以根据自己的需求设置相应的宏,对FatFs进行裁减,仅保留需要的功能函数,从而精简文件系统的内存开销。FatFS提供的函数与宏的对应关系如图3所示。

作者:韩晓雪,曾 鸣,邵贝贝 清华大学 来源:国外电子元器件

上一篇:WinCE的嵌入式系统注册表的研究
下一篇:基于LabVIEW和ARM嵌入式数据采集与远程传输控制系统

手机天线设计培训教程详情>>

手机天线设计培训教程 国内最全面、系统、专业的手机天线设计培训课程,没有之一;是您学习手机天线设计的最佳选择...【More..

射频和天线工程师培训课程详情>>

  网站地图