目录
一、核心概念先理清(初学者必看,避免术语混淆)
1. SDMMC 是什么?
2. TF 卡与 SDMMC 的匹配性
3. SDMMC 的两种数据线模式(初学者优先 4 位)
4. 关键前提:TF 卡的最小读写单位
二、STM32H743Z SDMMC 接口核心原理
1. STM32H743Z 的 SDMMC 外设特性(针对初学者,只讲关键)
2. SDMMC 通信的核心引脚功能
3. 可选辅助引脚(初学者可先不接,简化电路)
4. 核心通信逻辑(极简版)
三、STM32H743Z + TF 卡 硬件连接(4 位模式,初学者标准版)
1. 核心硬件准备
2. SDMMC1 引脚定义(STM32H743ZI 208 引脚,固定不可改)
3. 硬件连接示意图(初学者直观版)
4. 硬件关键注意事项(避坑核心,初学者必须遵守)
四、软件实现(HAL 库 + FatFS,初学者零基础版)
前置准备
步骤 1:STM32CubeMX 配置(自动生成初始化代码,零基础)
1. 芯片选择:STM32H743ZIT6(208 引脚,Z 结尾);
2. 时钟配置(H7 核心,必须正确)
3. SDMMC1 配置
4. GPIO 配置
5. 生成代码
步骤 2:FatFS 文件系统移植(极简版,CubeMX 集成)
步骤 3:核心代码实现(文件读写,零基础可直接复制)
关键代码解释(初学者重点理解)
步骤 4:测试验证
五、典型应用场景(结合 STM32H743Z 的高性能优势)
1. 工业 / 物联网大数据日志存储(最常用)
2. Bootloader 固件升级(嵌入式必备)
3. 多媒体数据存储与播放(H7 高性能专属)
4. 离线数据缓存与批量上传
5. 配置文件存储(简化项目开发)
六、初学者常见坑与避坑技巧(核心,避免踩雷)
坑 1:TF 卡初始化失败 / 挂载失败(90% 的初学者遇到)
坑 2:文件写入成功,但电脑端打开内容为空 / 乱码
坑 3:DMA 传输失败,数据读写错误
坑 4:SDMMC 通信不稳定,偶尔读写失败
坑 5:FatFS 不支持中文文件名 / 中文内容
七、初学者进阶方向(从基础到精通)
总结
STM32H743 的SDMMC 外设是传统 SDIO 外设的增强版,完全兼容 SD/MMC/TF(MicroSD)卡,原生支持1 位 / 4 位数据线(TF 卡主流用 4 位)、高速时钟(最高 50MHz,SD 卡 v2.0 标准),且硬件支持 DMA 传输,能大幅降低 CPU 占用,这是 H743 相比 F1/F4 系列 SDIO 的核心优势;同时 TF 卡和 STM32H743 的 IO 均为3.3V 电平,无需任何电平转换芯片,直接连接即可,避免额外硬件成本和引脚损伤。
下面从核心概念→接口原理→硬件连接→HAL 库软件实现→典型应用→初学者避坑六个维度,一步步讲透,所有内容均适配 STM32H743Z。
一、核心概念先理清(初学者必看,避免术语混淆)
1. SDMMC 是什么?
SDMMC 是Secure Digital MultiMediaCard的缩写,是 STM32H7 系列的专用高速外设,专为 SD 卡、MMC 卡、TF 卡设计,替代了传统 F1/F4 的 SDIO 外设,兼容 SDIO 协议,同时增加了对 MMC 卡的完善支持,核心优势是硬件 DMA、更高的时钟频率、更低的 CPU 占用,适合大数据量传输。
2. TF 卡与 SDMMC 的匹配性
TF 卡(MicroSD)是 SD 卡的迷你版,完全兼容 SD v2.0 协议,支持 SDMMC 的1 位 / 4 位数据线模式,是嵌入式中最常用的外置存储(体积小、容量大、性价比高),也是 SDMMC 外设的主要适配对象。
3. SDMMC 的两种数据线模式(初学者优先 4 位)
SDMMC 通信依赖命令线 + 时钟线 + 数据线,数据线支持 1 位 / 4 位配置,4 位模式是 TF 卡的主流用法(速度是 1 位的 4 倍,且硬件连接仅多 2 根线,复杂度低)。
| 模式 | 数据线数量 | 时钟频率(TF 卡) | 传输速度 | 适合场景 |
|---|---|---|---|---|
| 1 位 | D0 | 最高 50MHz | ~12MB/s | 极简引脚、低速率 |
| 4 位 | D0~D3 | 最高 50MHz | ~45MB/s | 主流场景、高速传输 |
4. 关键前提:TF 卡的最小读写单位
和所有 SD/TF 卡一致,扇区(512 字节)是 TF 卡的最小读写单位,所有底层硬件操作(SDMMC)都必须按扇区执行;而 FatFS 文件系统会将扇区抽象为 “文件 / 文件夹”,让我们像操作电脑硬盘一样读写,初学者直接用 FatFS,避开底层扇区管理的复杂问题。
二、STM32H743Z SDMMC 接口核心原理
1. STM32H743Z 的 SDMMC 外设特性(针对初学者,只讲关键)
STM32H743ZI 拥有两个独立的 SDMMC 外设(SDMMC1、SDMMC2),均支持 4 位数据线、DMA 传输、SD v2.0/MMC v4.41,我们以SDMMC1为例讲解(最常用,引脚分布更合理),核心特性:
- 时钟源:由 MCU 的PLCK2提供(H743 的 PLCK2 最高 100MHz,分频后给 SDMMC,最高 50MHz,匹配 TF 卡的高速标准);
- 硬件 DMA:支持 DMA2 控制器,传输数据时无需 CPU 参与,解放核心处理能力;
- 中断 / DMA 双模式:初学者用 DMA 模式更简单,无中断嵌套问题;
- 电压兼容:仅支持 3.3V 卡(TF 卡均为 3.3V,无需 5V 兼容)。
2. SDMMC 通信的核心引脚功能
SDMMC 的通信依赖6 根核心线(4 位模式),所有命令 / 数据传输都由时钟同步,STM32H743 为主机(提供时钟、发送命令),TF 卡为从机(响应命令、传输数据),各引脚功能如下(初学者记牢,避免接错):
| 引脚名称 | 功能说明 | 关键要求 |
|---|---|---|
| SDMMC_CLK | 时钟线,主机提供同步时钟 | 无上下拉,直接连接 |
| SDMMC_CMD | 命令线,双向(主机发命令 / 从机响应) | 必须接 10kΩ 上拉到 3.3V(通信稳定的核心) |
| SDMMC_D0 | 数据线 0,双向 | 必须接 10kΩ 上拉到 3.3V |
| SDMMC_D1 | 数据线 1,双向 | 4 位模式必须接 10kΩ 上拉到 3.3V,1 位模式可悬空 |
| SDMMC_D2 | 数据线 2,双向 | 4 位模式必须接 10kΩ 上拉到 3.3V,1 位模式可悬空 |
| SDMMC_D3 | 数据线 3,双向 | 4 位模式必须接 10kΩ 上拉到 3.3V,1 位模式可悬空(也可做卡检测 CD) |
3. 可选辅助引脚(初学者可先不接,简化电路)
- CD(卡检测):检测 TF 卡是否插入,一般接 TF 卡卡槽的 CD 引脚,到 STM32 的 GPIO(上拉 / 下拉),无卡时高 / 低电平,有卡时翻转;初学者可省,软件通过 SDMMC 初始化结果判断卡是否存在;
- WP(写保护):检测 TF 卡是否开启写保护,接卡槽 WP 引脚到 STM32 GPIO;初学者可省,默认允许读写。
4. 核心通信逻辑(极简版)
- STM32H743 通过 SDMMC 外设向 TF 卡发送初始化命令,配置 TF 卡为 4 位数据线模式、对应时钟频率;
- 初始化成功后,主机发送读写命令(含扇区地址、扇区数量);
- 从机(TF 卡)响应命令后,通过 D0~D3 数据线,在 CLK 时钟同步下,以DMA 方式和主机传输数据(读:TF 卡→STM32;写:STM32→TF 卡);
- 传输完成后,SDMMC 外设产生 DMA 完成中断,CPU 得知传输结束,进行后续处理。
三、STM32H743Z + TF 卡 硬件连接(4 位模式,初学者标准版)
1. 核心硬件准备
- STM32H743ZI 开发板(或核心板);
- 标准 TF 卡卡槽(贴片 / 直插均可,带引脚定义);
- 10kΩ 贴片电阻 ×5(CMD+D0~D3 各 1 个);
- 0.1μF 陶瓷滤波电容 ×1(接 TF 卡 VCC 和 GND 之间,滤除电源噪声);
- 3.3V 电源(由 STM32 开发板提供,给 TF 卡供电)。
2. SDMMC1 引脚定义(STM32H743ZI 208 引脚,固定不可改)
STM32H743Z 的 SDMMC1 引脚是硬件固定的,不能像 SPI 那样随意映射,这是 SDMMC 的特点,必须按芯片手册连接,核心引脚如下(4 位模式):
| STM32H743Z 引脚 | SDMMC1 功能 | 对应 TF 卡卡槽引脚 | 外接器件 |
|---|---|---|---|
| PC12 | SDMMC1_CK | CLK | 无 |
| PD2 | SDMMC1_CMD | CMD | 10kΩ 上拉到 3.3V |
| PC8 | SDMMC1_D0 | D0/DO | 10kΩ 上拉到 3.3V |
| PC9 | SDMMC1_D1 | D1 | 10kΩ 上拉到 3.3V |
| PC10 | SDMMC1_D2 | D2 | 10kΩ 上拉到 3.3V |
| PC11 | SDMMC1_D3 | D3/CS | 10kΩ 上拉到 3.3V |
| 3.3V | 电源 | VCC | 0.1μF 电容到 GND |
| GND | 地 | GND | 无 |
3. 硬件连接示意图(初学者直观版)
plaintext
STM32H743Z 10kΩ上拉→3.3V TF卡卡槽 外设 PC12 ──────────────────────────────→ CLK 时钟 PD2 ────────┬─────────────────────→ CMD 命令 │ PC8 ────────┼─────────────────────→ D0 数据0 │ PC9 ────────┼─────────────────────→ D1 数据1 │ PC10 ────────┼─────────────────────→ D2 数据2 │ PC11 ────────┘─────────────────────→ D3 数据3 3.3V ─────────┬─────────────────────→ VCC 电源 │ 0.1μF电容───────┴─────────────────────→ GND 地 GND ──────────────────────────────→ GND 地4. 硬件关键注意事项(避坑核心,初学者必须遵守)
- 严禁接 5V:TF 卡和 STM32H743 的 IO 均为 3.3V,若给 TF 卡接 5V,会直接烧毁 TF 卡;若 SDMMC 引脚接 5V,会烧毁 STM32 引脚;
- 上拉电阻不可缺:CMD 和 D0~D3 必须接 10kΩ 上拉到 3.3V,无拉电阻会导致通信不稳定、卡初始化失败(初学者最常见硬件问题);
- 电源滤波:TF 卡读写时瞬间电流较大,必须在 VCC 和 GND 之间接 0.1μF 滤波电容,否则电源噪声会导致数据传输错误;
- 走线尽量短:SDMMC 是高速通信,CLK/D0~D3/CMD 的走线尽量短且等长,避免信号衰减(面包板实验可忽略,PCB 设计需注意);
- 共地:STM32 和 TF 卡的 GND 必须可靠连接,否则会出现电平偏移,通信失败。
四、软件实现(HAL 库 + FatFS,初学者零基础版)
STM32H743 的 SDMMC 驱动分两层:底层 SDMMC 硬件驱动(HAL 库)+上层 FatFS 文件系统。
- 底层:由 STM32CubeMX 自动生成 SDMMC+DMA 初始化代码,调用 HAL 库的
HAL_SD_Init()、HAL_SD_ReadBlocks_DMA()、HAL_SD_WriteBlocks_DMA()实现扇区读写; - 上层:移植 FatFS 文件系统,将底层扇区操作抽象为文件操作函数(
f_open()、f_write()、f_read()、f_close()),像操作电脑 TXT/CSV 文件一样读写 TF 卡,初学者直接用上层,无需关注底层扇区。
前置准备
- 安装STM32CubeMX(最新版)和MDK-ARM(Keil5)(支持 H7 系列);
- 新建 STM32H743ZI 项目,配置时钟(核心:PLCK2=100MHz,为 SDMMC 提供时钟源);
- 准备FatFS 源码(官网免费下载,或 CubeMX 直接集成)。
步骤 1:STM32CubeMX 配置(自动生成初始化代码,零基础)
这是最关键的一步,可视化配置,无需手动写寄存器,按以下步骤操作:
1. 芯片选择:STM32H743ZIT6(208 引脚,Z 结尾);
2. 时钟配置(H7 核心,必须正确)
- 系统时钟配置为400MHz(H743 默认最高);
- 配置PLCK2=100MHz(SDMMC1 的时钟源,CubeMX 中可在 Clock Configuration 页面设置,APB2 Prescaler=1,即可让 PLCK2=100MHz);
- SDMMC1 的时钟分频:后续 HAL 库会自动将 100MHz 分频为 50MHz(TF 卡最高支持),无需手动配置。
3. SDMMC1 配置
- 进入Connectivity → SDMMC1,选择SD 4-bit Wide bus(4 位宽总线,主流模式);
- 配置DMA Settings:点击 Add,选择DMA2 → Stream3 → Channel4(SDMMC1 的默认 DMA 通道,CubeMX 会自动匹配),传输模式为 Normal(单次传输,适合文件读写);
- 其余参数默认(CubeMX 已按 SD v2.0 标准配置,时钟 50MHz、数据 8 位等)。
4. GPIO 配置
- CubeMX 会自动配置 SDMMC1 的所有引脚(PC12、PD2、PC8~PC11),无需手动配置;
- 手动给 CMD(PD2)和 D0~D3(PC8~PC11)添加上拉电阻:在 GPIO Configuration 页面,找到对应引脚,将 Pull-up/Pull-down 设置为Pull-up(内部上拉,若硬件已接 10kΩ 上拉,此步骤可省,双重上拉更稳定);
- 若需要卡检测 / 写保护,可配置一个 GPIO(如 PA0)为Input Pull-up,作为 CD 引脚,初学者可省。
5. 生成代码
- 选择Project Manager,设置项目名、保存路径,选择 MDK-ARM v5;
- 勾选Generate peripheral initialization as .c/.h files,点击GENERATE CODE,CubeMX 会自动生成 SDMMC1+DMA 的所有初始化代码。
步骤 2:FatFS 文件系统移植(极简版,CubeMX 集成)
STM32CubeMX 已集成 FatFS,一键开启,无需手动移植源码,步骤如下:
- 进入Middleware → FatFS,选择SDMMC1作为存储设备,FatFS Version选择最新版(如 R0.14);
- 配置 FatFS 参数:FF_FS_READONLY = 0(允许读写)、FF_USE_FAT32 = 1(支持 FAT32 格式,TF 卡默认格式化格式),其余参数默认;
- 重新生成代码,CubeMX 会自动将 FatFS 源码添加到项目中,并完成和 SDMMC1 的底层对接。
步骤 3:核心代码实现(文件读写,零基础可直接复制)
CubeMX 生成的代码已包含 SDMMC1、DMA、FatFS 的所有初始化,我们只需调用FatFS 的标准 API即可实现 TF 卡的文件读写,核心流程:挂载 TF 卡 → 打开 / 创建文件 → 读写文件 → 关闭文件 → 卸载卡。
以下是完整的测试代码,添加到main.c中,注释详细,初学者可直接使用:
/* 包含必要头文件(CubeMX已自动添加) */ #include "main.h" #include "sdmmc.h" #include "fatfs.h" #include "dma.h" /* FatFS相关变量(CubeMX已定义,无需手动声明) */ FATFS fs; // FatFS文件系统对象 FIL fil; // 文件对象 FRESULT res; // FatFS函数返回值(用于判断是否执行成功) uint32_t br, bw; // 实际读取/写入的字节数 /* 测试数据 */ uint8_t write_buf[] = "STM32H743Z SDMMC + TF卡 读写测试!Hello FatFS!"; // 要写入的内容 uint8_t read_buf[100] = {0}; // 存储读取的内容 int main(void) { /* 1. 系统初始化(CubeMX自动生成,含时钟、GPIO、SDMMC1、DMA、FatFS) */ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_DMA_Init(); MX_SDMMC1_SD_Init(); MX_FATFS_Init(); /* 2. 挂载TF卡(关键:挂载成功才能进行后续操作) */ res = f_mount(&fs, "", 1); // ""表示根目录,1表示立即挂载 if(res != FR_OK) { // 挂载失败:可能无卡、卡未格式化、硬件问题 while(1); // 初学者可在此处加指示灯提示 } /* 3. 打开/创建文件(TEST.TXT,在TF卡根目录) */ // FA_CREATE_ALWAYS:若文件存在则覆盖,不存在则创建;FA_WRITE:写权限;FA_READ:读权限 res = f_open(&fil, "TEST.TXT", FA_CREATE_ALWAYS | FA_WRITE | FA_READ); if(res != FR_OK) { f_mount(NULL, "", 1); // 挂载失败,卸载卡 while(1); } /* 4. 向文件写入数据 */ res = f_write(&fil, write_buf, sizeof(write_buf), &bw); if(res != FR_OK || bw != sizeof(write_buf)) { f_close(&fil); // 写入失败,关闭文件 f_mount(NULL, "", 1); // 卸载卡 while(1); } /* 5. 将文件读写指针移到文件开头(准备读取) */ f_lseek(&fil, 0); /* 6. 从文件读取数据到缓冲区 */ res = f_read(&fil, read_buf, sizeof(write_buf), &br); if(res != FR_OK || br != sizeof(write_buf)) { f_close(&fil); f_mount(NULL, "", 1); while(1); } /* 7. 操作完成:关闭文件 + 卸载卡 */ f_close(&fil); f_mount(NULL, "", 1); // 卸载卡,释放资源 /* 8. 读写成功:read_buf中已存储读取的内容,可通过串口打印查看 */ while (1) { // 此处可添加指示灯闪烁,提示操作成功 HAL_Delay(500); HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); // 若有LED引脚,可配置后使用 } }关键代码解释(初学者重点理解)
- f_mount(&fs, "", 1):将 FatFS 文件系统挂载到 TF 卡根目录,是所有文件操作的前提,挂载失败则后续操作都无法进行;
- f_open():打开 / 创建文件,第二个参数是文件名(支持英文 / 数字,初学者避免中文),第三个参数是操作权限;
- f_write()/f_read():读写文件,第四个参数是实际传输的字节数,必须判断是否和预期一致(防止数据丢失);
- f_lseek():移动文件读写指针,写入后指针在文件末尾,必须移到开头才能读取到刚写入的内容;
- f_close()/f_mount(NULL, "", 1):操作完成后必须关闭文件、卸载卡,释放硬件和软件资源,避免内存泄漏。
步骤 4:测试验证
- 将 TF 卡格式化为FAT32格式(电脑端格式化,簇大小默认),插入卡槽;
- 将代码下载到 STM32H743Z 开发板,上电运行;
- 运行成功后,拔出 TF 卡,插入电脑,可在根目录看到TEST.TXT文件,打开后可见写入的内容,说明读写成功。
五、典型应用场景(结合 STM32H743Z 的高性能优势)
STM32H743Z 的 SDMMC+TF 卡组合,依托45MB/s 高速传输、DMA 无 CPU 占用、400MHz 主频强处理能力,适合大数据量、高速率的应用场景,相比低性能 MCU(如 F1),能处理更复杂的存储需求,典型应用如下:
1. 工业 / 物联网大数据日志存储(最常用)
- 场景:环境监测(温湿度、气压、PM2.5)、工业设备(电流、电压、转速)、物联网终端的传感器数据,按时间戳持续存储到 TF 卡;
- 优势:SDMMC 4 位模式高速写入,DMA 传输不占用 CPU,H743 可同时处理传感器采集、数据解析、网络传输,TF 卡大容量(最大 256G)可存储数月甚至数年的日志;
- 实现:用 FatFS 生成CSV 格式文件(如 20260202_log.csv),每行存储 “时间戳 + 传感器 1 + 传感器 2+...”,电脑端可直接用 Excel 打开分析。
2. Bootloader 固件升级(嵌入式必备)
- 场景:将 STM32 的应用固件(.bin 文件)存储到 TF 卡,Bootloader 启动后,通过 SDMMC 高速读取固件数据,写入内部 FLASH 或外部 QSPI FLASH,完成固件升级;
- 优势:相比 UART/USB 升级,TF 卡升级速度快(45MB/s 远大于 UART 的 115200bps)、操作方便(无需连接电脑,直接换 TF 卡即可),适合工业现场无电脑的场景;
- 适配:Bootloader 代码量小,HAL 库的 SDMMC 底层扇区读写函数足够,可不用 FatFS,直接读取.bin 文件的扇区数据,更精简。
3. 多媒体数据存储与播放(H7 高性能专属)
- 场景:STM32H743Z+LCD 屏 + 音频解码芯片的项目,将图片(BMP/JPG)、音频(WAV/MP3)、视频(MJPEG)等多媒体文件存储到 TF 卡,通过 SDMMC 高速读取,实现图片浏览、音乐播放、视频播放;
- 优势:H743 的 400MHz 主频可实现图片 / 音频的软解码,SDMMC 的高速传输保证多媒体数据的连续读取,无卡顿,相比 F1/F4,H7 的处理能力能支撑更复杂的多媒体解析。
4. 离线数据缓存与批量上传
- 场景:物联网终端在无网络(4G/WiFi)时,将采集的传感器数据缓存到 TF 卡,当网络恢复后,通过 SDMMC 高速读取缓存数据,批量上传到云平台;
- 优势:避免无网络时的数据丢失,TF 卡大容量可缓存大量数据,网络恢复后快速上传,适合网络不稳定的场景(如户外、工业现场)。
5. 配置文件存储(简化项目开发)
- 场景:将项目的配置参数(如传感器校准系数、网络参数、设备 ID、LCD 显示参数)存储到 TF 卡的INI/TXT 配置文件中(如 config.ini),STM32 启动后读取配置文件,加载参数;
- 优势:无需修改代码、无需重新下载,直接在电脑端修改配置文件,插入 TF 卡即可更新参数,大幅简化现场调试和参数修改流程。
六、初学者常见坑与避坑技巧(核心,避免踩雷)
STM32H743Z 的 SDMMC 驱动,初学者最容易在硬件连接、时钟配置、FatFS 操作上出错,以下是最常见的问题和解决方案,按出现频率排序:
坑 1:TF 卡初始化失败 / 挂载失败(90% 的初学者遇到)
常见原因:
- 硬件未接上拉电阻(CMD/D0~D3);
- SDMMC 的时钟配置错误(PLCK2≠100MHz,导致 SDMMC 时钟超过 50MHz);
- TF 卡未格式化为FAT32格式(FatFS 默认不支持 NTFS/EXFAT);
- 硬件接错引脚(如将 PC12(CLK)和 PD2(CMD)接反);
- TF 卡损坏或未正确插入卡槽。
解决方案:
- 优先检查硬件上拉电阻,确保 CMD/D0~D3 都接 10kΩ 上拉到 3.3V;
- 在 CubeMX 中确认 Clock Configuration 页面的PLCK2=100MHz;
- 用电脑将 TF 卡格式化为 FAT32,簇大小默认,格式化前备份数据;
- 对照芯片手册,检查 SDMMC1 的引脚是否接错(PC12、PD2、PC8~PC11);
- 更换一张正常的 TF 卡(建议用 16G/32G 的高速 TF 卡,避免低速 / 扩容卡)。
坑 2:文件写入成功,但电脑端打开内容为空 / 乱码
常见原因:
- 写入后未调用f_close(&fil),数据仍在 FatFS 的缓冲区中,未实际写入 TF 卡;
- 读写指针未移动,读取到的是缓冲区的空数据;
- 写入的字节数和实际传输的字节数不一致(未判断 bw 参数)。
解决方案:
- 写入数据后,必须调用 f_close (&fil),FatFS 会将缓冲区的数据刷写到 TF 卡;
- 读取前必须用f_lseek(&fil, 0)将读写指针移到文件开头;
- 严格判断 f_write () 的返回值和 bw 参数,确保
res == FR_OK && bw == 预期字节数。
坑 3:DMA 传输失败,数据读写错误
常见原因:
- CubeMX 中配置的DMA 通道 / 流错误(SDMMC1 必须用 DMA2 Stream3 Channel4);
- DMA 传输的数据缓冲区未按 32 位对齐(H7 的 DMA 要求缓冲区地址 32 位对齐,否则传输错误);
- SDMMC 的 DMA 模式配置为Circular(循环传输),适合连续传输,文件读写应使用Normal(单次传输)。
解决方案:
- CubeMX 中让 SDMMC1 自动匹配 DMA 通道,不要手动修改;
- 将读写缓冲区(如 read_buf、write_buf)定义为*attribute((aligned(4)))*,强制 32 位对齐,示例:
uint8_t write_buf[] __attribute__((aligned(4))) = "测试内容"; uint8_t read_buf[100] __attribute__((aligned(4))) = {0}; - CubeMX 中 DMA 传输模式设置为Normal。
坑 4:SDMMC 通信不稳定,偶尔读写失败
常见原因:
- TF 卡电源噪声大,未接 0.1μF 滤波电容;
- SDMMC 时钟频率过高,初学者可先降低到 25MHz;
- 硬件走线过长 / 杂乱(面包板实验可忽略,PCB 设计需注意);
- 未给 TF 卡留足够的供电电流(TF 卡读写时瞬间电流可达 100mA 以上,确保 3.3V 电源能提供足够电流)。
解决方案:
- 在 TF 卡 VCC 和 GND 之间接 0.1μF 陶瓷滤波电容,靠近卡槽焊接;
- 在 CubeMX 中降低 SDMMC1 的时钟频率:进入 SDMMC1 配置页面,将Clock Divider增大,或在代码中修改
hsdmmc1.Init.ClockDiv = 4(将 50MHz 降为 25MHz); - 确保 3.3V 电源的输出电流≥200mA,避免电源带载能力不足;
- 面包板实验时,尽量缩短 SDMMC 引脚的杜邦线。
坑 5:FatFS 不支持中文文件名 / 中文内容
常见原因:FatFS 默认的编码格式为 ASCII,不支持中文,直接用中文文件名会导致 f_open () 失败,写入中文会出现乱码。
解决方案:
- 初学者优先使用英文 / 数字文件名(如 test.txt、log2026.csv),避免中文问题;
- 若需要支持中文,需修改 FatFS 的配置文件
ffconf.h,将FF_CODE_PAGE设置为936(GB2312 编码),并添加中文字库,适合有中文需求的场景(稍复杂,初学者后期再学)。
七、初学者进阶方向(从基础到精通)
- 底层扇区读写:脱离 FatFS,直接调用 HAL 库的
HAL_SD_ReadBlocks_DMA()、HAL_SD_WriteBlocks_DMA()实现扇区读写,理解 TF 卡的底层存储结构,适合 Bootloader 等精简场景; - 多文件 / 文件夹操作:学习 FatFS 的文件夹创建(f_mkdir ())、文件重命名(f_rename ())、文件删除(f_unlink ())、遍历目录(f_readdir ()),实现更复杂的文件管理;
- 中文支持:修改 FatFS 配置,添加 GB2312/UTF-8 编码,实现中文文件名和中文内容的读写;
- SDMMC 高速模式:学习 SD 卡的SDR104/SDR50超高速模式,将传输速度提升到 100MB/s 以上,适合超大数据量传输;
- 双 SDMMC 外设使用:STM32H743Z 有两个 SDMMC 外设,可同时连接两张 TF 卡,实现主备存储或分类存储(一张存日志,一张存固件);
- 错误处理与容错:在代码中添加完善的错误处理(如卡拔出检测、写入失败重试、文件损坏检测),让项目更稳定,适合工业现场的严苛环境。
总结
STM32H743Z 的 SDMMC 外设是驱动 TF 卡的最优选择,相比 SPI 模式,拥有高速、DMA 无 CPU 占用、专用外设的优势,核心学习要点可总结为 3 点:
- 硬件核心:SDMMC1 引脚固定(PC12、PD2、PC8~PC11),CMD/D0~D3 必须接 10kΩ 上拉,3.3V 供电无电平转换,电源加 0.1μF 滤波;
- 软件核心:用 STM32CubeMX 一键配置 SDMMC1+DMA+FatFS,自动生成初始化代码,初学者直接调用 FatFS 的标准 API(f_mount/f_open/f_write/f_read),避开底层复杂操作;
- 应用核心:依托 H743 的高性能,SDMMC+TF 卡适合大数据日志、固件升级、多媒体存储、离线缓存等场景,是嵌入式项目中必备的外置存储方案。