STM32与eMMC通信的存储系统设计
2019-01-17,,,
,,,
(1.中北大学 信息与通信工程学院,太原 030051;2.北京航空航天大学;3.北京镭航世纪科技有限公司)
引 言
在目前的存储系统中,存储介质扮演着非常重要的角色,如固态硬盘SSD、NAND Flash、eMMC等。这些存储介质各具特色:SSD具有写入速度快、功耗低、读取延迟小等优势,但其封装体积较大;NAND Flash芯片具有存储容量大、价格便宜等优点,但存在兼容性差、操作复杂度高、需要过多关注坏块管理、损耗均衡以及误码率等一些固有的缺陷[1]。在充分考虑存储芯片的封装体积、容量、带宽要求等参数后,本系统选用eMMC作为存储设备。eMMC是一种内嵌式存储芯片,具有接口简单、存储容量大、传输速度快和集成度高等优点[2],eMMC将NAND Flash和主控芯片封装成一个微型的BGA芯片,内部集成Flash控制器,主要包括ECC纠错机制、平均擦写存储区块技术、坏区管理、掉电保护等控制技术。
为了满足存储系统快速启动、紧急掉电数据保护、便捷导出等设计要求,本系统采用STM32F7作为控制器,使用SDIO接口挂载eMMC,并通过高速USB接口将其实现为USB大容量存储设备,计算机可通过USB接口直接对记录文件进行导出操作。记录文件通过自己建立的文件系统进行初始化,记录过程中数据直接由eMMC读写驱动写入文件数据区。这样存储系统可以在不进行USB大容量存储设备枚举的情况下实现快速启动进行数据记录,并且在紧急掉电情况下记录文件不会受到损坏,同时数据仍然可以通过USB对大容量存储设备的访问实现导出。
1 系统硬件设计
系统选用由意法半导体公司生产的采用Cortex-M7内核的STM32系列32位处理器STM32F7,该处理器性能优异、功耗超低、集成度高,搭配SDIO控制接口,提供高速USB接口,并内置高速USB PHY,极大地简化了外围电路设计。选用镁光公司的MTFC64GAKAEEY-4M IT作为存储芯片,存储容量为64 GB,可支持的最大时钟频率为52 MHz,SDR模式下连续写数据能力最大可达40 MB/s,连续读数据能力最大可达90 MB/s[4]。
图1 系统总体框图
存储系统主要由STM32控制模块、eMMC存储模块和电源模块三部分组成。系统总体框图如图1所示。
其中,控制模块通过SDIO接口与eMMC进行通信,SDIO接口包括时钟信号CLK、命令信号CMD和4位数据线DAT0~DAT3[5]。
2 eMMC驱动设计
图2 多块读过程时序
数据记录和文件系统的实现均以存储设备的底层驱动为基础,本系统存储设备为eMMC,其底层驱动主要包括eMMC初始化,eMMC的读、写等。
2.1 eMMC初始化
设备的初始化过程为:eMMC收到软件复位命令CMD0或者进行硬件复位后,就切换到Idle状态,STM32首先发送CMD1命令来获取eMMC的工作条件;然后通过发送广播命令CMD2,eMMC向STM32回应其独一无二的设备识别号;完成识别之后,eMMC切换到Identification状态;接着STM32发送CMD3命令为eMMC分配唯一的相对地址,用于数据传输模式下对eMMC进行寻址选定,eMMC只要收到相对地址RCA,其状态就切换到Stand-by,eMMC初始化完成。
2.2 eMMC读/写驱动操作
eMMC和STM32之间的数据传输是通过DAT数据线进行的,本系统数据宽度为4位,数据读写过程在SDR模式下进行。
2.2.1 读驱动
数据读过程包括单块读和多块读两种类型,本系统采用多块读方式。多块读过程包括两种形式:一种形式是通过CMD18命令预先指定读取的块数,所有数据块读取结束之后自动返回到数据传输状态;另外一种形式是开放式读取,不设定读取块数,设备会持续发出数据直到收到主机的停止传输命令,本文采用第一种方式。本系统设定连续读数据长度为32块。
多块读流程为:STM32首先发送CMD16命令设置单块的长度为512字节,设置结束后,发送eMMC芯片多块读命令CMD18,包含读起始地址参数,并指定连续读数据长度为32块。多块读只需发送一次CMD18命令,每读取一块,读取块数就加1,数据线间隔NAC个时钟周期之后接着读取下一块数据,直至读取到第32块,多块读结束[6]。多块读过程时序如图2所示。
2.2.2 写驱动
数据写过程包括单块写和多块写两种类型,本系统采用多块写方式。多块写分为两种方式,一种是设置预定块数的写入,另一种是开放式流写入,本系统采用第一种方式[5],设定连续写数据长度为32块。
多块写流程为:STM32首先发送CMD16命令设置单块长度为512字节,设置结束后,发送多块写命令CMD25,包含起始扇区地址,并指定连续写数据长度为32块。待eMMC芯片收到响应后,就可以进行写操作,一旦CMD25响应错误或超时,则需要再次发送。当设定为写入块数方式时,命令结束NWR个时钟周期之后则开始写入数据。每一块后面都会进行CRC校验,以确保写入数据正确[7]。每正确写入一块,写入块数就加1,直至写数据到第32块时,数据将开始编程写入Flash阵列。多块写过程时序如图3所示。
图3 多块写过程时序
3 FAT32文件系统设计
为了有效管理eMMC写入的数据,使记录数据能够以文件形式被访问和导出,必须将eMMC中的数据以文件形式存储,需要在eMMC中创建常用的可以被Windows系统访问的文件系统。本设计中采用FAT32文件系统。
3.1 FAT32文件系统简介
FAT32文件系统是Windows98操作系统为改善磁盘管理而推出的一项新的文件管理系统。FAT32文件系统实际上就是用32位数据来描述磁盘簇分配[8]。FAT32分区的数据结构由MBR、DBR、保留扇区、FAT表和目录及数据区5部分组成。FAT32文件系统的结构特点如下:
① MBR即主引导扇区,位于整个硬盘的0 磁道0 柱面1 扇区,包括硬盘主引导记录MBR和分区表DPT两部分,主要用于检查分区表是否正确并确定引导分区的地址,同时便于在程序结束时把引导分区的启动程序调入内存加以执行。
② DBR即操作系统引导扇区。一般占用512字节,该扇区由跳转指令、操作系统名称和版本号、BPB区、扩展BPB区、结束标志和DOS引导程序区组成。其中BPB记录本分区的每簇扇区数、每扇区字节数、FAT表数、FAT表扇区数及根目录簇号等重要参数。表1为FAT32文件系统的DBR数据结构。
表1 FAT32文件系统的DBR数据结构
③ 保留扇区位于FAT32文件系统起始部分,由若干个扇区组成,该扇区的大小记录在DBR扇区中。
④ FAT表的含义是文件分配表,该区是FAT32文件系统管理磁盘空间和文件的最重要区域。它通过位示图法来保存逻辑盘数据区各簇使用情况信息。文件所占用的存储空间及空闲空间的管理都是通过它来实现的。FAT32一般包含两份FAT,FAT1是第一份,即主FAT,位于逻辑32扇区。在FAT表中,每簇占用4字节,其中开头的8字节用来存放该盘介质类型编号。如果某个文件占用很多簇,则第一个FAT项用于记录下一个FAT项簇号,如果这个文件结束了,则用“0FFF FFFF”表示。
⑤ 目录及数据区主要由根目录、子目录和文件内容三个部分组成[11]。在存储时以簇为单位,其中2号簇被分配给根目录使用。每个目录项占用32个字节,可以是长文件名目录项、文件目录项、子目录项等。本系统使用短文件名。
3.2 本文件系统设计
本系统在eMMC上移植FAT32文件系统。系统上电后,计算机通过高速USB接口将eMMC识别为一个USB大容量存储设备,因而不需要进行分区。系统数据带宽为5 MB/s,存储时间为3 min,则单个文件占用的最大存储容量为900 MB,本系统设定的单个文件固定大小为2 000 MB。设定FAT32文件系统的DBR参数如下:每扇区字节数为512、每个簇占用32个扇区、保留扇区数为32、FAT表数为1、每个FAT表所用扇区数为28 225、根目录第1簇的簇号为2,计算出单个文件占用128 000个簇,系统文件使用短文件名。
4 测 试
4.1 文件系统
系统上电后,计算机可将eMMC识别为一个USB大容量存储设备,可用容量为55.1 GB,计算机识别eMMC如图4所示。
图4 计算机识别eMMC
打开USB设备,可以看到设备内存在两个文件DATA_001和DATA_002,并且每个文件大小为2 048 000 KB,即2 000 MB,与系统设定的文件大小一致,文件内容如图5所示。
图5 文件内容
用WinHex打开USB设备,可以看到文件系统结构如图6所示。
图6 文件系统结构
使用WinHex打开启动扇区,FAT32文件系统的引导扇区DBR数据如图7所示。
图7 引导扇区DBR
可以看到每扇区字节数为512、每个簇为32扇区、保留扇区数为32、FAT表数为1即FAT1、每个FAT的扇区数为28 225、根目录起始簇号是2,与设定的参数一致。
4.2 存 储
(1)根目录起始偏移地址定位
根目录起始扇区=保留扇区数+FAT×1+(起始簇-2)×每簇的扇区数,由引导扇区DBR中可知根目录起始簇号为2,所以求得根目录起始扇区为32+28 225+(2-2)×32=28 257,则FAT表所在的起始偏移位置为DCC200。DCC200处的内容如图8所示,可以看到根目录起始扇区与图6显示一致。
图8 根目录起始偏移地址
(2)第一个文件位置的定位
将系统的多路串口数据以数据流形式写入数据区。第一个文件开始扇区=根目录开始扇区+(簇编号-2)×每簇的扇区数,第一个文件簇编号为128,则第一个文件扇区为28 257+(128-2)×32=32 289,则第一个文件所在的起始偏移位置为FC400,第一个文件数据如图9所示,可以看出第一个文件扇区地址与图6显示的一致,且数据为连续数据流。
图9 第一个文件数据
4.3 数据导出
系统记录的数据是直接通过eMMC写驱动写入记录文件数据区,可以通过USB直接复制记录文件实现数据导出。复制文件DATA_001到计算机桌面,数据导出过程如图10所示。
图10 数据导出过程