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

发布者:梅花居士最新更新时间:2012-10-19 来源: 国外电子元器件 关键字:MC9S12UF32  FatFS  FAT文件系统 手机看文章 扫描二维码
随时随地手机看文章

引言
    随着信息技术的发展,嵌入式系统简单地对存储介质按地址、字节进行读写的方式已经不能满足实际应用的需求,利用文件系统对存储介质进行管理成为嵌入式系统的一个发展方向。虽然目前存在很多版本的文件系统,但windows的广泛应用使得FAT文件系统仍然是最通用的文件系统之一。本文中基于MC9S12UF32单片机,结合开源文件系统FatFS,设计实现了使用FAT文件系统的大容量数据存储模块。

1 系统结构
    数据存储系统框架如图1所示。该数据存储模块以Freescale公司的MC9S12UF32为核心,串行通信接口SCI接收到的数据可以直接通过单片机以FAT文件的形式存储在micro SD卡中。用户程序可以通过编程控制单片机,直接对micro SD卡中的任意文件进行读写,实现存储数据。由于实现了FAT文件系统,用户也可以通过单片机内置的USB接口将本数据模块识别为U盘,用PC机进行读写操作。此外,模块中的SD卡也可以取出,使用标准的读卡器可在任何PC机上读出。

2 硬件结构及底层函数的编写
    本文所介绍的数据存储插件由MC9S12UF32、DSl2887实时钟模块、micro SD卡、串行通信接口以及USB接口5部分组成。实时时钟,可以为数据存储模块的文件系统提供正确的时间戳信息,在精简的系统设计中,这个部分则可以省略。
2.1 MC9S12UF32单片机
    Freescale公司生产的这款16位单片机具有3.5 KBRAM和32 KB Flash EEPROM。它最大的特点在于拥有USB2.O接口、ATA5接口以及SD/MMC、SmartMedia、MemoryStick等多种存储卡接口。本文所介绍的数据存储插件采用MC9S12UF32单片机内部集成的SD主控制器模块(SDHC)实现micro SD卡的底层读写。
    (1)SDHC模块
    SDl.O规范协议中定义了对SD卡的两种访问模式:SD模式和SPI模式。使用SDHC(Secured Digital cardHost Controller)模块对SD卡读写采用了SD模式。该模块将SD总线转换为MC9S12UF32内部的IPBus总线或者IQUE总线,使用者只需要对SDHC模块相关的寄存器进行配置,就可以实现向SD卡发送各种命令和读写数据的功能。SD卡与SDHC的连接如图2所示。[page]

MC9S12UF32内部集成的SDHC模块支持SD卡1.O版本的物理层协议,所以本系统使用标准microSD卡(而非SDHC卡),其存储容量最大为2 GB。这样的存储容量已经完全可以满足大多数嵌入式应用的需求。


    (2)MC9S12UF32与SD卡之间的数据传输
    在完成对时钟频率和传输数据线宽度的配置之后,通过发送相应的读写命令就可以实现单片机与SD卡之间的数据传输了。在单片机向SD卡写入数据的过程中,编程者将需要写入的数据写入SDHC模块的SDATA寄存器(16位)之后,该数据将被转移至发送数据FIFO中。与此同时,只要发送数据FIFO非空,其中的数据就会不断地通过数据线被写入SD卡的相应位置。在单片机从SD卡中读取数据的过程中,SD卡中的数据将不断发送至接收数据FIFO中。只要接收FIFO非空,单片机就可以不断地通过读SDATA寄存器得到接收数据FIFO中的数据。
2.2 DSl2887实时钟模块
    DSl2887模块使用数据/地址复用的并行异步总线,可以为单片机提供100年以内的实时钟信息(年/月/日/时/分/秒)。它内部具有石英晶振和锂电源,首次使用时,需要对该模块内部的寄存器进行相应配置,激活晶振使其进入工作状态。由于DSl2887内部带有锂电源,所以一旦晶振被激活,即使外部掉电,该模块依然可以保存并提供正确的实时钟信息。
    设定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。它们分别实现存储介质的初始化、读取/写入若干个扇区的数据和获取实时钟信息的功能。

[page]

    具体移植过程如下:
    (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所示。


    FatFS的裁减,不仅仅是函数层面的。更重要的是,在内部机制上形成一个精简版本,称为Tiny-FatFS。它与标准版FatFS相比,主要的区别在于Tiny-FatFS仅支持一个物理存储介质,而且不再针对每个开启的文件建立512字节的缓存,整个文件系统和物理介质使用同一个缓存。显然,Tiny-FatFs需要的内存开销比标准版FatFS更低,只要1 KB左右的RAM。可以说,Tinyr-FatFS是专门为小型嵌入式系统而设计的文件系统模块。本文介绍的数据存储系统使用的正是Tiny-FatFS版本。

[page]

    在表2中,对ff.h中主要配置宏的含义进行了说明,同时给出了本文所介绍的数据存储模块采用的取值。

4 FatFS文件系统的使用
    FatFS文件系统中涉及2个基本的数据结构:文件系统(磁盘)的数据结构FATFS和文件的数据结构FIL。这两个结构是FatFS软件主要的RAM开销,FATFS数据结构中有针对磁盘的512字节读写缓存,FIL则有针对每个文件的缓存。而采用Tiny FatFS配置则不会开设文件读写缓存,节约RAM。
    依次使用f_mount、f_open、f_rcad/f_write、f_close可以完成基本的读写。FatFS允许对同一文件同时复数读取,但完全不支持对同一文件同时复数的写入操作,因为这会引起文件系统错误。具体每一个函数,特别是字符串读写、格式化读写等,可以参见原始帮助和例程。
    此外,由于嵌入式系统具有突然掉电的可能性,一些关键代码段可能导致文件系统错误,所以要注意调用f_sync()及时写入。当然,如果是一组连续的f_write()写入,而每次写完都f_sync(),则会极大地影响速度,可以全部写完后f_sync()。
    V0.07以后版本的FatFS,增加了以下新的功能:
    ①_FS_TINY。Tiny模式变成了一个宏选项,而不是独立的代码包。
    ②_FS_RPATH。决定是否有当前路径的概念,这将影响两个相关函数的参数。
    ③_USE_LFN。启用长文件名支持,可为1或2,为2时可重入。由于长文件名存在堆栈上,而且启用LFN会依据代码页增加一个很大的转换表,占掉几十~几百KB,所以不推荐。
    ④_LFN_UNICODE。长文件名使用Unicode,实验阶段,尚未正式写入文档。

结语
    MC9S12UF32单片机内部集成的SDHC模块,可将SD总线转换为单片机内部的IP总线,开发者只需要对SD协议的基本内容有所了解,通过读写相应的寄存器就可以方便地实现对SD卡的底层读写,大大简化了硬件的开发过程。同时,独立于硬件平台的FatFS软件包可以方便地移植到各种嵌入式系统中,研发者只需要对该软件包的diskio.c和ff.h进行修改,即可完成移植,从而使用FatFS提供的丰富且易于使用的各种接口函数。
    应用上述主要技术实现的具有嵌入式文件系统的数据模块如图4所示。


    该模块体积小巧、存储数据的灵活性和通用性很高,可以通过模块自带的串行通信接口接收数据,并以文件的形式存储起来。用户既可以直接通过USB接口将本模块识别为U盘进行数据读写和分析,也可以将micro SD卡拔出,在任意一个具有micro SD读卡器功能的设备上读写数据。上述功能特性使得这款数据存储模块具有很良好的应用前景。

关键字:MC9S12UF32  FatFS  FAT文件系统 引用地址:MC9S12UF32的嵌入式文件系统数据存储模块

上一篇:基于MC9S12X128无刷直流电机控制系统设计
下一篇:单片机双机通讯试验

推荐阅读最新更新时间:2024-03-16 13:10

使用Cubemx移植FatFs到stm32
在大型的存储器中,没有文件系统是万万不可行的,你不可能每次要打开一个文件都要从头到尾扫描一遍存储器,几兆的小存储器还好,几G甚至几T的存储器就根本没办法这么做了。而且有了文件系统也可以方便的管理使用各类文件。 这一次使用Cubemx生成FatFs的初始化代码,然后做最后的移植工作。本人使用的是stm32f767的野火的板子。 介绍一下FafFs 系统架构 FatFs是一种中间层,可以屏蔽硬件的差异,移植起来非常方便 移植需要注意的地方 你需要提供FatFs需要的底层I/O函数,需要的函数如下表,但是并不是全部函数都需要,你只需要提供必需的disk_status disk_initialize disk_read 和你需要的
[单片机]
使用Cubemx移植<font color='red'>FatFs</font>到stm32
MSP430F5438A单片机基于SPI的FatFs移植笔记(一)
怎么说呢……太费劲了,前面的博客还烂尾了,主要是觉得自己在调试的过程当中思维太混乱。虽然说自己挖的坑,含着泪也要填上,这几个就先不填了吧我重新开个坑把调通的说清楚。 不管移植什么程序,最重要的就是, 不要自以为是 一定要先查资料,花一周查资料,查到查不到为止,否则你编了一半的程序再参考别人的,直接后果是你下不了决心推翻重来 1. FatFs移植要点: 相信能看到这个博客的都知道FatFs是什么了,目前应该是0.11版本,我就不多废话了,一个开源的文件系统,不全面的说,作用就是让你编程序操作写SD卡的内容能够被PC机读出来(有不对的话懂的大神请指正) 它的好处就是只要写底层的几个硬件驱动函数就OK了,上层的函数都已经写好了,
[单片机]
MSP430F5438A单片机基于SPI的<font color='red'>FatFs</font>移植笔记(一)
基于stm32 的fatfs0.07e移植过程分享
前段时间移植了fats文件系统,并基于这个文件系统,做了个简单的wav文件播放器,可以播放sd卡根目录下music文件夹里所有pcm编码的wav文件,并且支持下一曲、上一曲、暂停、开始操作。在这个过程中遇到了很多问题,在这里把我的移植经历和大家分享。 硬件平台:英蓓特 EM-STM3210E开发板 软件平台:mdk3.40;stm32V2.01库 FATfs版本:R0.07e。可在 http://elm-chan.org/fsw/ff/00index_e.html 下载 EM-STM3210E开发板上的sd卡例程只是简单的写和读sd卡的某个扇区,当然这样写过后卡上的文件系统格式就被破
[单片机]
STM32笔记SD卡的读写和FatFS文件系统
因为要用,学习了一下SPI操作SD卡,同时移植了一个免费开源的FAT文件系统:FatFS。感觉挺好,在单片机上实现了读写文件的操作,接下来就可以解释我的G代码咯!   我的SD卡底层操作参考了网上几种常见的代码,但又对其结构做了一定的优化,至少看起来用起来比较方便。既可以作为文件系统的diskio使用,也可以直接使用底层函数,把SD卡作为一块flash读写。   FatFs文件系统体积蛮小,6-7K足矣,对于128Kflash的STM32来说很合适,代价不大。同时可移植性很高,最少只需要4个函数修改既可以实现文件系统的移植。相关文件系统的介绍 请看这里 。   这里给一套比较完整的参考资料,包括fatfs文件系统的原版资料、几个重
[单片机]
STM32笔记SD卡的读写和<font color='red'>FatFS</font><font color='red'>文件系统</font>
fatfs文件系统移植到STM32F10x
//文件系统与SD卡驱动接口文件diskio.c #include diskio.h #include ffconf.h #include #include MMC_SD.h DSTATUS disk_initialize ( BYTE drv ) { int Status; switch (drv) { case 0 : // Status = MSD0_Init(); Status = SD_Init(); if(Status==0){ return RES_OK; }else{ return STA_NOINIT; } case 1
[单片机]
STM32例程之FATFS文件系统(SPI方式)移植笔记
一、序言 经常在网上、群里看到很多人问关于STM32的FATFS文件系统移植的问题,刚好自己最近也在调试这个程序,为了让大家少走弯路,我把我的调试过程和方法也贡献给大家。 二、FATFS简介 FatFs Module是一种完全免费开源的FAT文件系统模块,专门为小型的嵌入式系统而设计。它完全用标准C语言编写,所以具有良好的硬件平台独立性,可以移植到8051、PIC、AVR、SH、Z80、H8、ARM等系列单片机上而只需做简单的修改。它支持FATl2、FATl6和FAT32,支持多个存储媒介;有独立的缓冲区,可以对多个文件进行读/写,并特别对8位单片机和16位单片机做了优化。 三、移植准备 1、FATFS源代码的获取,
[单片机]
STM32L4新版HAL库SDIO(DMA)、FatFs使用教程(四)
添加FreeRtos支持。 FreeRtos中使用FATFS是强制要求使用DMA模式的SDIO驱动。步骤如下: 1、打开工程配置文件,添加FreeRtos支持 2、配置参数 发现configuration选项卡SDMMC1报错,信息如下,意思是中断优先级问题。 打开NVIC配置界面,修改中断优先级,注意,DMA优先级要比SD中断优先级低。 打开FREERTOS选项,如图所示适当配置任务堆栈大小,这里为了测试方便,放到Start Task中测试,正式使用时,不要放在这里,要新建任务。文件操作所在的任务需要适当加大堆栈。 3、生成代码,打开工程,将main函数中的Fatfs_RW_test();语句剪切,粘贴到
[单片机]
STM32L4新版HAL库SDIO(DMA)、<font color='red'>FatFs</font>使用教程(四)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved