硬汉嵌入式论坛

 找回密码
 立即注册
查看: 28848|回复: 9
收起左侧

[FatFs] V0.10b学习笔记---函数f_mount

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2014-6-4 21:10:28 | 显示全部楼层 |阅读模式
1.  函数原型
1.png
2.  参数解释
fatfs
    Pointer to the file system object to be registered. Null pointer unregistersthe registered file system object.
path
    Pointer to the nullterminated string that specifies the logical drive. If there is no drive number, it means the default drive.
opt
    Initialization option. 0: Do not mount now (to be mounted later), 1: Forcemounted the volume to check if the volume is available.
3. 函数描述
1.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2014-6-4 21:24:30 | 显示全部楼层
应用笔记
      要特别的注意以下两个地方:
1.  opt参数: Initialization option. 0: Do not mount now (to be mounted later), 1: Forcemounted the volume to check if the volume is available
     简单的说就是:如果设置opt参数为0,那么会在后面才执行加载操作,也就是说不管你是否外挂了设备,调用f_mount后,都会返回成功的。
     如果为1那么就会强制的进行加载操作。
2.  使用这个函数还要注意返回值的含义,在程序调试时很有意义:
    FR_OK, FR_INVALID_DRIVE, FR_DISK_ERR, FR_NOT_READY, FR_NO_FILESYSTEM


   
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2014-6-4 21:30:51 | 显示全部楼层
函数实例:
和以前的版本不同,这里要注意调用方法:

/* 挂载文件系统 */
result = f_mount(&fs, "1:/", 0);    /* Mount a logical drive */
/* 卸载文件系统 */
result  = f_mount(NULL, "1:/", 0);
   
通过下面这个函数可以更加方便的测试:

static const char * FR_Table[]=
{
    "FR_OK:成功",                                      /* (0) Succeeded */
    "FR_DISK_ERR:底层硬件错误",                      /* (1) A hard error occurred in the low level disk I/O layer */
    "FR_INT_ERR:断言失败",                              /* (2) Assertion failed */
    "FR_NOT_READY:物理驱动没有工作",                  /* (3) The physical drive cannot work */
    "FR_NO_FILE:文件不存在",                          /* (4) Could not find the file */
    "FR_NO_PATH:路径不存在",                          /* (5) Could not find the path */
    "FR_INVALID_NAME:无效文件名",                      /* (6) The path name format is invalid */
    "FR_DENIED:由于禁止访问或者目录已满访问被拒绝",  /* (7) Access denied due to prohibited access or directory full */
    "FR_EXIST:由于访问被禁止访问被拒绝",              /* (8) Access denied due to prohibited access */
    "FR_INVALID_OBJECT:文件或者目录对象无效",          /* (9) The file/directory object is invalid */
    "FR_WRITE_PROTECTED:物理驱动被写保护",              /* (10) The physical drive is write protected */
    "FR_INVALID_DRIVE:逻辑驱动号无效",                  /* (11) The logical drive number is invalid */
    "FR_NOT_ENABLED:卷中无工作区",                      /* (12) The volume has no work area */
    "FR_NO_FILESYSTEM:没有有效的FAT卷",              /* (13) There is no valid FAT volume */
    "FR_MKFS_ABORTED:由于参数错误f_mkfs()被终止",             /* (14) The f_mkfs() aborted due to any parameter error */
    "FR_TIMEOUT:在规定的时间内无法获得访问卷的许可",         /* (15) Could not get a grant to access the volume within defined period */
    "FR_LOCKED:由于文件共享策略操作被拒绝",                 /* (16) The operation is rejected according to the file sharing policy */
    "FR_NOT_ENOUGH_CORE:无法分配长文件名工作区",             /* (17) LFN working buffer could not be allocated */
    "FR_TOO_MANY_OPEN_FILES:当前打开的文件数大于_FS_SHARE", /* (18) Number of open files > _FS_SHARE */
    "FR_INVALID_PARAMETER:参数无效"                         /* (19) Given parameter is invalid */
};

测试函数**************************************************************************************************************************
void Test_f_mount(void)
{
    FRESULT result;
    FATFS fs;
   
    /* 挂载文件系统 */
  //  result = f_mount(&fs, "", 1);    /* Mount a logical drive */
    result = f_mount(&fs, "1:", 1);    /* Mount a logical drive */
    if (result != FR_OK)
    {
        printf("挂载文件系统失败 (%s)\\r\\n", FR_Table[result]);
    }
    else
    {
        printf("挂载文件系统成功 (%s)\\r\\n", FR_Table[result]);
    }
   
    /* 卸载文件系统 */
    result  = f_mount(NULL, "1:", 1);
    if (result != FR_OK)
    {
        printf("卸载文件系统失败 (%s)\\r\\n", FR_Table[result]);
    }
    else
    {
        printf("卸载文件系统成功 (%s)\\r\\n", FR_Table[result]);
    }
   
}

在fatfs外挂一个设备的时候,通过 f_mount(&fs, "", 1);就可以访问,而在多个设备时,就得指定磁盘号
    支持以下两种方式:
      f_mount(&fs, "1:", 1);
      f_mount(&fs, "1:/", 1);
      这种方式不支持:
      f_mount(&fs, "1", 1);
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2014-6-4 21:32:24 | 显示全部楼层
函数源码框架简易分析:

回复

使用道具 举报

1

主题

9

回帖

1

积分

新手上路

积分
1
发表于 2014-8-21 16:13:51 | 显示全部楼层
res = f_mount(&fs,"0:",0);
        /* function disk_initialize() has been called in f_open */
        if(res == FR_OK)
            GUI_DispStringAt ("f_mount...",5,20);
        
        
        /* Create new file on the drive 0 */
        res = f_open(&fnew, "0:fats_test.txt", FA_CREATE_ALWAYS | FA_WRITE );
        if(res == FR_OK)
            GUI_DispStringAt ("f_open :fats_test.txt ...",5,40);

在执行res = f_open(&fnew, "0:fats_test.txt", FA_CREATE_ALWAYS | FA_WRITE );后返回FR_NO_FILESYSTEM,不清楚问题出在哪里?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2014-8-21 18:03:02 | 显示全部楼层

回 taven_song 的帖子

taven_song:res = f_mount(&fs,"0:",0);
        /* function disk_initialize() has been called in f_open */
        if(res == FR_OK)
         .. (2014-08-21 16:13) 
检测下你的SD有问题没有。
回复

使用道具 举报

0

主题

1

回帖

0

积分

新手上路

积分
0
发表于 2014-12-22 14:54:10 | 显示全部楼层
买的开发板中sd卡例程写道:配置的GPIO的SD_Init()函数在执行f_mount()挂载文件系统时会调用,因此没有在bsp.c中添加SDIO初始化,但是在f_mount()中我没发现有初始化的代码,求教具体在哪里
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2014-12-23 10:11:07 | 显示全部楼层

回 caomengchao 的帖子

caomengchao:买的开发板中sd卡例程写道:配置的GPIO的SD_Init()函数在执行f_mount()挂载文件系统时会调用,因此没有在bsp.c中添加SDIO初始化,但是在f_mount()中我没发现有初始化的代码,求教具体在哪里 (2014-12-22 14:54) 
在文件diskio.c里面
回复

使用道具 举报

8

主题

54

回帖

78

积分

初级会员

~

积分
78
QQ
发表于 2017-9-7 19:45:43 | 显示全部楼层
版主,我是在SPI_FLASH上挂载Fatfs,初始化Flash后,然后f_mount挂载文件系统,返回的是FR_DISK_ERR,底层硬件错误,这是什么原因?挂载文件不成功。。。
~~~~~
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2017-9-8 08:56:50 | 显示全部楼层

回 like_888 的帖子

like_888:版主,我是在SPI_FLASH上挂载Fatfs,初始化Flash后,然后f_mount挂载文件系统,返回的是FR_DISK_ERR,底层硬件错误,这是什么原因?挂载文件不成功。。。 (2017-09-07 19:45)
参考我们这个搞搞看:http://www.armbbs.cn/forum.php?mod=viewthread&tid=14894

估计是底层接口部分有问题,主要看diskio.C文件。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-28 14:45 , Processed in 0.275883 second(s), 34 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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