OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 39179|回复: 48

[大问题的解决!]!!!用FatFS的朋友们注意了啊,福利来了!

  [复制链接]

25

主题

114

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2014-7-16
在线时间
5 小时
发表于 2014-7-18 20:46:53 | 显示全部楼层 |阅读模式
以前用FatFS的时候有没有发现在使用大容量卡(4G以上)的时候,卡里存了4G以上的东西,新存的文件就不能被正确读取了呢?!
这是因为大家移植的FatFS都是32位寻址的,只能读到4G以下地址的东西,4G以上的东西虽然文件分配表还有分配,但是却没有这么大的地址去读取。
怎么办呢?让我们来解决这个问题吧!

首先,打开SDIO/SPI总线驱动SD卡的底层文件:

sd.h-------------------
sd.c-------------------

在文件里找到下面的几个函数(类似的也行):
SD_Error SD_ReadBlock(uint8_t *readbuff, uint32_t ReadAddr, uint16_t BlockSize);
SD_Error SD_ReadMultiBlocks(uint8_t *readbuff, uint32_t ReadAddr, uint16_t BlockSize, uint32_t NumberOfBlocks);
SD_Error SD_WriteBlock(uint8_t *writebuff, uint32_t WriteAddr, uint16_t BlockSize);
SD_Error SD_WriteMultiBlocks(uint8_t *writebuff, uint32_t WriteAddr, uint16_t BlockSize, uint32_t NumberOfBlocks);

看到Addr的参数了吗?这是地址,现在我们把它改成64位的,像这样:

SD_Error SD_ReadBlock(uint8_t *readbuff, uint64_t ReadAddr, uint16_t BlockSize);
SD_Error SD_ReadMultiBlocks(uint8_t *readbuff, uint64_t ReadAddr, uint16_t BlockSize, uint32_t NumberOfBlocks);
SD_Error SD_WriteBlock(uint8_t *writebuff, uint64_t WriteAddr, uint16_t BlockSize);
SD_Error SD_WriteMultiBlocks(uint8_t *writebuff, uint64_t WriteAddr, uint16_t BlockSize, uint32_t NumberOfBlocks);

现在,SD卡的底层就改造好了,我们接着改造FatFS:
打开FatFS目录下的integer.h

找到下面几行代码:
/* These types must be 32-bit integer */
typedef long  LONG;
typedef unsigned long  ULONG;
typedef unsigned long  DWORD;

现在稍稍修改一下,变成这样:
/* These types must be 64-bit integer */
typedef long long LONG;
typedef unsigned long long ULONG;
typedef unsigned long long DWORD;

就是把unsigned long 无符号长整型变成unsigned long long 无符号64位长整型。
现在整体改造完毕,可以试试往SD卡里先写5~6G数据,然后再写个文本,现在读就不会读出乱码啦!
原先32位寻址时,最大支持4GBytes的寻址,现在的寻址空间扩大了4294967295倍,你的SD卡再怎么大都不会出错啦!



光圈电子科技 晓航 多多 啾儿 实验室
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-7-21 23:58:47 | 显示全部楼层
没问题的,对大容量卡来说,这里是要除以512,再送给ARG的。
具体看代码:
[mw_shl_code=c,true]//SD卡写多个块 //buf:数据缓存区 //addr:写地址 //blksize:块大小 //nblks:要写入的块数 //返回值:错误状态 SD_Error SD_WriteMultiBlocks(u8 *buf,long long addr,u16 blksize,u32 nblks) { SD_Error errorstatus = SD_OK; u8 power = 0, cardstate = 0; u32 timeout=0,bytestransferred=0; u32 count = 0, restwords = 0; u32 tlen=nblks*blksize; //总长度(字节) u32 *tempbuff = (u32*)buf; if(buf==NULL)return SD_INVALID_PARAMETER; //参数错误 SDIO->DCTRL=0x0; //数据控制寄存器清零(关DMA) SDIO_Send_Data_Cfg(SD_DATATIMEOUT,0,0,0); //清除DPSM状态机配置 if(SDIO->RESP1&SD_CARD_LOCKED)return SD_LOCK_UNLOCK_FAILED;//卡锁了 if(CardType==SDIO_HIGH_CAPACITY_SD_CARD)//大容量卡 { blksize=512; addr>>=9; } [/mw_shl_code]
看到那个>>9了么?

就是除以512.
另外,我实测16GB,8GB SD卡,都很好的读写,没有任何问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 1 反对 0

使用道具 举报

8

主题

222

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
275
金钱
275
注册时间
2013-11-21
在线时间
0 小时
发表于 2014-7-19 07:49:37 | 显示全部楼层
赞!!学习了。。。
回复 支持 1 反对 0

使用道具 举报

230

主题

1950

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2014-7-18 22:18:31 | 显示全部楼层
谢谢分享、、、
我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-7-18 22:48:39 | 显示全部楼层
谢谢分享....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-7-18 22:50:07 | 显示全部楼层
我也分享一点今天发现的经验.
fatfs V0.10a以及V0.10b存在一个bug
就是fclose/fclosedir之后,没有调用LEAVE_FF;
如果用了OS,那么很容易导致OS崩溃.
建议大家遇到这个问题的时候,自行加上LEAVE_FF就好了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

16

主题

110

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
329
金钱
329
注册时间
2014-2-25
在线时间
44 小时
发表于 2014-7-19 11:13:43 | 显示全部楼层
分享是要赞的
回复 支持 反对

使用道具 举报

4

主题

84

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2013-10-17
在线时间
9 小时
发表于 2014-7-19 22:00:08 | 显示全部楼层
学习,mark
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-8-5
在线时间
4 小时
发表于 2014-7-21 13:57:07 | 显示全部楼层
不知道楼主你怎么测试通过的,其实这样改是不行的:

根据SD卡读函数来说明一点问题:(我用的stm32f407,1.0的库)
SD_Error SD_ReadBlock(uint8_t *readbuff, uint32_t ReadAddr, uint16_t BlockSize)
若将uint32_t ReadAddr改为uint64_t ReadAddr 是远远不够的,因为
1、查看其内部代码,有一句结构体赋值:
SDIO_CmdInitStructure.SDIO_Argument = (uint32_t)ReadAddr;
其中SDIO_Argument 参数也是uint32_t类型的
那么继续往回找,就会发现这个参数是赋值给其内部寄存器的:
 SDIO->ARG = SDIO_CmdInitStruct->SDIO_Argument;

查看stm32f4手册可以知道,寄存器ARG是32位的。
也就是说从硬件理论上来说,都是不能寻址64位地址的。


回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-8-5
在线时间
4 小时
发表于 2014-7-21 14:07:32 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
原子哥,麻烦解答一下  是不是我哪里搞错了?
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-8-5
在线时间
4 小时
发表于 2014-7-22 09:11:11 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
分析得真好,赞!
回复 支持 反对

使用道具 举报

25

主题

114

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
252
金钱
252
注册时间
2014-7-16
在线时间
5 小时
 楼主| 发表于 2014-7-22 10:35:45 | 显示全部楼层
回复【8楼】KC_CEC:
---------------------------------
没有问题哦,我的FatFS仿真的时候地址存在r2寄存器(32位),因为SDHC卡是有Block的,所以一个地址可以对应一大片扇区的吧
光圈电子科技 晓航 多多 啾儿 实验室
回复 支持 反对

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2014-7-18
在线时间
0 小时
发表于 2014-8-3 20:34:30 | 显示全部楼层
赞个。。。。。。
回复 支持 反对

使用道具 举报

12

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
209
金钱
209
注册时间
2012-2-17
在线时间
41 小时
发表于 2015-2-6 14:21:38 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
FRESULT f_closedir ,和 FRESULT f_close 
 
都有个
#if _FS_REENTRANT
unlock_fs(fs, FR_OK); /* Unlock volume */
#endif
应该没问题吧。
。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2015-2-6 23:21:16 | 显示全部楼层
回复【14楼】wwwzfgcom:
---------------------------------
没问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

头像被屏蔽

65

主题

277

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2013-8-11
在线时间
29 小时
发表于 2015-2-7 09:11:54 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2011-12-7
在线时间
7 小时
发表于 2015-5-20 09:26:56 | 显示全部楼层
SD卡的操作单位不是扇区么?32位的地址不是代表扇区的地址么?
所以当判断是大容量(大于4G的时候),不就是扇区的地址了么?既然是扇区的地址,那32位就足够了吧?
因为扇区512字节*2的32次方的容量已经超大了啊
请问我说的对不?
回复 支持 反对

使用道具 举报

17

主题

342

帖子

0

精华

高级会员

Rank: 4

积分
544
金钱
544
注册时间
2014-4-24
在线时间
20 小时
发表于 2015-5-20 10:24:38 | 显示全部楼层
回复【17楼】mahongtu0204:
---------------------------------
mark~~~~~
从楼主的函数来看,应该使用SDIO的时候才需要这么做,因为输入的 ReadAddr是字节地址;
而使用SPI 方式的时候则无需修改,因为 ReadAddr是扇区地址,BlockSize固定为512字节,也就是说spi方式读扇区的函数没有BlockSize这个参数!
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2011-12-7
在线时间
7 小时
发表于 2015-5-20 10:36:50 | 显示全部楼层
回复【18楼】STM32VBT6:
---------------------------------
可是我测试我的SD卡,8G的,我先存进去大于G的文件,(6G多)
然后我用spi方式去创建一个文件,打开,写进去数据到文件,
创建和打开都是好好的,但是写数据进去的时候,有时会花很长的时间才能完成,大概几秒钟
有时候没有延时就完成了
不知道是fatfs的问题还是别的问题
回复 支持 反对

使用道具 举报

17

主题

342

帖子

0

精华

高级会员

Rank: 4

积分
544
金钱
544
注册时间
2014-4-24
在线时间
20 小时
发表于 2015-5-20 10:45:50 | 显示全部楼层
回复【19楼】mahongtu0204:
---------------------------------
数据多大?
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2011-12-7
在线时间
7 小时
发表于 2015-5-20 11:42:56 | 显示全部楼层
就是100个字节回复【20楼】STM32VBT6:
---------------------------------
 就是100个字节
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2013-4-5
在线时间
0 小时
发表于 2015-6-12 21:59:37 | 显示全部楼层
原子哥,我简单用了一下fatfs 0.11 和emwin,不挂载还好,挂载就不能运行了,程序在HardFault_Handler里,需要我上传代码吗
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2015-6-12 22:20:56 | 显示全部楼层
回复【22楼】光少:
---------------------------------
不用,八成是内存访问问题,堆栈溢出,指针未分配内存等。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

44

主题

186

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1260
金钱
1260
注册时间
2012-9-1
在线时间
67 小时
发表于 2015-6-13 11:36:58 | 显示全部楼层
标记备用。。。。。。
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2013-4-5
在线时间
0 小时
发表于 2015-6-13 13:53:42 | 显示全部楼层
回复【23楼】正点原子:
---------------------------------
说的太对啦!我把汇编的0x00000400改成800就好了!!!!!
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
43
金钱
43
注册时间
2014-1-30
在线时间
4 小时
发表于 2015-7-14 11:06:47 | 显示全部楼层
多谢楼主分享,太有用了
回复 支持 反对

使用道具 举报

0

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2012-11-11
在线时间
6 小时
发表于 2015-7-14 14:09:01 | 显示全部楼层
写得真好。
回复 支持 反对

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2013-7-31
在线时间
23 小时
发表于 2015-12-25 15:09:40 | 显示全部楼层
大赞。mark。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2015-12-26
在线时间
0 小时
发表于 2015-12-26 08:44:53 | 显示全部楼层
我是做软件的,看到你们这么开心我实在是忍不住要打击你们,楼主的解决办法是不行的
因为FAT32文件系统对单个文件的最大容量限制就是4G-1字节!所以无论你怎么折腾都不能够违背这个规则!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2015-12-26 20:11:20 | 显示全部楼层
novice 发表于 2015-12-26 08:44
我是做软件的,看到你们这么开心我实在是忍不住要打击你们,楼主的解决办法是不行的!
因为FAT32文件系统 ...

是卡容量,不是单个文件大小。你理解错了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2015-12-3
在线时间
71 小时
发表于 2015-12-29 10:49:23 | 显示全部楼层
正点原子 发表于 2014-7-18 22:50
我也分享一点今天发现的经验.
fatfs V0.10a以及V0.10b存在一个bug
就是fclose/fclosedir之后,没有调用 ...

原子哥,我看0.10b的f_close用unlock_fs,应该就不用LEAVE_FF了吧。
但是在UCOS下使用FatFS各种有问题。。。
用FatFs自带的重入参数设置各种不可以。
因为内存比较紧张,我是想只定义一个FIL变量,然后使用它在多个任务中操作多个文件,
ff_rel_grant发送信号量,返回的err是OS_ERR_MUTEX_NOT_OWNER
逼得我用调度锁了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2015-12-29 23:29:11 | 显示全部楼层
void 发表于 2015-12-29 10:49
原子哥,我看0.10b的f_close用unlock_fs,应该就不用LEAVE_FF了吧。
但是在UCOS下使用FatFS各种有问题。 ...

可以参考下我们综合实验的处理方式.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2015-12-3
在线时间
71 小时
发表于 2015-12-30 09:48:18 | 显示全部楼层
正点原子 发表于 2015-12-29 23:29
可以参考下我们综合实验的处理方式.

我看实验56使用的还是UCOS II,每个文件都定义了一个FIL 结构体,一个FIL 结构体里都有一个
BYTE         buf[_MAX_SS],想着节约内存,只定义一个FIL,在UCOS III下多个任务操作多个文件。现在使用了调度锁暂时解决这个问题,不知道原子哥有没有啥更好的方法?
回复 支持 反对

使用道具 举报

5

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2015-11-6
在线时间
8 小时
发表于 2015-12-31 16:06:36 | 显示全部楼层
真是太感谢了,我最近也在做与FATFS有关的SD卡存储问题。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2016-5-31
在线时间
1 小时
发表于 2016-5-31 17:22:03 | 显示全部楼层
正点原子 发表于 2014-7-21 23:58
没问题的,对大容量卡来说,这里是要除以512,再送给ARG的。
具体看代码:

原子哥有研究過FATFS+U盤嗎,我現在用STM32F446的OTG功能操作U盤,也有這種4G上線的問題,而且我看底層文件,也沒有SD那種大文件ReadAddress/512的機制。還是說現有的底層文件限制只能在4G範圍內操作?謝謝
回复 支持 反对

使用道具 举报

22

主题

129

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
325
金钱
325
注册时间
2015-6-23
在线时间
68 小时
发表于 2016-5-31 21:41:10 | 显示全部楼层
感谢楼主和原子哥分享
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2016-3-18
在线时间
8 小时
发表于 2016-6-1 20:02:04 | 显示全部楼层
学习了,感谢分享
回复 支持 反对

使用道具 举报

74

主题

334

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2015-5-28
在线时间
144 小时
发表于 2017-1-4 18:39:23 | 显示全部楼层
光圈电子科技-晓航-多多实验室 发表于 2014-7-22 10:35
回复【8楼】KC_CEC:
---------------------------------
没有问题哦,我的FatFS仿真的时候地址存在r2寄存器 ...

MArk ,xiexiefenxiang
最近爱上了stm32
回复 支持 反对

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2016-11-23
在线时间
23 小时
发表于 2017-1-5 10:12:19 | 显示全部楼层
多谢分享
回复 支持 反对

使用道具 举报

9

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2017-2-14
在线时间
90 小时
发表于 2017-3-6 17:06:01 | 显示全部楼层
学习学习,谢谢分享~
回复 支持 反对

使用道具 举报

37

主题

246

帖子

0

精华

高级会员

Rank: 4

积分
771
金钱
771
注册时间
2016-9-10
在线时间
308 小时
发表于 2017-3-13 12:30:09 | 显示全部楼层
曾经改过底层,能认出16G的SD卡,是不是改的这儿记不得了
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2017-4-12
在线时间
1 小时
发表于 2017-4-28 17:47:09 来自手机 | 显示全部楼层
可以参考 ranfs fat文件系统
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2017-4-12
在线时间
1 小时
发表于 2017-4-28 17:48:03 来自手机 | 显示全部楼层
ranfs 发表于 2017-4-28 17:47
可以参考 ranfs fat文件系统

ranfs.com
回复 支持 反对

使用道具 举报

18

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2016-3-17
在线时间
24 小时
发表于 2017-12-12 16:49:26 | 显示全部楼层
mark 写的真好
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2017-3-29
在线时间
6 小时
发表于 2018-12-1 10:38:59 | 显示全部楼层
我试了一下
这个方法可以,但是有个地方不好:“就是把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卡,不知道我理解的对不对?
回复 支持 反对

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6643
金钱
6643
注册时间
2015-8-25
在线时间
1033 小时
发表于 2018-12-1 12:52:48 | 显示全部楼层
正点原子 发表于 2014-7-18 22:50
我也分享一点今天发现的经验.
fatfs V0.10a以及V0.10b存在一个bug
就是fclose/fclosedir之后,没有调用 ...

注意了,标记下
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2017-11-5
在线时间
0 小时
发表于 2018-12-5 10:04:53 | 显示全部楼层
赞,标记一下,SD卡大容量问题
回复 支持 反对

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2014-4-14
在线时间
31 小时
发表于 2018-12-5 16:47:34 | 显示全部楼层
好帖,果断收下。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2019-5-11
在线时间
11 小时
发表于 2019-8-8 14:59:00 | 显示全部楼层
太感谢了, 感谢楼主分享。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-30 19:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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