FatFs模块系统应用指南

(1条消息) FatFs模块系统应用指南_朱工的专栏-CSDN博客
https://blog.csdn.net/zhzht19861011/article/details/52893131?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

FatFs模块功能配置选项

https://blog.csdn.net/carlsun80/article/details/77017733/

https://blog.csdn.net/carlsun80/category_7089164.html

 

http://www.openedv.com/forum.php?mod=viewthread&tid=291154&extra=page=1

以前用FatFS的时候有没有发现在使用大容量卡(4G以上)的时候,卡里存了4G以上的东西,新存的文件就不能被正确读取了呢?!
这是因为大家移植的FatFS都是32位寻址的,只能读到4G以下地址的东西,4G以上的东西虽然文件分配表还有分配,但是却没有这么大的地址去读取。
怎么办呢?让我们来解决这个问题吧!

我试了一下
这个方法可以,但是有个地方不好:“就是把unsigned long 无符号长整型变成unsigned long long 无符号64位长整型。”这种操作其实已经改变了FATFS的库函数的变量类型,我觉得最好别改库文件。
我用另一个方法做了测试,不需要修改这个变量类型的定义:

DRESULT disk_write (
        BYTE pdrv,                        /* Physical drive nmuber to identify the drive */
        const BYTE *buff,        /* Data to be written */
        DWORD sector,                /* Start sector in LBA */
        UINT count                        /* Number of sectors to write */
){}
这个函数传递的是一个sector值,在调用SD_WriteMultiBlocks(uint8_t *writebuff, uint64_t WriteAddr, uint16_t BlockSize, uint32_t NumberOfBlocks);这个函数的时候,我这里找到的例程是直接用这样的方式:
SD_WriteMultiBlocks(buff, BLOCK_SIZE*sector, BLOCK_SIZE, count);
因为sector本身是一个DWORD类型,是不是因为BLOCK_SIZE*sector的值在计算之后仍然默认是DWORD类型(这时候已经地址溢出了),然后在参数传递的时候才强制转换为uint64_t,其实等于是先发生了溢出,然后再传递?
所以我改成了这种方式:
SD_WriteMultiBlocks(buff, BLOCK_SIZE*(uint64_t)sector, BLOCK_SIZE, count);

这样处理并不需要更改integer文件里面DWORD的类型定义,测试后反正8G的SD卡读写到6G多的时候是没什么问题的。按这样处理的话,在BLOCK_SIZE为512的情况下,理论上应该能支持512*4G 大小的SD卡,不知道我理解的对不对?

 

 


结果还是diskio.c的问题。

disk_write()函数里调用了SD_WriteMultiBlocks()函数,其中有一个参数是WriteAddr,这个地址是字节寻址的,是64位整数。如下:
                
                        SD_state=SD_WriteMultiBlocks((uint8_t *)buff,sector*SD_BLOCKSIZE,SD_BLOCKSIZE,count);

可以看到调用时的实参表达式是sector*SD_BLOCKSIZE,这个sector是扇区寻址的,是一个32位整数,所以这个表达式的计算结果仍然是32位的,导致地址的高位被抹掉,所以错误地寻址到前面的扇区,破坏了文件系统。

解决方法也很简单,定义一个64位的临时变量,把sector的值赋进去再做乘法就好了。

 

在移植fatfs文件系统后,可以读写文件系统,但是在读写过程中一直出现FR_DISK_ERR错误,以为是底层函数编写有问题,一直无法解决问题,后经过多方查阅资料,怀疑是SDIO访问时钟频率过高导致,将SDIO时钟频率调低后经测试读写正确,未出现FR_DISK_ERR错误,特留此文以备后用,如果有同样问题的朋友看到此文很高兴能为你提供一个解决方案

 

fatfs文件系统写成功,打开文件成功读取失败或者打开文件失败

分类专栏: 四旋翼 文章标签: fatfs文件系统文件读取失败

格式化flash重新挂载

具体方法:

步骤1:挂载文件系统

FRESULT result;

result = f_mount(&fs, "0:", 1); /* Mount a logical drive */

步骤2:格式化文件系统

result = f_mkfs("0:",0,0);

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FatFs是一个嵌入式文件系统适配层,可以方便地在嵌入式系统中使用各种不同的存储设备,如SD卡、USB闪存,以及内存等。FatFs文件系统应用程序手册提供了关于如何使用FatFs文件系统的详细说明和使用指南。 首先,该手册介绍了FatFs的概念和原理,以及使用FatFs的好处和功能。它解释了FatFs中的一些重要概念,如文件和目录的层次结构,文件操作的函数接口等。 接下来,手册提供了使用FatFs的步骤和示例代码。它详细解释了如何初始化FatFs,如何打开、创建、读取和写入文件,以及如何在文件和目录之间进行导航。示例代码演示了如何使用各种文件操作函数,例如f_open、f_read、f_write等。 此外,手册还介绍了FatFs的一些高级功能,如长文件名支持、同步和异步操作、多任务支持等。它解释了如何使用这些功能,并提供了相关的示例代码和使用建议。 最后,手册还包括一些常见问题的解答和错误处理的建议。它列出了一些可能遇到的问题和解决方法,以帮助开发人员在使用FatFs时更好地处理错误和异常情况。 总之,FatFs文件系统应用程序手册是一个很好的指南,提供了使用FatFs文件系统的详细说明和指导。通过阅读和理解该手册,开发人员可以更好地使用FatFs文件系统,从而方便地在嵌入式系统中处理各种存储设备中的文件操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值