完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
根目录下文件毁坏。
现象:在FatFs下可以读写文件,可在PC上无法打开目录,提示文件毁坏。 解决:既然是FAT表与目录对不上,而且FAT毁坏,就是用PC修复也只会删除这些文件,对于我们的单片机来说,也没有好的解决方法,那就格式吧。 下面的代码用于判断FAT表是否和文件目录对应的上,使用的方法是:扫描FAT表,看看应用了多少簇,在通过读取FSInfo扇区的信息,看这两者是否一致。一致时为正确,不一致一般有问题。 /*-----------------------------------------------------------------------*/ /* File system check */ /*-----------------------------------------------------------------------*/ FRESULT f_fsCheck( const TCHAR *path, /* Pointer to the logical drive number (root dir) */ DWORD *nclst, /* Pointer to the variable to return number of free clusters */ FATFS **fatfs /* Pointer to pointer to corresponding file system object to return */ ) { FRESULT res; FATFS *fs; DWORD n, clst, sect, stat; UINT i; BYTE fat, *p; /* Get drive number */ res = chk_mounted(&path, fatfs, 0); fs = *fatfs; if (res == FR_OK) { /* Get number of free clusters */ fat = fs->fs_type; n = 0; if (fat == FS_FAT12) { clst = 2; do { stat = get_fat(fs, clst); if (stat == 0xFFFFFFFF) { res = FR_DISK_ERR; break; } if (stat == 1) { res = FR_INT_ERR; break; } if (stat == 0) n++; } while (++clst < fs->n_fatent); } else { clst = fs->n_fatent; sect = fs->fatbase; i = 0; p = 0; BYTE cnt = 0; do { if (!i) { res = move_window(fs, sect++); if (res != FR_OK) break; p = fs->win; i = SS(fs); } if (fat == FS_FAT16) { if (LD_WORD(p) == 0) n++; p += 2; i -= 2; } else { if ((LD_DWORD(p) & 0x0FFFFFFF) == 0) { if (++cnt > 10) // 连续10个空簇,退出 { break; } } else { n++; cnt = 0; } p += 4; i -= 4; } } while (--clst); } if (fs->last_clust > (n+10)) { res = FR_INT_ERR; } } LEAVE_FF(fs, res); } FatFs中并没有这个函数,是本添加的。后面我们可以调用这个函数实现FAT检查功能 /************************************************************************************** * FunctionName : FatFileSystemCheck() * Description : FsInfo校验 * EntryParameter : None * ReturnValue : 返回操作结果 **************************************************************************************/ u8 FatFileSystemCheck(void) { FATFS *pFs; FATFS fs; FRESULT res; DWORD fre_clust; f_mount(0, &fs); res = f_fsCheck("", &fre_clust, &pFs); f_mount(0, 0); return res; } 后面我们可以通过此函数的返回值,看是否要格式。 if (FatFileSystemCheck() != FR_OK) // 文件系统毁坏,格式 { App_Format(); } |
|
|
|
使用stm32l451片子,对ad7606进行3通道100k采样值跳动问题?
957 浏览 1 评论
STM32进行DMA数据转运,为什么只有A组最后一位数据被转运到B组去?
1461 浏览 2 评论
1775 浏览 3 评论
1373 浏览 0 评论
嵌入式开发 Win11安装ST-Link 提示 设备描述符请求失败 怎么处理?
1512 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-23 01:22 , Processed in 0.447971 second(s), Total 36, Slave 28 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号