外接 TF 卡跑起 FatFs一、接线
**PE4 上电必须是高电平(空闲不选中)。CubeMX 里配成 Output 且初始电平 High,生成的 **
这条不能丢。片选悬空的话,卡在启动期间会被误触发,之后的 SD 初始化会卡死在 CMD0。 二、驱动从哪来不用自己写。ST 官方固件包里有现成的,就在本地:
1030 行的协议逻辑,加 229 行头文件。它不依赖 Adafruit 那个 TFT 盾板,只要求实现 4 个空函数:
这 4 个函数加起来不到 40 行,绑 分层:
**驱动里的函数统一改成 ** 板级适配里的三个必做动作① 80 个上电时钟。 SD 卡上电后需要至少 74 个时钟完成内部复位,才能进 SPI 模式。官方驱动的 **放在 ** ② 速率两段式。 SD 卡在初始化阶段只接受 100~400kHz,初始化完才能提速。 本板 SPI4 挂在 APB2 = 84MHz:
**那个 42MHz 是陷阱——直接拿来发 CMD0,卡根本不认。所以 ** 为什么工作速率是 10.5MHz 而不是 21MHz。 第一版用了 4 分频(21MHz),结果是能初始化、读不了块:
**这里 **
**看到 ** 21MHz 下失败的原因:C64 模块带电平转换芯片,边沿被拉缓;再加上杜邦线,21MHz 时 MISO 采样已经错位。降到 10.5MHz 后立刻正常。 ③ MISO 补上拉。 CubeMX 把 PE5 配成 **C64 这类模块通常板载 10k 上拉,但如果线长或者模块省了,就需要补。在 **
**⚠️ 这段必须放在 **
三、🔴 内存配置问题这一节是这份文档的重点。三个问题都是"能编译、能运行、但行为不对"的类型。 3.1 512 字节的堆,撞上 512 字节的 malloc链接脚本里:
而官方驱动里读/写块各有一处:
512 字节的堆,申请 512 字节,减掉 malloc 自己的块头(8~16 字节)必然失败。 症状特别迷惑: 修法:改成静态缓冲。
代价是 512 字节常驻 RAM,换来的是"不会因为堆碎片而随机失败"。嵌入式里这种一次性的块缓冲本来就不该动态分配。
3.2
|
| 版本 | RAM | FLASH |
|---|---|---|
| 加 SD 之前 | 85,472 B | 378,428 B |
+ 驱动(sd_spi.c+bsp_sd.c) |
86,280 B(+808) | 384,388 B(+5,960) |
+ 自检模块(app_sd_card.c+ 任务) |
89,216 B(+2,936) | 400,060 B(+15,672) |
| 自检开关关掉 | 86,280 B | 384,388 B |
自检模块那 2,936 字节 RAM 的构成:
| 项 | 字节 |
|---|---|
s_sd_stack(任务栈 1024) |
1,024 |
s_sd_tcb |
92 |
s_fil |
560 |
s_buf |
512 |
s_dir+s_fno |
72 |
| 其他(FatFs 静态、printf 缓冲) | ~676 |
**FLASH 那 15,672 字节主要是 **ff.c ——之前没人调 f_mount(),整个文件系统内核被 --gc-sections 裁掉了,现在有人用才链接进来。
关掉自检开关能把这 2,936 B 全退回来,因为任务函数被 #if 掉之后,栈、TCB、FIL 全都没有引用,链接器一并裁掉。
| 配置 | 值 | 影响 |
|---|---|---|
_FS_REENTRANT |
1 | 开可重入,需要 option/syscall.c提供信号量封装 |
_SYNC_t |
osSemaphoreId |
用 CMSIS 的信号量做同步对象 |
_FS_TIMEOUT |
1000 | 拿不到卷时等多久 |
_FS_LOCK |
2 | 最多 2 个文件同时打开 |
_FS_TINY |
0 | 每个文件自带扇区缓冲(560 B) |
_MAX_SS |
512 | 扇区大小 |
_USE_LFN |
0 | 不支持长文件名 |
_FS_REENTRANT = 1 意味着 option/syscall.c 必须在构建里。CubeMX 已经把它加进 FatFs_Src 了,不用管。
**如果不加,链接时会报 **ff_req_grant / ff_rel_grant 未定义。这两个函数很多教程都不提,从报错反推得花一阵。
App_SDCard_SelfTest() 做的事:
f_mount → 读卡容量 → 列根目录 → 建文件写 → 关 → 重开读 → 逐字节比对 → 删 → 卸载
为什么不只看 f_mount 返回 OK。
f_mount() 返回 FR_OK 只说明"逻辑卷注册成功",它不读卡上任何一个扇区。卡没格式化、FAT 表损坏、扇区寻址错,f_mount 全都是 OK。
**真正会失败的是第一次 **f_opendir 或 f_open——那时才去读引导扇区。所以必须一路做到"写进去再读出来一样"。
**挂在最低优先级的独立任务里跑,跑完 **vTaskDelete(NULL) 自杀。
排障时先看这个对照表,能省一半时间。
| 返回码 | 含义 | 优先查什么 |
|---|---|---|
FR_NOT_READY(3) |
卡未就绪,初始化没过 | 有没有插卡、片选、上电时钟、低速档 |
FR_DISK_ERR(1) |
初始化过了,读块失败 | 高速档、MISO 上拉、信号质量 |
FR_NO_FILESYSTEM |
卡上没有 FAT | 卡需要格式化(FAT32) |
FR_INVALID_NAME |
文件名非法 | 8.3 格式限制 |
FR_DENIED |
访问被拒 | 卡的写保护开关 |
FR_NOT_ENOUGH_CORE |
内存不足 | LFN 缓冲、FreeRTOS heap |
[TASK] AppSdTask started (prio 1, stack 1024 B)
[SD] ==== mount & list ====
[BSP] SD: init OK in 3 ms, SPI 10500 kHz (PCLK2 84 MHz / 8)
[SD] capacity: 3594 MB (7360512 blocks x 512 B)
[SD] --- root dir ---
[SD] SYSTEM~1 0 B <DIR>
[SD] JA6_70~1.GCO 17355490 B
[SD] --- end of list ---
[SD] ==== write / read / verify ====
[SD] write ok: 41 B in 79 ms
[SD] verify ok: 41 B match
[SD] RESULT: PASS | 3594 MB | mount 13 ms | write 79 ms | read 1 ms | 2 entries
| 指标 | 数值 | 说明 |
|---|---|---|
| SD 初始化 | 3 ms | 卡已经在稳态,上电时钟和 80 个 dummy 之后就绪 |
| 挂载 + 读引导扇区 | 13 ms | 含一次扇区读 |
| 写 41 字节(含 close) | 79 ms | 慢,但这是卡内部编程时间,不是 SPI 限制 |
| 读 41 字节 | 1 ms | 10.5MHz 下读一个扇区约 0.4ms,加开销 1ms 合理 |
写为什么比读慢 80 倍。 f_write 之后调 f_close,要落盘的东西有三份:数据块本身、FAT 表更新、目录项更新。每次块写都要等卡内部编程完成,而 SD 卡写一页最坏允许 250ms。所以 79ms 属于正常范围,提速 SPI 对此没有帮助——这也解释了为什么 10.5MHz 够用。
**根目录里的 **SYSTEM~1 是短名显示,实际是 Windows 的 System Volume Information;JA6_70~1.GCO 同理。这正是 _USE_LFN = 0 的直观后果:长名字都被压缩成 8.3 格式。
MX_FATFS_Init() 在 main.c 里,位置在调度器启动前。它只调 FATFS_LinkDriver() 注册函数指针,不碰硬件,所以安全。
但 f_mount() 必须在任务里调。
**它会一路走到 **USER_initialize() → BSP_SD_Init() → HAL_Delay()。调度器没跑起来时 uwTick 是冻的,HAL_Delay 不返回,主流程永久卡死,连任务都创建不出来。
**盘符是 **"0:/"(USERPath 由 FATFS_LinkDriver 填好)。
_Min_Heap_SizeFIL 不是小结构体,_FS_TINY = 0 时它有 560 字节f_mount 成功不代表卡上有文件系统_USE_LFN = 0 时不能加 ccsbcs.c,它会自己 #error 拒绝编译
【有奖活动】2026 GaN 技术日 · 深圳
双节狂欢/STM32F429 上移植 FreeRTOS
#双节活动#STM32F429-DISCO板载LCD绘制
CEIC 2026|意法半导体与您相约深圳消费电子创新大会
#双节活动#STM32CubeMX2的开发经验
深圳见!走进GEIA创新周,现场体验ST人形机器人全套参考设计
意法半导体精彩亮相IOTE 2026深圳物联网展
探索连接与安全的未来|ST安全与连接事业部线下研讨会即将登陆深圳南山区
倒计时!ST邀您齐聚2026 SSA亚洲智能传感器与应用技术博览会,共探人形机器人感知新生态
下周启幕|ST邀您参加2026 ATC上海国际动力展,多款汽车创新方案等你来探
微信公众号
手机版