找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 421|回复: 2
打印 上一主题 下一主题
收起左侧

stm32f407+Fatfs文件数据读取错误

[复制链接]
跳转到指定楼层
楼主
图中的GB2312.txt文件在System以及System/Font目录下都存在一个,但是读“0:/System/GB2312.txt”可以读取出来正确数据。而“0:/System/Font/GB2312.txt”则会读取出来几乎全是“0x20”的数据,并且运行程序后在电脑上查看该文件发现损坏了,内容为空。_USE_LFN宏是2,最开始问AI说可能是栈区溢出的原因,但调大栈区后没有解决。还有一点,在执行完一个写文件操作后,立马重启会导致SD卡初始化失败,这时得拔插SD卡再重启才可以,不知道两个现象有没有关联。请问可能的原因是什么?

屏幕截图 2026-09-04 180309.png (247.31 KB, 下载次数: 0)

屏幕截图 2026-09-04 180309.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶顶 踩踩
回复

使用道具 举报

沙发
ID:1175769 发表于 2026-9-7 17:28 | 只看该作者
从你描述的现象来看,两个问题很可能都指向 FATFS 文件系统层与底层 SD 驱动之间的缓冲区管理或缓存(cache)同步问题,而不是单纯的栈溢出。

问题一:System/Font/GB2312.txt 读取全 0x20,且文件损坏
可能原因

1. 路径解析 / LFN 缓冲区问题(最可能)

当 _USE_LFN = 2 时,FATFS 使用 静态缓冲区​ 存放长文件名。如果你的代码中同时打开了多个文件,或者在进行长文件名解析时没有正确管理这个静态缓冲区,可能导致路径解析出错。

但更关键的是:System/Font/ 这个子目录的目录项读取可能出错。如果目录项读取时使用了错误的簇号或偏移,读到的数据就会是垃圾数据(0x20 是空格,说明读到了目录项的空闲区域)。

2. 目录缓存(cache)不同步

FATFS 在读取目录时会有缓存。如果你之前对该目录做过写操作(比如创建 Font 目录或写入 GB2312.txt),但缓存没有正确 flush,后续读取就会读到旧数据或空数据。

3. 文件写入时簇链断裂

如果你写入 GB2312.txt 时,FAT 表更新不完整(比如写 FAT 表时出错),文件系统认为该文件有内容,但实际簇链指向了空区域。读取时就会读到 0x20(空闲簇的默认值)。

问题二:写文件后立即重启导致 SD 卡初始化失败
可能原因

1. 写缓存未落盘(最可能)

FATFS 默认有写缓存(FF_FS_TINY 或扇区缓冲)。执行 f_write 后,数据可能还在缓存中,没有真正写入 SD 卡。此时断电或复位,SD 卡上的 FAT 表或目录项处于不一致状态。下次上电时,SD 卡初始化时可能因为卡内状态异常导致初始化失败。

2. 底层驱动未等待 SD 卡进入空闲状态

写操作完成后立即复位,如果底层 SPI/SDIO 驱动还在传输数据,复位信号可能打断传输,导致 SD 卡内部状态机混乱。下次初始化时卡无法正确响应命令。

3. SD 卡电源/复位时序问题

复位时 SD 卡供电瞬间跌落,卡内逻辑未完全复位。拔插后重新上电,卡才能正确初始化。
回复

使用道具 举报

板凳
ID:1176234 发表于 2026-9-7 18:47 | 只看该作者
问题解决了,应该是SD卡的原因,换了一个就好了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表