1. 为什么你的STM32项目需要一个文件系统?
如果你正在用STM32做数据采集、设备日志或者参数存储,是不是经常遇到这样的烦恼:数据存到SD卡里,在电脑上却读不出来,或者文件乱码?又或者,想更新一个配置文件,结果把整个存储区都搞乱了?这些问题,我当年做第一个气象站项目时,几乎全踩了一遍。后来我发现,问题的根源在于,我们直接操作SD卡的扇区,就像在操场上直接往地上扔砖头,虽然砖头(数据)放上去了,但别人根本不知道哪块砖是墙,哪块砖是路。
这时候,FatFs文件系统就是你的“施工图纸”和“仓库管理员”。它是一个专为小型嵌入式系统设计的、完全开源的FAT/exFAT文件系统模块。简单说,它让你的STM32也能像电脑一样,用“打开文件”、“写入数据”、“创建文件夹”这种高级命令来管理SD卡,而不是直接跟底层扇区打交道。
FatFs最大的好处是平台无关性。它用纯ANSI C写成,和你用的STM32型号、是HAL库还是标准库,都没关系。你只需要提供一个连接FatFs和SD卡硬件的“桥梁”——也就是我们常说的磁盘I/O驱动层。一旦搭好这个桥,你的代码就可以在各种存储介质(SD卡、NAND Flash、甚至RAM磁盘)上无缝切换,可移植性极强。
想象一下这个场景:你的设备在野外记录传感器数据。没有文件系统,你可能需要自己设计一套复杂的索引来管理每天的数据文件,防止覆盖。而用了FatFs,你只需要几行代码:f_open(&file, “20240515_log.csv”, FA_WRITE | FA_CREATE_ALWAYS),就能创建一个以日期命名的文件,后续的f_printf、f_puts就像在电脑上编程一样直观。数据可以直接用Excel打开分析,调试和维护成本直线下降。
所以,如果你的项目涉及:
- 数据记录:比如温度、压力、GPS轨迹的定期存储。
- 配置管理:保存设备参数,允许用户通过更换SD卡来更新配置。
- 固件升级:从SD卡读取新的固件文件进行IAP升级。
- 多媒体存储:存储图片、音频等资源文件。
那么,基于SPI接口和FatFs的方案,绝对是性价比最高、最稳妥的选择。它不挑MCU(哪怕是没有SDIO接口的入门款STM32F103),硬件连接简单,软件生态成熟,是嵌入式工程师必须掌握的“生存技能”之一。
2. 硬件连接:别在第一步就“翻车”
硬件连接是实打实的第一步,这里错了,后面代码调得再漂亮也是白搭。我用STM32F103C8T6(也就是大名鼎鼎的“蓝莓派”或“最小系统板”)和最常见的MicroSD卡模块为例,这套组合堪称经典,成本低,资料多。
核心就四根线:SPI的时钟SCK、主机输出从机输入MOSI、主机输入从机输出MISO,以及一个我们自己控制的片选CS。这里有个新手极易掉进去的坑:SPI模式。SD卡在SPI模式下,固定使用模式0(CPOL=0, CPHA=0) 或模式3(CPOL=1, CPHA=1)。根据SD卡规范,上电初始化的部分命令需要在模式0下进行。为了省事和最高的兼容性,我们通常将SPI外设配置为模式0。在CubeMX里配置SPI时,千万别选错了。
电压匹配是另一个隐形杀手。绝大多数MicroSD卡模块都自带3.3V稳压芯片(比如AMS1117-3.3),所以模块的VCC引脚接5V和3.3V都可以,它会自己稳压输出3.3V给SD卡。但是!你的STM32的IO口电平必须是3.3V。STM32F103的IO口虽然标称容忍5V,但为了稳定和保险,强烈建议整个系统共用一个3.3V电源。如果STM32用3.3V供电,SD卡模块的VCC也接3.3V,这样最稳妥,电平完全匹配,不会因为电压差导致通信失败甚至损坏芯片。
具体连接关系,我习惯用表格列出来,一目了然:
| SD卡模块引脚 | STM32F103C8T6引脚 | 功能说明 |
|---|---|---|
| CS (片选) | PA4 (或其他任意GPIO) | 关键! 必须用普通GPIO手动控制,不能复用为SPI的NSS。 |
| SCK (时钟) | PA5 (SPI1_SCK) | SPI时钟线,由主机(STM32)产生。 |
| MOSI (主机出) | PA7 (SPI1_MOSI) | 主机发送,从机接收。注意模块上可能标“DI”(Data In)。 |
| MISO (主机入) | PA6 (SPI1_MISO) | 主机接收,从机发送。注意模块上可能标“DO”(Data Out)。 |


1万+

被折叠的 条评论
为什么被折叠?



