OpenEdv-开源电子网

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

FATFS文件系统移植测试出现问题,求助!

[复制链接]

10

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2012-8-13
在线时间
0 小时
发表于 2012-8-26 23:06:42 | 显示全部楼层 |阅读模式
我一移植的FATFS文件系统,使用STM32F4的标准库。现在出了一个小问题,先上图




我重定向了printf输出到串口(这部分没有问题,单独的输出程序测试过),要用串口配合测试。下面是我的主函数

int main(void)
{
STM_EVAL_LEDInit(LED1);
STM_EVAL_LEDInit(LED2);
STM_EVAL_LEDInit(LED3);
STM_EVAL_LEDInit(LED4);
STM_EVAL_LEDOn(LED1);
STM_EVAL_LEDOn(LED2);
STM_EVAL_LEDOn(LED3);
STM_EVAL_LEDOn(LED4);
NVIC_Config();
COM1_Config();
printf ("汉字输出测试OK!\r\n");
printf ("System Infomation:\tSTM32 has been initialized !\r\n");
  STM_EVAL_LEDOff(LED3);
res = f_mount( 0, &fs);   // 注册SD卡的工作区域
printf ("f_mount result:\t\t");die (res);
STM_EVAL_LEDOff(LED1);
res = f_open ( &FileInfo, "0:Test/Test.txt", FA_OPEN_ALWAYS | FA_WRITE |FA_READ);
STM_EVAL_LEDOff(LED2);
 printf ("f_open result:\t\t");die (res);
STM_EVAL_LEDOff(LED3);
res = f_lseek ( &FileInfo, FileInfo.fsize );  // 将指针移到文件的末尾,以便添加数据
printf ("f_lseek result:\t\t");die (res);
res = f_write ( &FileInfo, Write_Test, sizeof (Write_Test) - 1, &bw );
printf ("f_write result:\t\t");die (res);  
if ( res == FR_OK ) 
{printf ("written succeed:\t\t%d byte\r\n", br );}
res = f_read (&FileInfo , ReadBuff , 512 , &br );
printf ("f_read statue:\t\t");die (res);
if(res==FR_OK)
printf ("f_write_result:%s\n",ReadBuff );
res = f_close ( &FileInfo );  
printf ("f_close result:\t\t");die (res);
STM_EVAL_LEDOff(LED4);

while (1);
}

程序实现读写没有任何问题(程序执行完用读卡器看过结果)也就是能顺利够执行到最后,问题是总是在执行到 printf ("f_open result:\t\t");这里串口就输出乱码如上图,然后就没输出了。单步跟踪了一下发现是在程序执行到这里时MDK会报“ can't access memory”错误。非常的不理解!这是为什么?
哪位大神能指导一下!!!

奋斗的小鸟,不是愤怒的小鸟
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-8-27 08:55:48 | 显示全部楼层
你哪个die(res);是什么意思?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2012-8-13
在线时间
0 小时
 楼主| 发表于 2012-8-27 12:47:55 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
是一个状态输出函数
void die ( FRESULT res )
{
switch (res)
{
case FR_OK: printf ("FR_OK");break;
case FR_DISK_ERR: printf ("FR_DISK_ERR");break;
case FR_INT_ERR: printf ("FR_INT_ERR");break;
case FR_NOT_READY: printf ("FR_NOT_READY");break;
case FR_NO_FILE: printf ("FR_NO_FILE");break;
case FR_NO_PATH: printf ("FR_NO_PATH");break;
case FR_INVALID_NAME: printf ("FR_INVALID_NAME");break;
case FR_DENIED: printf ("FR_DENIED");break;
case FR_EXIST: printf ("FR_EXIST");break;
case FR_INVALID_OBJECT: printf ("FR_INVALID_OBJECT");break;
case FR_WRITE_PROTECTED: printf ("FR_WRITE_PROTECTED");break;
case FR_INVALID_DRIVE: printf ("FR_INVALID_DRIVE");break;
case FR_NOT_ENABLED: printf ("FR_NOT_ENABLED");break;
case FR_NO_FILESYSTEM: printf ("FR_NO_FILESYSTEM");break;
case FR_MKFS_ABORTED: printf ("FR_MKFS_ABORTED");break;
case FR_TIMEOUT: printf ("FR_TIMEOUT");break;
case FR_LOCKED: printf ("FR_LOCKED");break;
case FR_NOT_ENOUGH_CORE: printf ("FR_NOT_ENOUGH_CORE");break;
case FR_TOO_MANY_OPEN_FILES: printf ("FR_TOO_MANY_OPEN_FILES");break;
}
printf ("\r\n");
}
奋斗的小鸟,不是愤怒的小鸟
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-8-27 12:50:08 | 显示全部楼层
回复【楼主位】chyw12:
---------------------------------
那个沙沙沙??比较奇特。呵呵
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2012-8-13
在线时间
0 小时
 楼主| 发表于 2012-8-27 12:59:11 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
是啊,很纠结,不知什么原因……
奋斗的小鸟,不是愤怒的小鸟
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-8-27 13:42:19 | 显示全部楼层
可能是你那个\t\t的问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2012-8-13
在线时间
0 小时
 楼主| 发表于 2012-8-28 11:30:47 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
谢谢原子哥的指导!!!
已经排除了\t\t出问题的可能性。现在的我现在找到的问题是出在FATFS的API函数与printf之间的冲突上。
比如我把文件写读函数注释掉(保留所有printf)之后只剩单纯的注册工作区注销工作区,然后就没问题了所有printf都能正常输出来!
所以肯定是他们两个之间的问题!
res = f_open ( &FileInfo, "0:Test/Test.txt", FA_OPEN_ALWAYS | FA_WRITE |FA_READ);
     printf ("f_open result:\t\t");die (res);
奋斗的小鸟,不是愤怒的小鸟
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-8-28 11:45:33 | 显示全部楼层
我也用fatfa和printf一起用没发现冲突。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2015-9-6
在线时间
1 小时
发表于 2015-9-6 16:07:50 | 显示全部楼层
楼主,看到你的帖子,我也在用文件系统,程序刚启动没问题,运行10分钟左右,再调用f_open()函数时返回FR_LOCKED,然后就不能写了,楼主遇到过这个问题吗
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2015-9-6
在线时间
1 小时
发表于 2015-9-7 11:36:00 | 显示全部楼层
回复【9楼】hannah_sjj:
问题暂时解决了,把FR_LOCKED功能暂时禁用,降低SDIO频率。
回复 支持 反对

使用道具 举报

2

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2015-10-24
在线时间
15 小时
发表于 2015-12-16 14:56:41 | 显示全部楼层
很明显,这个错误告诉你多次打开了,你打开了没有及时f_close...
你艹我,我艹你,都一样。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 02:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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