OpenEdv-开源电子网

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

关于移植fatfs调用exf_getfree返回错误问题

[复制链接]

21

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2013-1-10
在线时间
10 小时
发表于 2015-1-8 12:58:35 | 显示全部楼层 |阅读模式
5金钱
关于调用exf_getfree();函数获取sd卡错误,我追踪发现在chk_mounted ()里边返回的值0x0c;
u8 exf_getfree(u8 *drv,u32 *total,u32 *free)
{
FATFS *fs1;
u8 res;
    DWORD fre_clust=0, fre_sect=0, tot_sect=0;
    //得到磁盘信息及空闲簇数量
    res = f_getfree((const TCHAR*)drv, &fre_clust, &fs1);
    if(res==0)
{   
   tot_sect=(fs1->n_fatent-2)*fs1->csize; //得到总扇区数
   fre_sect=fre_clust*fs1->csize; //得到空闲扇区数   
#if _MAX_SS!=512   //扇区大小不是512字节,则转换为512字节
tot_sect*=fs1->ssize/512;
fre_sect*=fs1->ssize/512;
#endif  
*total=tot_sect>>1; //单位为KB
*free=fre_sect>>1; //单位为KB 
  }
return res;
}
?///////////////////////////////////////////////////////////////////////
static
FRESULT chk_mounted ( /* FR_OK(0): successful, !=0: any error occurred */
const TCHAR **path, /* Pointer to pointer to the path name (drive number) */
FATFS **rfs, /* Pointer to pointer to the found file system object */
BYTE chk_wp /* !=0: Check media write protection for write access */
)
{
BYTE fmt, b, pi, *tbl;
UINT vol;
DSTATUS stat;
DWORD bsect, fasize, tsect, sysect, nclst, szbfat;
WORD nrsv;
const TCHAR *p = *path;
FATFS *fs;

/* Get logical drive number from the path name */
vol = p[0] - '0'; /* Is there a drive number? */
if (vol <= 9 && p[1] == ':') { /* Found a drive number, get and strip it */
p += 2; *path = p; /* Return pointer to the path name */
} else { /* No drive number is given */
#if _FS_RPATH
vol = CurrVol; /* Use current drive */
#else
vol = 0; /* Use drive 0 */
#endif
}

/* Check if the file system object is valid or not */
if (vol >= _VOLUMES) /* Is the drive number valid? */
return FR_INVALID_DRIVE;
*rfs = fs = FatFs[vol]; /* Return pointer to the corresponding file system object */
if (!fs) return 
FR_NOT_ENABLED; /* Is the file system object available? */


边带颜色部分发现fs的值仍为0,所以返回0x0c,不知为什么?请求各位做过fatfs的指示一下,用的是原子哥的例程

最佳答案

查看完整内容[请看2#楼]

回复【4楼】雨山: --------------------------------- 你这代码看上去没问题。 用了内存管理么?fs是数组?还是指针?
个人博客www.xiaovdiy.cn
https://shop100764513.taobao.com/
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2015-1-8 12:58:36 | 显示全部楼层
回复【4楼】雨山:
---------------------------------
你这代码看上去没问题。
用了内存管理么?fs是数组?还是指针?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

70

主题

6758

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12995
金钱
12995
注册时间
2012-11-26
在线时间
3790 小时
发表于 2015-1-8 12:58:36 | 显示全部楼层
回复【6楼】雨山:
---------------------------------
没用内存管理,还指针,不是作死么
学无止境
回复

使用道具 举报

21

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2013-1-10
在线时间
10 小时
 楼主| 发表于 2015-1-8 17:32:59 | 显示全部楼层
顶一个要不就沉了
个人博客www.xiaovdiy.cn
https://shop100764513.taobao.com/
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2015-1-9 00:30:49 | 显示全部楼层
我们例程就可以测试这个函数,你测试代码怎么写的?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

21

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2013-1-10
在线时间
10 小时
 楼主| 发表于 2015-1-9 17:33:21 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
int main()
{
delay_init(72); //延时初始化
  
       BSPINTI();
while(SD_Initialize()) //检测SD卡
{
LCD_ShowString(60,150,200,16,16,"SD Card Error!");
delay_ms(200);
LCD_Fill(60,150,240,150+16,WHITE);//清除显示   
delay_ms(200);
LED0=!LED0;//DS0闪烁
}    
  //为fatfs相关变量申请内存  
   f_mount(0,fs[0]);    //挂载SD卡 
  f_mount(1,fs[1]);       //挂载FLASH.   
while(exf_getfree("0",&total,&free)) //得到SD卡的总容量和剩余容量
{

}
while(1);
}
个人博客www.xiaovdiy.cn
https://shop100764513.taobao.com/
回复

使用道具 举报

21

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2013-1-10
在线时间
10 小时
 楼主| 发表于 2015-1-15 09:36:33 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
没用内存管理,fs是指针
个人博客www.xiaovdiy.cn
https://shop100764513.taobao.com/
回复

使用道具 举报

21

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2013-1-10
在线时间
10 小时
 楼主| 发表于 2015-1-15 20:44:18 | 显示全部楼层

已解决 楼上真是一针见血 谢谢你们
个人博客www.xiaovdiy.cn
https://shop100764513.taobao.com/
回复

使用道具 举报

4

主题

18

帖子

0

精华

高级会员

Rank: 4

积分
741
金钱
741
注册时间
2015-5-9
在线时间
236 小时
发表于 2015-8-7 15:05:44 | 显示全部楼层
回复【8楼】雨山:
---------------------------------
请问楼上是怎么解决的,我最近也遇到了类似的问题,exf_getfree()得不到SD容量。
回复

使用道具 举报

21

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2013-1-10
在线时间
10 小时
 楼主| 发表于 2015-8-10 14:09:02 | 显示全部楼层
回复【9楼】龙云先生:
------------------------------
有答案了上边
个人博客www.xiaovdiy.cn
https://shop100764513.taobao.com/
回复

使用道具 举报

4

主题

18

帖子

0

精华

高级会员

Rank: 4

积分
741
金钱
741
注册时间
2015-5-9
在线时间
236 小时
发表于 2015-8-10 17:21:58 | 显示全部楼层
回复【10楼】雨山:
---------------------------------
我是新人,看的不清楚,上面的你之前说是有问题的是吗,没有调用内存管理的问题吗?
回复

使用道具 举报

21

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2013-1-10
在线时间
10 小时
 楼主| 发表于 2015-9-8 11:11:32 | 显示全部楼层
回复【11楼】龙云先生:
---------------------------------
个人博客www.xiaovdiy.cn
https://shop100764513.taobao.com/
回复

使用道具 举报

4

主题

33

帖子

0

精华

高级会员

Rank: 4

积分
552
金钱
552
注册时间
2016-4-10
在线时间
100 小时
发表于 2016-7-22 15:45:30 | 显示全部楼层
楼主,我的问题和已一样,你具体改了哪里?我还是找不出问题
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-6-17
在线时间
3 小时
发表于 2016-7-25 11:04:36 | 显示全部楼层
jermy_z 发表于 2015-1-8 12:58
回复【6楼】雨山:
---------------------------------
没用内存管理,还指针,不是作死么

大哥你好,我是新手,我想问一下,没有内存管理,就不能用指针了么?还是其他什么原因?
回复

使用道具 举报

25

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2016-6-2
在线时间
49 小时
发表于 2016-9-16 15:34:09 | 显示全部楼层
正点原子 发表于 2015-1-8 12:58
回复【4楼】雨山:
---------------------------------
你这代码看上去没问题。
用了内存管理么?fs是数组? ...

请教一下,我在和emWin一起使用时,发现一样问题。 我已经使用了内存管理。
回复

使用道具 举报

0

主题

1

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-9-24
在线时间
7 小时
发表于 2016-10-7 23:32:33 | 显示全部楼层
jermy_z 发表于 2015-1-8 12:58
回复【6楼】雨山:
---------------------------------
没用内存管理,还指针,不是作死么

你好,问一下,如何用内存管理,具体到这个例子,在哪里用?新手,谢谢
回复

使用道具 举报

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2016-8-5
在线时间
27 小时
发表于 2017-2-14 10:38:19 | 显示全部楼层
正点原子 发表于 2015-1-9 00:30
我们例程就可以测试这个函数,你测试代码怎么写的?

这个问题到底怎么解决啊?我也遇到了这个问题,LCD显示SD Card Fafts error
回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2017-1-7
在线时间
61 小时
发表于 2017-3-31 08:59:37 | 显示全部楼层
没初始化文件系统也会出现这种问题。。
回复

使用道具 举报

RIKI 该用户已被删除
发表于 2017-4-20 21:46:50 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

2

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2017-2-23
在线时间
28 小时
发表于 2017-12-1 10:55:12 | 显示全部楼层
我也遇到了这个问题,如何使用内存管理呢?
回复

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2099
金钱
2099
注册时间
2017-2-11
在线时间
306 小时
发表于 2020-9-28 18:53:10 | 显示全部楼层
我也遇到这个问题,直接用STM32CUBEIDE软件编程,发现f_getfree()一直返回错误12,请问楼上贴友们  解决了这个问题吗?
回复

使用道具 举报

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2021-8-2
在线时间
16 小时
发表于 2022-3-17 19:00:17 | 显示全部楼层
要先挂载SD卡在获取容量我就是这样然后正常读到数值了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-28 00:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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