FatFS的水动力实验数据存储系统设计
3.3 RTC模块函数
在本系统中,对STM32F103ZET6的计数器寄存器(RTC_CNTH/RTC_CNTL)和备份数据寄存器(BKP_DRx)进行配置,前者的值表示了基于0时0分0秒数值的累加进位,通过时间处理函数,获得当前日历和时刻信息;后者在于系统上电后,判断是否需要重新进行时钟初始配置,如先写入0xA5A,通过看寄存器是否还是0xA5A,判断是否掉过电。如果掉过电,则需要对系统时间进行校正。
4 FatFS文件系统的移植
4.1 FatFS文件系统结构
本系统采用基于FatFS V0.09的文件系统。文件系统的作用是保证其读写的数据能够被大多数通用设备识别。例如使用FAT文件系统,通过USB设备可以对存储的文件进行操作,或者取下MicroSD卡后使用标准的读卡器在PC机上读出。当前应用广泛的嵌入式文件系统有μC/ FS、开源的EFSL(Embedded File System Library)与FatFS等。本设计中的FatFS使用ANSI C编写,具有很好的硬件平台独立性,同时层次结构非常清晰,如图8所示。最顶层是应用层,这一层为用户提供一系列API甬数,如f_open、f_close、f_read、f_write等,用户可以像C文件一样读/写FAT文件。中间层FatFS Module完整地实现了FAT协议,用户无需对此进行任何修改。最底层是在移植过程中需要处理的接口,包括存储媒介读/写接口Lowlevel disk I/O和文件创建/修改时间时所需的实时时钟。用户根据具体的硬件编写程序,填充相关函数,即可使FatFS文件系统应用在具体的嵌入式平台设备上。
4.2 FatFS移植
FatFS的最新版本是V0.09。FatFs的主程序包含5个文件,即fdiskio.h、fconf.h、ff.c、ff.h和integer.h。移植中,还需要添加diskio.c文件与diskio.h构成底层的硬件I/O。ff.c和ff.h是主要的应用函数,上层的API函数都在其中;ffconI.h主要涉及FatFS的配置和裁减;而integer.h中定义了FatFS软件所使用的各种数据类型。移植FatFS的过程中不需要对diskio.h和ff.c进行修改。移植工作首先核实integer.h中的数据类型,定义与STM32F103ZET6数据类型是否相符。其次,实现diskio.c中6个主要函数,最后在ffconf.h中对文件系统的裁减配置。diskio.c包含的6个接口函数为:disk_initialize、disk_status、disk ioctl、disk read、disk write和disk_fat time。具体移植过程如下:
DSTATUS disk_initialize(BYTE drv)为存储介质初始化函数。drv是存储介质号码,本设计中是SD卡的初始化函数,只需支持一个存储介质,因此drv设为0。执行无误,返回0值。
DSTATUS disk_status(BYTE drv)为存储介质状态检测函数。检测是否支持当前的存储介质。事实上,只要drv为0,系统就默认为支持,执行无误返回0。
DRESULT disk_read(BYTE drv,BYTE*buff,DWORD sector,BYTE count)为读扇区函数。drv设为0,*burf指向存储的数据,sector是读的起始扇区,count是需要读的扇区数目。将SD卡读数据接口函数根据参数填写、调用,函数执行无误返回0,错误则返回非0。
DRESULT disk_write(BYTE drv,BYTE *buff,DWORDsector,BYTE count)为写扇区函数。与disk_read相似,其功能是向SD卡导入扇区的数据。*buff用于保存将要写入的数据,sector是待写入扇区的起始扇区数,count是需要写入的扇区数。在SD卡写数据接口函数基础上编写,如果执行无误,则返回0值;否则,返回非0值。
DRESULT disk_ioctl(BYTE drv,BYTE ctrl,void*buff)为存储介质控制函数。ctrl是控制代码,*buff用于保存或接收需要控制的数据。用户在此函数添加自己需要的功能代码,例如获得存储介质的容量、扇区数等。如果不执行任何功能,则直接返回0值。
DWORD disk_fattime为实时时钟函数。该函数将读取的实时钟信息保存在一个32位无符号整数中,并将其作为函数的返回值。时钟信息的具体分布如图9所示。
4.3 FatFS裁减与配置
FatFS提供了丰富的库函数,FatFS可以实现创建、读取文件夹,创建、读写文件,移动文件指针,使用者可以根据自己的需求设置相应的宏,对FatFS进行裁减,仅保留需要的功能函数,从而精简文件系统的内存开销。FatFS还需要加入对应的语言包,cc936支持的是简体中文。FatFS提供的函数与宏的对应关系如图10所示。
使用FatFS向文件中写入或读取字符串,需要使用类似C语言fprintf()的格式化输入功能时,将_USE_STRFUNC设置为2,_USE_READONLY设置为1即可。
5 FatFS文件系统的使用和系统应用
FatFS文件系统中涉及2个基本的数据结构:文件系统(磁盘)的数据结构FatFS和文件的数据结构FIL。这两个结构是FatFS软件主要的RAM开销,FatFS数据结构中有针对磁盘的512字节读写缓存,FIL则有针对每个文件的缓存。而采用Tiny—FatFS配置则不会开设文件读写缓存,节约RAM。本设计中,开启Tiny—FatFS配置比关闭共节约了未初始化的数据段(ZI—data)4 096个字节。
依次使用f_mount、f_open、f_read/f_write、f_close可以完成基本的读写。FatFS允许对同一文件同时读写,或者打开几个文件进行读写。f_write和f_printf可以分别实现对文件大块数据和字符串类型的数据写入功能。后者可以对写入的数据进行一些格式转换,包括数据类型、数据长度和有无符号等。
在水动力的实验中,采用本系统记录数据。系统主频工作在72 MHz,采用2 GB的MicroSD卡,每次记录的文件长度为2 308 KB,即时长为65 s。文件名称为数据记录的当前时刻。在一组实验结束后,通过USB口与上位机连接,即可对存储的数据文件进行操作。在上位机端,文
件读写的速度达到了200 KB/s。从测试结果上可以看出,数据储存接口正确,速度令人满意,完全适合嵌入式系统的需求,可以作为通用型数据记录系统。
结语
本系统采用的STM32F103ZET6内部集成SDIO接口,并且ST公司提供了完善的库函数,通过相应的函数就可以方便地实现对SD卡的读写,简化了硬件的开发过程。具备USB接口使得该系统大大增强了通用性和兼容性。同时,独立于硬件平台的FatFS文件系统可以方便地移植到嵌入式系统中,用户只需要对负责底层硬件接口的diskio.c进行修改,即可完成移植,并使用FatFS提供的丰富且易于使用的各种接口函数。该系统具有体积小、存储数据灵活和通用性强的优点。用户既可以直接通过USB接口将该系统识别为U盘进行数据读写和分析,也可以取出MicroSD卡在读卡器上读写数据。将该系统拓展应用在嵌入式系统应用中,具有良好的前景。
STM32F103ZET6 数据存储 SD卡 FatFS 相关文章:
- 基于LabVIEW的STM32调试平台设计(11-17)
- 基于stm32f103zet6的内存管理的学习(12-01)
- 基于AVR单片机的服装压力检测系统设计(05-03)
- 触摸式电磁炉整体方案,有详细的硬件原理和器件选型(09-22)
- SAR高速海量数据存储与回放系统设计(06-05)
- 基于FPGA控制的IDE磁盘阵列设计(06-05)