大容量数据存储方案——SD卡与FATFS文件系统
引言:全场景存储方案表一、SD卡的定义和用途二、SD卡的特点(一)基本单位:扇区(也叫数据块)(二)两种接口类型1.SPI(可连接任意低速外设)2.SDIO(电赛推荐,专为储存设备做的,但使用难度相对大)3.附1:嵌入式领域7大串行接口附2:为什么“节省线”这么重要?
三、扇区级读写(一般不使用)四、FATFS文件系统原理及移植(一)FATFS文件级系统的定义及储存原理(二)移植1.1 CubeMX配置1.2下载 STN32Cube_FW_G0_V1.6.0 安装包
引言:全场景存储方案表
存储:将数据持久化保存在某种介质中,确保断电后不丢失,需要时可读取 存储特性:持久性、可寻址、读写速度、容量、寿命
半导体存储(芯片级)
类型代表方案原理特点DRAM(动态随机存储器)电脑内存条电容存储电荷(需定时刷新)速度快、掉电丢失SRAM(静态随机存储器)CPU缓存触发器锁存数据极快、功耗高Flash(闪存,芯片自带存储空间)U盘/SSD浮栅晶体管捕获电子掉电不丢、擦写慢EEPROM(小容量电可擦存储器)设备配置芯片Fowler-Nordheim隧穿效应可单字节修改、寿命长
不同数据规模的存储方案不同,需根据数据量级和访问需求选择更经济高效的存储介质
存储方案容量范围接口/协议核心优势典型应用场景适用规模嵌入式贴片存储贴片式 TF 卡128MB~32GBSDIO/SPI超小体积(6×8mm),抗震性强,成本低智能穿戴、工业传感器单设备eMMC8GB~1TB+eMMC 5.1/UFS 3.1高随机读写(数万IOPS),支持ECC纠错工业平板、车载导航中型设备工规级存储芯片SPI NOR Flash32Mb~128MbSPI/QSPI120MHz高速读取,10万次擦写,-40℃~85℃宽温车载系统启动代码、工控固件单设备LPDDR4X2GB~8GBLPDDR4X 4266Mbps低功耗(0.6V),抗震动,工业级寿命工业自动化、轨道交通控制子系统本地化存储系统外挂 SPI Flash1MB~128MBSPI直接地址读写,无需文件系统字库存储、设备日志单设备外挂 EEPROM1KB~512KBI²C单字节修改,100万次擦写寿命计数器、用户配置参数单设备SD卡+FatFs100MB~32GBSDIO/SPI支持热插拔,文件管理便捷数据记录仪、便携医疗设备中型设备企业级存储方案群晖/QNAP NAS50TB~500TB+10GbE/25GbERAID6冗余,SSD缓存加速,快照保护企业文件共享、视频编辑协作企业级光纤SAN (如SV6800)百TB~PB级8Gb/16Gb FC百万IOPS,5个9可用性,在线扩容金融核心数据库、4K视频制作数据中心海量数据处理架构Hadoop HDFSPB~EB级分布式节点3备份容错,支持超大规模数据分片存储互联网大数据分析、AI训练超大规模HTAP混合存储数十PB+Multi-Raft/AFSOLTP+OLAP分离,Serverless弹性资源实时分析+事务处理(如搜索推荐)云计算科研级备份方案3PB~6.8PB16Gb FCNVMe+SAS SSD混合,冗余控制器长期科研数据归档、高可靠备份研究机构5
一、SD卡的定义和用途
常说的“内存卡”,是一种常见小型可反复擦写数据的“电子存储芯片”,通常封装在一个塑料外壳里,常用于数码相机、智能手机、笔记本电脑、无人机等便携式电子设备里,作为主要的存储介质或用来扩展存储 *
如果是购买储存卡,关注这三个信息即可 接口类型: 电赛选型:
主控STM32F4 → 选I型卡(II型卡不兼容)主控STM32H7 → 选II型卡(发挥UHS-I性能)
存储容量 写入速度
接口类型协议版本总线引脚理论速度STM32兼容性ISD 3.0及以下CLK/CMD/DAT0~3≤104MB/s所有型号支持(含F1/F4)IISD 3.0+ UHS新增DAT1/DAT2复用以提速≤312MB/s仅F7/H7等高端系列支持
高性价比方案(预算<50元)
型号接口类型速度等级最低写入保障适用场景三星EVO PlusIU3/V30无公开数据通用数据记录闪迪UltraIU1/C10无公开数据低频日志存储(≤10Hz)
工业级稳定方案(预算>100元)
型号接口类型速度等级最低写入保障核心优势金士顿IndustrialIU3/V30≥15MB/s-40~85℃宽温创见M400IIU3/V30≥20MB/s抗震动+意外断电保护
二、SD卡的特点
体积小:有多种尺寸规格可移动:可在兼容设备之间插拔,转移数据不易丢失:断电后数据不会丢失容量差异大:早期几MB到如今几TB都存在速度等级:不同速度等级影响读写速度接口:通过金属触点与读卡器或设备链接,使用特定通信协议
(一)基本单位:扇区(也叫数据块)
是存储设备在物理或逻辑上被划分为许多固定大小的基本块,是操作系统和存储设备控制器之间进行数据传输的最小单位
传统扇区大小512字节(如果整个存储空间是一本书,那扇区就是其中一页,每页固定512个字),现在更常见的是每扇区4096字节(4K)
(二)两种接口类型
本质是一组物理线路+控制线路的通信规则(相当于与设备对话的语言),操作者通过编程操控电平变化实现数据存取 应用时需要手动把线连接在对应单片机引脚上
1.SPI(可连接任意低速外设)
物理连线
通信规则是串行接口协议(用单根数据线逐位传输数据的通信规则),结构简单(只需四根数据线:CLK、MOSI、MISO、CS)
时钟线CLK(STM32引脚PA5):主机向从机提供数据传输节奏,每个脉冲采样一位数据 片选线CS(STM32引脚PA74):用于选中目标设备进行信息交互 数据线MOSI(STM32引脚PA7):主机向从机单向输入数据 数据线MISO(STM32引脚PA6):从机向从机单向输出数据
这四根线是所SPI通信的基石,再没有精简的可能了
2.SDIO(电赛推荐,专为储存设备做的,但使用难度相对大)
通信规则为半通用接口(6~9线),能控制三类设备:存储卡(SD、eMMC)、IO设备(SDIO WiFi模块)、组合设备(GPS+SD存储)
时钟线CLK(STM32引脚PC12):主机向从机单向提供时钟信号,同SPI但频率更高 命令线CMD(STM32引脚PD2):双向,传输命令(主机到从机)和响应(从机到主机) (CMD是SPI没有的核心线) 默认数据线0 DAT0(STM32引脚PC8):双向,类似于MISO+MOSI合并,单线模式组成双线效果 数据线1 DAT1(STM32引脚PC9):双向,4线模式启用,SPI没有 数据线2 DAT2(STM32引脚PC10):双向,4线模式启用,SPI没有 数据线3 DAT3(STM32引脚PC11):双向,4线模式启用兼作卡检测(CD)类似但强于SPI的CS线 电源线VCC(STM32引脚3.3V,不能接5V):和SPI一样 地线GND(S TM32引脚GND):和SPI一样 卡检测线CD(STM32引脚PC12):从机到主机单向,用于检测卡插入 SPI没有 写保护线WP(STM32引脚PC12):从机到主机,高电平开启,SPI没有 ————————————————————————————————————
核心六线:CLK + CMD + DAT0 + DAT3 + VCC + GND 是最小必需连线DAT1或DAT2:仅当需要高速传输(>10MB/s)时连接CD或WP:非必需,但工业级应用建议连接
3.附1:嵌入式领域7大串行接口
(1) 基础(电赛必用)
接口全称数据线数量典型速度应用场景UART通用异步收发器2(TX/RX)115.2Kbps串口调试、GPS模块I²C内部集成电路2(SCL/SDA)400Kbps-3.4Mbps传感器(BMP280)、EEPROMSPI串行外设接口4(SCK/MOSI/MISO/CS)10-100MbpsSD卡(低速)、OLED屏
(2)高速(工业/视频 用)
接口全称数据线数量典型速度应用场景SDIO安全数字输入输出4-850-312MB/s高速SD卡、4G模块USB通用串行总线4(D+/D-/VBUS/GND)480MB/s(USB2.0)摄像头、HID设备CAN控制器局域网2(CAN_H/CAN_L)1Mbps汽车电子、工业总线MIPI CSI/DSI移动产业处理器接口4-8对差分线2.5Gbps/通道摄像头、显示屏
附2:为什么“节省线”这么重要?
PCB成本:每少2根线,板层可减1层(4层→2层 省$30)抗干扰:线数减少50%,信号串扰降低70%功耗优化:每根IO口驱动电流约3mA,少4根线省12mA,是电池设备的关键连接器空间:6针简易座相比40针排座,尺寸差5倍,省空间
三、扇区级读写(一般不使用)
绕过文件系统,通过簇(对扇区的集合)直接调用扇区储存的原始数据,进行某扇区某字节数据的读取和存储; 即使只修改一个字节,也必须读取整个扇区到内存再修改目标字节,再将整个扇区写回内存卡
适用场景:文件系统损坏、创建存储设备副本、测试存储设备性能、低级开发劣势:危险系数高,直接写入错误的扇区会瞬间对文件系统或用户数据产生不可逆的破坏
四、FATFS文件系统原理及移植
具体项目中,我们可以将其移植到MCU上,并结合RTOS,从而直接像在Windows那样用相应的文件读写接口open/write/read函数来读写SD卡的文件
RTOS是专为实时响应设计的操作系统核心,其核心特征是 确定性任务调度(确保高优先级任务严格按时完成)
(一)FATFS文件级系统的定义及储存原理
FAT文件系统起源于1980年左右,最先被MS-DOS(电脑前身)应用,起初是为一个简单的文件系统开发的,适用于小于500K字节的软盘,在发展过程中,先后经历了FAT12(如容量较小的软盘——薄而柔软的圆形磁性薄膜片)、FAT16、FAT32、EXFAT文件系统的发展,区别在于它们对磁盘分区大小和文件大小的支持不同
本质是软件模块,可用于对存储设备上的文件系统区域访问,广泛用于嵌入式系统和嵌入式设备将整个存储区域划分为若干部分——簇,分别用于放置不同信息,每个簇包含相同数量的扇区;而簇以链表的形式存储
相比扇区级操作,操作者只需要决定保存某个文件,操作系统便负责决定把这个文件内容储存在那些簇
保留区:
包括首扇区(DBR):由BPB(文件系统关键参数)+引导代码 组成包括后续扇区:由FSInfo扇区(记录空闲簇数量)+备份首扇区 组成
Fat表:
记录文件占用了哪些簇(空闲簇0x00000000、坏簇0x0FFFFFF7)、簇之间的链接关系记录链表的链接关系(每随着链表找到一个簇的数据,就标明该链表储存的下一个簇是哪个,相当于一个路标)数量由BPB定义,通常由两个FAT表互为备份
数据区:
结构分层:目录项解析:目录本质上也是一个文件,存储着其自己的数据(比如目录下有哪些文件)
存储某个文件时,FAT表检索空闲簇,将文件逐步储存于空闲簇里,不要求连续性,若遇到下一个簇储存其他文件被占用的情况,则继续往后寻找,直到找到空闲簇便继续存储。整体存储方式像一条链子,故被称为链表储存形式
(二)移植
1.1 CubeMX配置
在CubeMXz中配置后生成代码,在Keil中编译 当SD卡、时钟线、数据线的布线不够简洁或干扰严重时,高频信号会失真,导致SD卡通信失败,因此把时钟频率降下到32MHz,通过降低SPI波特率补偿信号质量差的问题,这是新手常见解决方案。 用的RBT3单片机
分隔
分隔
成功后打开,复制系统时钟,等下覆盖掉原本的时钟
1.2下载 STN32Cube_FW_G0_V1.6.0 安装包
ST社区(包括STM32相关372个产品等等) https://community.st.com/?ecmp=tt31630_gl_enews_mar2023&mkt_tok=ODU2LVBWUC03MTUAAAGbfR3yAoQJm4Vp02l6p12LpSS6wd2GaXDnW1t8Xm7timehPkr0PIGEXa_Vbs9CtKuYCniWGgrB8RZdlg_XgPsoP0L2Usf0Mq1EHj2kHCHkTqYWvAYt4Q
STM32CubeG0下载 https://www.st.com.cn/zh/embedded-software/stm32cube-mcu-mpu-packages/products.html 下载完,打开文件夹,依次打开文件 Projects–> NUCLEO-G071RB–> Applications–> FatFs --> MDK-ARM --> Keil
打开,找到main.c中的void SystemClock_Config(void)时钟设置,改成刚刚复制的
烧录
把SD卡从电脑上拔出插进读卡器,若读卡器中若多出刚刚的STM32.hex文件则证明运行成功。