主页   电子元器件  存储器

五月 14 2020

基于FatFs文件系统的SD卡存储器设计


目录

1.硬件设计

2.软件设计

2.1SD卡通信函数

2.2RTC时钟函数

2.3FatFs的移植

3.系统测试及结果
结束语

  近年来,以Flash为存储体的SD卡因其具备体积小、功耗低、可擦写以及非易失性等特点而被广泛应用于消费类电子产品中。在SD卡存储器的设计中,利用文件系统对存储媒介进行管理已成为嵌入式系统的一个发展方向,因此需要一种可靠的文件系统,本文提出了一种基于FatFs文件系统的SD卡存储器设计,采用了开源文件系统FatFsR0.07C。FatFs是一种免费开源的FAT文件系统模块,专门为嵌入式系统而设计。它完全用标准C语言编写,具有良好的硬件平台独立性,经过简单的修改就可以移植到多种嵌入式处理器上。系统以ST公司的STM32F103R为核心,通过SPI总线与SD卡进行通信,实现了数据的便携式存储。给出了系统的硬件结构图,详细探讨了SD卡驱动程序以及FatFs移植方面的软件设计。

  1.硬件设计

  SD卡具有两种通信模式:SD模式和SPI模式。由于多数嵌入式处理器都配有SPI接口,因此相对于SD模式,SPI模式应用的更广泛一些。本设计采用STM32F103R对SD卡进行控制,STM32F103R是ST公司的一款基于ARMCoutex.M3的微控制器,该控制器片内设备丰富,处理速度快,性能稳定,其与SD卡的接口电路图如图1所示。

STM32F103R与SD卡的接口电路图

  图1 STM32F103R与SD卡的接口电路图

  2.软件设计

  本系统的软件设计是基于FatFs文件系统的。FatFs具有非常清晰的层次结构,如图2所示。最顶层是应用层,这一层为用户提供了一系列API函数,如f_open、f_close、f_read、f_write等,用户即使不理解Fat协议,也可以利用API函数轻松地读/写文件。中间层FatFsModule完整地实现了Fat协议,用户无需对此进行任何修改。最底层是用户在移植过程需要处理的接口,包括存储媒介读/写接口DisklO和文件创建修改时间时所需的实时时钟,用户根据具体的硬件编写程序,填充相关函数,即可使FatFs文件系统应用在具体的嵌入式平台设备上。

FatFs结构图

  图2 FatFs结构图

  根据层次式软件设计的思想,将软件设计工作分为3步:编写SD卡的通信函数、编写RTC时钟函数和FatFs的移植。

  2.1SD卡通信函数

  将SD卡通信函数分为3层,如图3所示。

SD卡通信结构软件结构图

  图3 SD卡通信结构软件结构图

  (1)SPI接口函数

  SPI接口函数是与处理器相关的代码,这里的处理器是STM32F103R,主要包含SPI模式的配置以及SPI单字节的读写函数。

  (2)SD卡底层接口函数

  SD卡底层接口函数主要包含SD卡写命令和读数据等函数,按照标准的时序调用SPI接口函数即可。

  (3)SD卡高级接口函数

  SD卡高级函数依据SD卡通信协议V2.0编写,需要SPI接口函数以及SD卡底层接口函数的支持。这部分主要是SD卡的初始化函数和扇区读/写函数,此外还有一些用来读SD卡信息(厂商,容量,速度等)的函数。初始化工作是SD卡驱动程序编写的一个难点,这里给出详细的流程图(如图4所示),扇区读/写函数结构图如图5和图6所示。

SD卡初始化软件流程图

  图4 SD卡初始化软件流程图

SD卡读扇区结构图

  图5 SD卡读扇区结构图

SD卡写扇区结构图

  图6 SD卡写扇区结构图

  2.2RTC时钟函数

  STM32F103R内含RTC设备,利用这个设备可以轻松地实现实时时钟功能,从而为文件系统提供准确的时间。相关的软件工作就是RTC的设置以及日历系统的实现。

  2.3FatFs的移植

  完成了上面的基础工作后,就可以开始进行FatFs的移植,具体的移植工作有2步:编写FatFs接El函数和FatFs的设置。

  (1)FatFs的接口函数

  这项工作就是编写disk.C中的6个函数。

  DSTATUS disk_initialize(BYTE Drive):存储介质初始化函数。本设计中就是SD卡的初始化函数。Drive是存储介质号码,本设计只需支持SD卡一个存储介质,因此Drive设为0即可。

  DSTATUS disk_status(BYTE Drive):存储介质状态检测函数。检测是否支持当前的存储介质。事实上只要Drive为0,系统就默认为支持,函数执行无误返回0。

  DRESUT disk_read(BYTE Drvive,BYTE*Buf,DWORD SectorNumber,BYTE Sector Count):读扇区函数。在SD卡SPI接口函数的基础上编写,Drive设为0,*Buf指向存储的数据,SectorNumber是读的起始扇区,SectorCount是需要读的扇区数目。函数执行无误返回0,错误返回非0。

  DRESULJTdisk_write(BYTE Drvive,BYTE*Buff,DWORD SectorNumber,BYTE Sector Count):写扇区函数。在SD卡SPI接口函数的基础上编写,Drive设为0,*Buf指向写入的数据,SectorNumber是写的起始扇区,SectorCount是需要写的扇区数目。函数执行无误返回0,错误返回非0。

  DRESULT disk_ioctl(BYTE Drive,BYTECommand,Void*Buf):存储介质控制函数。Command是控制命令,Buf指向存储或接收的控制数据(命令参数)。可以在此函数里编写自己需要的功能代码,比如获取存储介质的容量、检测存储介质的相关信息等。如果是简单的应用,也可以不编写,函数直接返回0即可。

  DWORD get_fattime(Void):实时时钟函数。需要RTC函数的支持。返回一个32位无符号整数,时钟信息包含在这32位中,如图7所示。

时钟位

  图7 时钟位

  (2)FatFs的配置

  通过FatFs的配置,可以根据需要对代码进行裁剪,以获取最适合的代码,该工作主要是在fconf.h中完成的。FatFs的配置可以分为4类,如图8所示。

FatFs配置结构图

  图8 FatFs配置结构图

  Function and Buffer:对FatFs进行功能性的裁剪,有6个选项。

  #define_FS_TINY(0或者1)。设置为1的时候,FatFs在进行数据传输时使用文件系统自建的缓存,这样可以减少内存的占用率。

  #define_FS_READONLY(0或者1)。设置为1的时候文件为只读,编译时移除与写入相关的函数。其余的4个选项都是对代码进行裁剪的。

  Locale and Namespace:对文件所支持的语言,有5个选项。

  #define_CODE_PAGE。有多个取值,取不同的值可以支持不同的语言。例如,取936就支持简体中文,取437就支持美式英语。这里取1,支持ASCII,此时不需要对此类中其余的选项进行配置。

  Physical Drive:与实际物理磁盘相关的配置,有3个选项。

  #define_DRIVES。物理磁盘的数量,设为1。

  #define_MAX_SS。扇区大小,在使用Memory Card时必须设为512。

  #define_MULTI_PARTITION。分区数量,设为0。

  System:文件系统的配置,有3个选项。

  #define_WORD_ACCESS。字写入方法的配置,推荐设置为1以获得较好的性能。

  但是当处理器使用大端模式或设为1时,系统运行不正确时,应设为0。

  #define_FS_REENTRANT。Reentrancy的使能,设为0时剩下的两个函数(_FS_TIMEOUT,_SYSNC_t)失效。这里设为0。

  3.系统测试及结果

  在测试中STM32F103R采用12MHz的晶振,设置SPI时钟为6MHz,分别对2GB的micro SD(Kingston)和4GB的SDHC(Transcend)的卡进行读写。通过对一定容量(200KB和10MB)的文件读写时间来计算读写速度,测试结果如表1所示。

SD卡读写测试

  从测试结果上可以看出,读写速度令人满意,若采用更快的SPI时钟,读写速度可以进一步提高,完全可以适应嵌入式系统的需求。

  结束语

  本文总结了基于FatFs文件系统的SD卡存储器设计方案,该存储器读写速度快,可靠性强,设计流程简单,为嵌入式数据的存储提供了一种较好的方法。

订购与质量

图片 产品型号 品牌 描述 数量 价格
(USD)
LM311 LM311 Company:Texas Instruments Remark:LM311电压比较器设计运行在更宽的电源电压:从标准的±15V运算放大器到单5V电源用于逻辑集成电路。其输出兼容RTL,DTL和TTL以MOS电路。此外,他们可以驱动继电器,开关电压高达50V,电流高达50mA。 In Stock:1000
Buy
Price:call Buy
LM339 LM339 Company:Texas Instruments Remark:LM339(四路差动比较器)是在电压比较器芯片内部装有四个独立的电压比较器,是一种常见的集成电路,主要应用于高压数字逻辑门电路。利用lm339可以方便的组成各种电压比较器电路和振荡器电路。 In Stock:2000
Buy
Price:call Buy
LM324 LM324 Company:Texas Instruments Remark:LM324系列器件带有真差动输入的四运算放大器。与单电源应用场合的标准运算放大器相比,它们有一些显著优点。该四放大器可以工作在低到3.0伏或者高到32伏的电源下,静态电流为MC1741的静态电流的五分之一。 In Stock:300
Buy
Price:call Buy
LM358 LM358 Company:Texas Instruments Remark:LM358内部包括有两个独立的、高增益、内部频率补偿的双运算放大器,适合于电源电压范围很宽的单电源使用,也适用于双电源工作模式,在推荐的工作条件下,电源电流与 电源电压无关。 In Stock:3000
Buy
Price:call Buy
LM567 LM567 Company:Texas Instruments Remark:LM567是一种常见的低价解码集成电路,其内部包含了两个鉴相器、放大器、电压控制振荡器VCO等部件。 In Stock:500
Buy
Price:call Buy

相关文章

  • 基于SystemC的存储器模型设计 ...
    建立芯片模型是在早期进行芯片架构决策的有效方法,通过建模不仅可以对芯片的性能做出分析,还可以在硬件没有完成之前开发软件,不仅提高了产品成功率,而且缩短了研发周期。设计人员早期采用C...
  • 随机存储器的特点与结构 ...
    早期的计算机使用继电器、机械计数器或延迟线来实现主存储器功能。超声波延迟线是串行设备,只能按写入顺序复制数据。鼓内存可以以相对较低的成本扩展,但有效检索内存项需要了解鼓的物理布局以...
  • 如何选择存储器? ...
    众所周知,存储器是现代信息技术中用于保存信息的记忆设备,有了存储器,计算机才有记忆功能,才能保证正常工作。计算机中的存储器按用途存储器可分为主存储器(内存)和辅助存储器(外存),也...
  • 虚拟存储器的实现方法 ...
    虚拟存储器机制与高速缓存Cache机制很类似,高速缓存Cache是缓存了内存中的数据,虚拟存储器是在内存中缓存了磁盘的数据。如果虚拟存储器中数据不存在,那么需要从磁盘上读取数据,然...
  • 铁电存储器的结构特点 ...
    铁电存储器是新兴的非易失性存储器,它的起步比较早,率先实现了产业化,由于其具有功耗小、读写速度快、抗辐照能力强的优点,在一些需要快速存取、低功耗和抗辐照的小规模存储领域有市场。但受...
  • 存储器与寄存器的区别 ...
    什么是寄存器?寄存器就是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。实际上寄存器就是一种常用的时序逻辑电路,但这种时序逻辑电路只包含存储电路。因...

0 条评论

留言

您的邮箱地址不会被公布

 
 
   
评分: