目录
一、核心概念先理清(初学者必看,避免术语混淆)
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 根线,复杂度低)。
| 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. 核心通信逻辑(极简版)
三、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 位模式):
| 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. 硬件关键注意事项(避坑核心,初学者必须遵守)
四、软件实现(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 卡,初学者直接用上层,无需关注底层扇区。
前置准备
步骤 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,一键开启,无需手动移植源码,步骤如下:
步骤 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引脚,可配置后使用
}
}
关键代码解释(初学者重点理解)
步骤 4:测试验证
五、典型应用场景(结合 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% 的初学者遇到)
常见原因:
解决方案:
坑 2:文件写入成功,但电脑端打开内容为空 / 乱码
常见原因:
解决方案:
坑 3:DMA 传输失败,数据读写错误
常见原因:
解决方案:
uint8_t read_buf[100] __attribute__((aligned(4))) = {0};
坑 4:SDMMC 通信不稳定,偶尔读写失败
常见原因:
解决方案:
坑 5:FatFS 不支持中文文件名 / 中文内容
常见原因:FatFS 默认的编码格式为 ASCII,不支持中文,直接用中文文件名会导致 f_open () 失败,写入中文会出现乱码。
解决方案:
七、初学者进阶方向(从基础到精通)
总结
STM32H743Z 的 SDMMC 外设是驱动 TF 卡的最优选择,相比 SPI 模式,拥有高速、DMA 无 CPU 占用、专用外设的优势,核心学习要点可总结为 3 点:
网硕互联帮助中心

![[从0开始学Java|第十五天]面向对象进阶(抽象类&接口&内部类)-网硕互联帮助中心](https://www.wsisp.com/helps/wp-content/uploads/2026/02/20260206085959-6985ad8f62128-220x150.png)


评论前必须登录!
注册