你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于Fatfs文件系统的请教

[复制链接]
yaowei 提问时间:2015-12-29 15:13 /
各位,大家好,小弟最近在做文件系统存储相关的工作,就是用Cubemx生成文件系统和SDIO,那么我的问题来了
在向文件写内容的时候

result= f_write(&File_Element.fil,File_Element.Fatfs_Buf,sizeof(File_Element.Fatfs_Buf), &File_Element.bwee);       
printf("f_write1=%d\r\n",result);


循环多次向文件写内容,那么就可能会出现f_write返回值为1的情况,而且是没有规律的
我看了这个错误的解释是:FR_DISK_ERR,                        /* (1) A hard error occurred in the low level disk I/O layer */
说是底层硬件错误,

有没有人做过这方面的工作,大神给点指点
在线等
收藏 评论17 发布时间:2015-12-29 15:13

举报

17个回答
adlu 回答时间:2016-1-14 09:40:13
CubeMX生成的SD+FATFS程序确实很方便。
我用F4做录音器,也遇到类似的问题,就是连续写SD卡的时候,很容易出现FR_DISK_ERR错位。
后来把写扇区函数改了。
原函数为:
DRESULT SD_write(BYTE lun, const BYTE *buff, DWORD sector, UINT count)
{       
  DRESULT res = RES_OK;
  
  if(BSP_SD_WriteBlocks((uint32_t*)buff,
                        (uint64_t)(sector * BLOCK_SIZE),
                        BLOCK_SIZE, count) != MSD_OK)
{
   res = RES_ERROR;
  }

  return res;
}
修改后为:
DRESULT SD_write(BYTE lun, const BYTE *buff, DWORD sector, UINT count)
{
        DRESULT res = RES_OK;
        uint8_t sd_res = MSD_OK;
       
        sd_res = BSP_SD_WriteBlocks((uint32_t*)buff,
                        (uint64_t)(sector * BLOCK_SIZE),
                        BLOCK_SIZE, count);
        while (sd_res) {
                BSP_SD_Init();
                sd_res = BSP_SD_WriteBlocks((uint32_t*)buff,
                        (uint64_t)(sector * BLOCK_SIZE),
                        BLOCK_SIZE, count);
        }
        if (sd_res) {
                res = RES_ERROR;
        }
        return res;
}

也就是写出错的时候,重新初始化SD卡。
目前程序运行稳定,但是没有像LZ这样测试4小时那么长。
adlu 回答时间:2016-1-16 15:57:19
yaowei 发表于 2016-1-15 20:01
不好意思,在问下,BSP_SD_WriteBlocks如果一直不返回OK,也就是说不为0的话,那岂不是一直死在while里 ...

确实会有这样的可能性。我测试了一下,比如录音的过程中突然把卡拔出来,如果正好在执行这个底层函数,就会在里面死循环。

除了人为把卡拔出来的情况,正常情况下我没有遇到卡死的情况。

如果担心这个问题,最合理的做法是:增加一个变量,控制初始化的次数,如果尝试了N次之后,仍不能写成功,就退出。
yaowei 回答时间:2016-1-13 11:10:00
zhangbolily 发表于 2016-1-13 10:55
我觉得堆内存大小不够的可能性还是有的,你可以调一下堆内存的大小试试。 ...

都改成0x1000,现在又来问题来:用文件系统操作sdio,cubemx里配置的生成的工程,现在的问题就是,每秒写2500字节左右,连续写4个小时的时候,f_mount或者f_open或者f_write就会返回错误说是错误信息:FR_DISK_ERR,这个错误的意思说是(1) A hard error occurred in the low level disk I/O layer */就是底层硬
moyanming2013 回答时间:2015-12-29 15:33:27
中间加个小延时试试
yaowei 回答时间:2015-12-29 15:34:49
moyanming2013 发表于 2015-12-29 15:33
中间加个小延时试试

加了,每次写了之后都加了HAL_Delay(30),还是不起作用
moyanming2013 回答时间:2015-12-29 15:38:45
yaowei 发表于 2015-12-29 15:34
加了,每次写了之后都加了HAL_Delay(30),还是不起作用

单次的传输是不是太大?看看频率最多支持多少,从底往上都要看
yaowei 回答时间:2015-12-29 15:57:00
moyanming2013 发表于 2015-12-29 15:38
单次的传输是不是太大?看看频率最多支持多少,从底往上都要看

情况是这样的  传输字节几百的话是没有问题的,现在传输的每次是4000多字节 就会出现这种错误的情况,你说的频率指的是哪个的频率
moyanming2013 回答时间:2015-12-30 12:29:44
SDIO有频率,CPU有主频,速度过快也不行啊,你最好折中速度,比如试试2000,再试试1000,或者3000等等。
yaowei 回答时间:2016-1-13 09:33:27
moyanming2013 发表于 2015-12-30 12:29
SDIO有频率,CPU有主频,速度过快也不行啊,你最好折中速度,比如试试2000,再试试1000,或者3000等等。 ...

是的,就是速度问题,但是现在又有问题了,就是连续写4个小时之后,可能write函数就会出现错误,这是啥原因
猪圈丶嗨情歌 回答时间:2016-1-13 10:55:59
我觉得堆内存大小不够的可能性还是有的,你可以调一下堆内存的大小试试。
moyanming2013 回答时间:2016-1-13 11:14:48
yaowei 发表于 2016-1-13 11:10
都改成0x1000,现在又来问题来:用文件系统操作sdio,cubemx里配置的生成的工程,现在的问题就是,每秒写 ...

如果是很有规律的4个小时,那么还是程序上哪有问题,没有好的办法,只有自己再看看程序、调试下
废鱼 回答时间:2016-1-13 11:33:20
从速度、缓冲区上做处理。当产生错误以后,重新初始化一下是否可以解决?
yaowei 回答时间:2016-1-13 13:48:07
安 发表于 2016-1-13 11:33
从速度、缓冲区上做处理。当产生错误以后,重新初始化一下是否可以解决? ...

速度已经降下去了,你说的缓冲区是指哪个
废鱼 回答时间:2016-1-13 19:13:45
接收数据放的缓冲区。
adlu 回答时间:2016-1-14 09:33:35
表示关注!
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版