硬汉嵌入式论坛

 找回密码
 立即注册
查看: 117|回复: 2
收起左侧

[STM32H7] SDCARD FATFS模拟U盘不同步

[复制链接]

56

主题

113

回帖

281

积分

高级会员

积分
281
发表于 5 天前 | 显示全部楼层 |阅读模式


基于STM32H7+FATFS+SDCard+USB,将SD卡模拟为U盘,当连上电脑后把SD卡里的三个txt文件删除后,然后我拔掉USB线,在MCU端再读取SD卡里的txt,居然还能检测到txt文件名,但是内容读不到了。
导致我的整个系统出错,我断电重启MCU后恢复正常。感觉是电脑端删除文件后,MCU端FATFS文件系统没有同步更新。

请问电脑端删除后如何同步到MCU端呢?网上查了一下说要把文件系统先卸载再挂载,但我还没试过。
我当前的应用是开机初始化时挂载一次FATFS,然后一直不卸载。
除了这个还有其他同步的方法吗?
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
120428
QQ
发表于 5 天前 | 显示全部楼层
模拟U盘前先unmount设备。
回复

使用道具 举报

0

主题

23

回帖

23

积分

新手上路

积分
23
发表于 5 天前 | 显示全部楼层

如果 PC 只是修改文件内容而不改变文件系统结构(如创建/删除文件),清除缓存就足够了。如果涉及文件创建/删除/重命名,重新挂载是最安全的选择,否则自己要深度修改FatFS。

1. 常用重新挂载最可靠,但是最慢
[C] 纯文本查看 复制代码
// usb msc 读写函数置脏文件系统脏标志
int usb_msc_sector_write(uint8_t busid, uint8_t lun, uint32_t sector, uint8_t *buffer, uint32_t length) {
...
file_system_dirty_time++;
...
}

// 文件系统一个线程监控usb mcs读写脏标志了以后重新挂载
{
...
        if (file_system_dirty_time < 1)
        {
            return;
        }

        f_mount(NULL, "", 0);   // 卸载文件系统
        f_mount(&fatfs, "", 1); // 重新挂载文件系统
...
}


2. 如果只是修改文件内容,清除 FatFS 内部缓存即可(轻量级方案)
[C] 纯文本查看 复制代码

// 直接清除 FATFS 结构体的缓存状态
void fatfs_invalidate_cache(FATFS *fs) {
    if (fs == NULL) return;
    
    // 清除窗口缓存标志,强制下次访问重新读取
    fs->wflag = 0;      // 清除脏标志
    fs->winsect = 0xFFFFFFFF;  // 使窗口扇区无效,强制重新加载
    
    #if FF_FS_EXFAT
    fs->dirbuf = NULL;  // 如果使用 exFAT
    #endif
}



void fatfs_sync_from_usb(void) {
    // 1. 关闭所有已打开的文件

    // 2. 清除缓存
    fatfs_invalidate_cache(&fatfs);
}


3.如果只是修改文件内容,也可以不用FatFs缓存依赖就可以解决PC同步问题,具体为按以下配置
[C] 纯文本查看 复制代码
#define FF_FS_TINY      1   // 使用精简模式,减少缓存
#define FF_FS_LOCK      0   // 禁用文件锁定


回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2026-1-10 07:55 , Processed in 0.043681 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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