精华内容
下载资源
问答
  • f_mount函数

    千次阅读 2019-08-14 14:56:50
    f_mount The f_mount fucntion registers/unregisters filesystem object to the FatFs module. FRESULT f_mount ( FATFS* fs, /* [IN] Filesystem object */ const TCHAR* path, /* [IN] Logical d...

    f_mount

    The f_mount fucntion registers/unregisters filesystem object to the FatFs module.

    FRESULT f_mount (
      FATFS*       fs,    /* [IN] Filesystem object */
      const TCHAR* path,  /* [IN] Logical drive number */
      BYTE         opt    /* [IN] Initialization option */
    );

    Parameters

    fs
        Pointer to the filesystem object to be registered and cleared. Null pointer unregisters the registered filesystem object.
    path
        Pointer to the null-terminated string that specifies the logical drive. The string without drive number means the default drive.
    opt
        Mounting option. 0: Do not mount now (to be mounted on the first access to the volume), 1: Force mounted the volume to check if it is ready to work.

    Return Values

    FR_OK, FR_INVALID_DRIVE, FR_DISK_ERR, FR_NOT_READY, FR_NOT_ENABLED, FR_NO_FILESYSTEM
    Description

    FatFs needs work area (filesystem object) for each logical drives (FAT volumes). Prior to perform file/directory operations, a filesystem object needs to be registered with f_mount function to the logical drive. The file/directory API functions get ready to work after this procedure. If there is any open object of file or directory on the logical drive, the object will be invalidated by this function.

    The f_mount function registers/unregisters a filesystem object to the FatFs module as follows:

        Determines the logical drive which specified by path.
        Clears and unregisters the regsitered work area of the volume if exist.
        Clears and registers the new work area to the volume if fs is not NULL.
        Performs volume mount process to the volume if forced mounting is specified.

    If forced mounting is not specified (opt = 0), this function always succeeds regardless of the physical drive status. It only clears (de-initializes) the given work area and registers its address to the internal table and no activity of the physical drive in this function. To unregister the work area, specify a NULL to the fs, and then the work area can be discarded. The volume mount processes, initialize the corresponding physical drive, find the FAT volume in it and then initialize the work area, is performed in the subsequent file/directory functions when either of following conditions is true.

        Filesystem object has not been initialized. It is de-initialized by f_mount function.
        Physical drive is not initialized. It is de-initialized by system reset or media removal.

    If the function with forced mounting (opt = 1) failed, it means that the filesystem object has been registered successfully but the volume is currently not ready to work. The volume mount process will be attempted at subsequent file/directroy functions if the filesystem object is not initialized. (delayed mounting)

    If implementation of the disk I/O layer lacks asynchronous media change detection, application program needs to perform f_mount function after each media change to force cleared the filesystem object.
    QuickInfo

    Always available.
    Example

    int main (void)
    {
        FATFS *fs;     /* Ponter to the filesystem object */


        fs = malloc(sizeof (FATFS));           /* Get work area for the volume */
        f_mount(fs, "", 0);                    /* Mount the default drive */

        f_open(...                             /* Here any file API can be used */

        ...

        f_mount(fs, "", 0);                    /* Re-mount the default drive to reinitialize the filesystem */

        ...

        f_mount(0, "", 0);                     /* Unmount the default drive */
        free(fs);                              /* Here the work area can be discarded */

        ...
    }

       要特别的注意以下两个地方:
    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
    函数实例:
    和以前的版本不同,这里要注意调用方法:

    /* 挂载文件系统 */
    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);
    ---------------------
    版权声明:本文为CSDN博主「lbaihao」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/lbaihao/article/details/75144011

    展开全文
  • fatfs文件系统详解之f_mount函数分析

    千次阅读 2020-05-23 19:33:37
    前序 上一篇分析了格式化一个磁盘的时候发生了什么,在格式化一个...f_mount()函数全部代码 为了方便分析,排除视觉障碍,已经删除了不在假设范围内代码。 /*----------------------------------------------..

    前序

    上一篇分析了格式化一个磁盘的时候发生了什么,在格式化一个磁盘之后,就要将磁盘进行挂载,“挂载”这个词听起来很抽象,但是在软件代码上,到底发生了什么?

     

    分析假设

    (1)假设一个磁盘就一个分区。

    (2)只分析FAT32文件系统相关的代码。

    (3)函数的大部分分析,都写入代码注释中

     

    f_mount()函数全部代码

    为了方便分析,排除视觉障碍,已经删除了不在假设范围内代码。

    FRESULT f_mount (
    	FATFS* fs,			/* fat文件系统描述的一个结构体,需要用户进行分配,然后会被记录在全局的FATFS[]这个数组中 */
    	const TCHAR* path,	/* 物理磁盘 */
    	BYTE opt			/* 挂载选项,1-代表立马挂载,从代码分析中知,这个值必须传入1 */
    )
    {
    	FATFS *cfs;
    	int vol;
    	FRESULT res;
    	const TCHAR *rp = path;
    
    
    	/* 获取驱动号,为了找到FatFs[]数组中的空闲项 */
    	vol = get_ldnumber(&rp);
    	if (vol < 0) return FR_INVALID_DRIVE;
    	cfs = FatFs[vol];					/* Pointer to fs object */
    
    	if (cfs) {
    #if _FS_LOCK != 0
    		clear_lock(cfs);
    #endif
    #if _FS_REENTRANT						/* Discard sync object of the current volume */
    		if (!ff_del_syncobj(cfs->sobj)) return FR_INT_ERR;
    #endif
    		cfs->fs_type = 0;				/* Clear old fs object */
    	}
    
    	if (fs) {
    		fs->fs_type = 0;				/* Clear new fs object */
    #if _FS_REENTRANT						/* Create sync object for the new volume */
    		if (!ff_cre_syncobj((BYTE)vol, &fs->sobj)) return FR_INT_ERR;
    #endif
    	}
    
        /* 把用户分配的FATFS结构图放入全局数组指针中 */
    	FatFs[vol] = fs;					/* Register new fs object */
    
    	if (!fs || opt != 1) return FR_OK;	/* Do not mount now, it will be mounted later */
        
        /* 这个函数才是挂载时的关键所在 */
    	res = find_volume(&path, &fs, 0);	/* Force mounted the volume */
    	LEAVE_FF(fs, res);
    }
    

    从f_mount函数分析中可知,find_volume()函数才是挂载的核心代码,

    
    static
    FRESULT find_volume (	/* FR_OK(0): successful, !=0: any error occurred */
    	const TCHAR** path,	/* 硬件磁盘,与f_mount函数的参数是一致的 */
    	FATFS** rfs,		/* 与f_mount函数的fs参数是一致的 */
    	BYTE mode			/* 这个传入的是0 */
    )
    {
    	BYTE fmt, *pt;
    	int vol;
    	DSTATUS stat;
    	DWORD bsect, fasize, tsect, sysect, nclst, szbfat, br[4];
    	WORD nrsv;
    	FATFS *fs;
    	UINT i;
    
    
    	/* Get logical drive number */
    	*rfs = 0;
    	vol = get_ldnumber(path);
    	if (vol < 0) return FR_INVALID_DRIVE;
    
    	/* Check if the file system object is valid or not */
        /* 1.找到用户分配的FATFS结构体 */
    	fs = FatFs[vol];					/* Get pointer to the file system object */
    	if (!fs) return FR_NOT_ENABLED;		/* Is the file system object available? */
    
    	ENTER_FF(fs);						/* Lock the volume */
    	*rfs = fs;							/* Return pointer to the file system object */
    
    	mode &= (BYTE)~FA_READ;				/* Desired access mode, write access or not */
    
        /* 判定磁盘当前状态,如果磁盘被初始化过,那么就判定是挂载过了,直接返回OK */
    	if (fs->fs_type) {					/* If the volume has been mounted */
    		stat = disk_status(fs->drv);
    		if (!(stat & STA_NOINIT)) {		/* and the physical drive is kept initialized */
    			if (!_FS_READONLY && mode && (stat & STA_PROTECT)) {	/* Check write protection if needed */
    				return FR_WRITE_PROTECTED;
    			}
    			return FR_OK;				/* The file system object is valid */
    		}
    	}
    
    	/* The file system object is not valid. */
    	/* Following code attempts to mount the volume. (analyze BPB and initialize the fs object) */
    
        /* 2.进行FATFS结构体填充 */
    	fs->fs_type = 0;					/* Clear the file system object */
    	fs->drv = LD2PD(vol);				/* Bind the logical drive and a physical drive */
    
        /* 2.1初始化磁盘 */
    	stat = disk_initialize(fs->drv);	/* Initialize the physical drive */
    	if (stat & STA_NOINIT) { 			/* Check if the initialization succeeded */
    		return FR_NOT_READY;			/* Failed to initialize due to no medium or hard error */
    	}
    	if (!_FS_READONLY && mode && (stat & STA_PROTECT)) { /* Check disk write protection if needed */
    		return FR_WRITE_PROTECTED;
    	}
    	/* Find an FAT partition on the drive. Supports only generic partitioning, FDISK and SFD. */
    	bsect = 0;
    
        /* 2.2 check_fs()函数会把磁盘的第1个扇区(就是MBR)读入到fs->win[]数组中, 判断MBR是否是合法的MBR*/
    	fmt = check_fs(fs, bsect);			/* Load sector 0 and check if it is an FAT-VBR as SFD */
    
        /* 2.3 fmt=0,说明是FAT32文件系统 */
    	if (fmt == 2 || (fmt < 2 && LD2PT(vol) != 0)) {	/* Not an FAT-VBR or forced partition number */
    		for (i = 0; i < 4; i++) {			/* Get partition offset */
    			pt = fs->win + (MBR_Table + i * SZ_PTE);
    			br[i] = pt[PTE_System] ? ld_dword(pt + PTE_StLba) : 0;
    		}
    		i = LD2PT(vol);						/* Partition number: 0:auto, 1-4:forced */
    		if (i) i--;
    		do {								/* Find an FAT volume */
    			bsect = br[i];
    			fmt = bsect ? check_fs(fs, bsect) : 3;	/* Check the partition */
    		} while (!LD2PT(vol) && fmt >= 2 && ++i < 4);
    	}
    	if (fmt == 4) return FR_DISK_ERR;		/* An error occured in the disk I/O layer */
    	if (fmt >= 2) return FR_NO_FILESYSTEM;	/* No FAT volume is found */
    
    	/* An FAT volume is found. Following code initializes the file system object */
    
    	{
    	    /* 读取MBR中的BPB_BytsPerSec域,判断扇区大小是否是512(SS(fs)) */
    		if (ld_word(fs->win + BPB_BytsPerSec) != SS(fs)) return FR_NO_FILESYSTEM;	/* (BPB_BytsPerSec must be equal to the physical sector size) */
    
            /* 2.4获取FAT表的大小、FAT表的个数、每个簇的扇区数、根目录项数(对于FAT32不存在这个)、磁盘簇的个数、MBR、FAT表、数据区的位置、 */
    		fasize = ld_word(fs->win + BPB_FATSz16);			/* Number of sectors per FAT */
    		if (fasize == 0) fasize = ld_dword(fs->win + BPB_FATSz32);
    		fs->fsize = fasize;
    
    		fs->n_fats = fs->win[BPB_NumFATs];					/* Number of FATs */
    		if (fs->n_fats != 1 && fs->n_fats != 2) return FR_NO_FILESYSTEM;	/* (Must be 1 or 2) */
    		fasize *= fs->n_fats;								/* Number of sectors for FAT area */
    
    		fs->csize = fs->win[BPB_SecPerClus];				/* Cluster size */
    		if (fs->csize == 0 || (fs->csize & (fs->csize - 1))) return FR_NO_FILESYSTEM;	/* (Must be power of 2) */
    
    		fs->n_rootdir = ld_word(fs->win + BPB_RootEntCnt);	/* Number of root directory entries */
    		if (fs->n_rootdir % (SS(fs) / SZDIRE)) return FR_NO_FILESYSTEM;	/* (Must be sector aligned) */
    
    		tsect = ld_word(fs->win + BPB_TotSec16);			/* Number of sectors on the volume */
    		if (tsect == 0) tsect = ld_dword(fs->win + BPB_TotSec32);
    
    		nrsv = ld_word(fs->win + BPB_RsvdSecCnt);			/* Number of reserved sectors */
    		if (nrsv == 0) return FR_NO_FILESYSTEM;				/* (Must not be 0) */
    
    		/* Determine the FAT sub type */
    		sysect = nrsv + fasize + fs->n_rootdir / (SS(fs) / SZDIRE);	/* RSV + FAT + DIR */
    		if (tsect < sysect) return FR_NO_FILESYSTEM;		/* (Invalid volume size) */
    		nclst = (tsect - sysect) / fs->csize;				/* Number of clusters */
    		if (nclst == 0) return FR_NO_FILESYSTEM;			/* (Invalid volume size) */
    		fmt = FS_FAT32;
    		if (nclst <= MAX_FAT16) fmt = FS_FAT16;
    		if (nclst <= MAX_FAT12) fmt = FS_FAT12;
    
    		/* Boundaries and Limits */
    		fs->n_fatent = nclst + 2;							/* Number of FAT entries */
    		fs->volbase = bsect;								/* Volume start sector */
    		fs->fatbase = bsect + nrsv; 						/* FAT start sector */
    		fs->database = bsect + sysect;						/* Data start sector */
    		if (fmt == FS_FAT32) {
    			if (ld_word(fs->win + BPB_FSVer32) != 0) return FR_NO_FILESYSTEM;	/* (Must be FAT32 revision 0.0) */
    			if (fs->n_rootdir) return FR_NO_FILESYSTEM;		/* (BPB_RootEntCnt must be 0) */
    			fs->dirbase = ld_dword(fs->win + BPB_RootClus32);	/* Root directory start cluster */
    			szbfat = fs->n_fatent * 4;						/* (Needed FAT size) */
    		} else {
    			if (fs->n_rootdir == 0)	return FR_NO_FILESYSTEM;/* (BPB_RootEntCnt must not be 0) */
    			fs->dirbase = fs->fatbase + fasize;				/* Root directory start sector */
    			szbfat = (fmt == FS_FAT16) ?					/* (Needed FAT size) */
    				fs->n_fatent * 2 : fs->n_fatent * 3 / 2 + (fs->n_fatent & 1);
    		}
    		if (fs->fsize < (szbfat + (SS(fs) - 1)) / SS(fs)) return FR_NO_FILESYSTEM;	/* (BPB_FATSz must not be less than the size needed) */
    
    #if !_FS_READONLY
    		/* Get FSINFO if available */
    		fs->last_clst = fs->free_clst = 0xFFFFFFFF;		/* Initialize cluster allocation information */
    		fs->fsi_flag = 0x80;
    #if (_FS_NOFSINFO & 3) != 3
            /* 2.5判断是否存在FSINFO扇区,如果存在则读出可用簇数、下一个可用簇号到FATFS结构体中 */
    		if (fmt == FS_FAT32				/* Enable FSINFO only if FAT32 and BPB_FSInfo32 == 1 */
    			&& ld_word(fs->win + BPB_FSInfo32) == 1
    			&& move_window(fs, bsect + 1) == FR_OK)
    		{
    			fs->fsi_flag = 0;
    			if (ld_word(fs->win + BS_55AA) == 0xAA55	/* Load FSINFO data if available */
    				&& ld_dword(fs->win + FSI_LeadSig) == 0x41615252
    				&& ld_dword(fs->win + FSI_StrucSig) == 0x61417272)
    			{
    #if (_FS_NOFSINFO & 1) == 0
    				fs->free_clst = ld_dword(fs->win + FSI_Free_Count);
    #endif
    #if (_FS_NOFSINFO & 2) == 0
    				fs->last_clst = ld_dword(fs->win + FSI_Nxt_Free);
    #endif
    			}
    		}
    #endif	/* (_FS_NOFSINFO & 3) != 3 */
    #endif	/* !_FS_READONLY */
    	}
    
    	fs->fs_type = fmt;	/* FAT sub-type */
    	fs->id = ++Fsid;	/* File system mount ID */
    #if _USE_LFN == 1
    	fs->lfnbuf = LfnBuf;	/* Static LFN working buffer */
    #if _FS_EXFAT
    	fs->dirbuf = DirBuf;	/* Static directory block working buuffer */
    #endif
    #endif
    #if _FS_RPATH != 0
    	fs->cdir = 0;		/* Initialize current directory */
    #endif
    #if _FS_LOCK != 0		/* Clear file lock semaphores */
    	clear_lock(fs);
    #endif
    	return FR_OK;
    }
    

    总结

    f_mount函数就是读出MBR扇区的内容放入FATFS结构图中,供以后使用。

     

    展开全文
  • 这两天学着用了一下FATS文件系统,虽然工作中没用到,但是对个人的经验积累还是有用的。...FRESULT f_mount ( FATFS* fs, /* Pointer to the filesystem object (NULL:unmount)*/ const TCHAR* ...
    这两天学着用了一下FATS文件系统,虽然工作中没用到,但是对个人的经验积累还是有用的。看了一下,代码并不多,但是精简啊,指针跳来跳去的一不小心就晕了。
    所以也遇到了不少问题啊。

     

    这里就讲一下我遇到的第一步就懵逼的问题。

     

    那就是

    FRESULT f_mount (
            FATFS* fs,                        /* Pointer to the filesystem object (NULL:unmount)*/
            const TCHAR* path,        /* Logical drive number to be mounted/unmounted */
            BYTE opt                        /* Mode option 0o not mount (delayed mount), 1:Mount immediately */
    )

    使用的是SDIO带闪迪1G的TF卡,根据说明和0.9版本使用例程我这样写f_mount(&fs , "" , 1);
    返回值0没有问题,高兴的想读个文件试试。
    res =f_open(&fsrc,"0:/test.txt",FA_OPEN_EXISTING | FA_READ); // 打开文件
    结果返回13。

     

    上面就是我杠上的原因,挂载成功了你却告诉我没有文件系统。
    然后跟踪f_open函数里面调用了find_volume 判断逻辑驱动号,如果需要的话就挂载。
    继续跟踪find_volume里面调用了vol = get_ldnumber获取逻辑驱动号  返回的是0
    然后回到find_volume
    fs->pdrv = LD2PD(vol),修改了pdrv.
    然后下一句是
     
    stat = disk_initialize(fs->pdrv);好吧,这里终于到了接口文件diskio.c里面.
     
    跟踪进去一看,
    [mw_shl_code=c,true]DSTATUS disk_initialize (
            BYTE pdrv                                /* Physical drive nmuber to identify the drive */
    )
    {
            DSTATUS stat;
            int result;

            switch (pdrv) {
            case DEV_RAM :
    //                result = RAM_disk_initialize();
                    // translate the reslut code here
                    return stat;
            case DEV_MMC :
    //                result = MMC_disk_initialize();
                    // translate the reslut code here
                    return stat;
            case DEV_USB :
    //                result = USB_disk_initialize();
                    // translate the reslut code here
                    return stat;
            }
            return STA_NOINIT;
    }
    [/mw_shl_code]
    根据传入参数0,到了case DEV_RAM: 问题来了,我是TF卡啊,这里应该是case DEV_MMC:啊。
    那这就好理解了,传入参数有问题,应该是1.
    这个传入参数是从这里出来的vol = get_ldnumber那就进这个函数仔细看吧。
     
    int get_ldnumber (            /* Returns logical drive number(-1:invalid drive) */
             const TCHAR** path        /*Pointer to pointer to the path name */
    )
     
    输入参数是path地址,我的地址是    "0:/test.txt"   ,
    程序里判断句

    i = *tp++,也就是地址冒号前的'0'。
    经过下面的一段


    i  -='0';  // i = 0;
    所以返回的vol就成了0!!!好嘛!原来是这里啊。
    那我就改成res = f_open(&fsrc,"1:/test.txt",FA_OPEN_EXISTING |FA_READ);
    擦,结果错误返回的是11,FR_INVALID_DRIVE 逻辑驱动号错误???
    好,继续查,找到在f_mount里面
     
             /*Get logical drive number */
             vol= get_ldnumber(&rp);
             if(vol < 0) return FR_INVALID_DRIVE;
     
    意思我的 get_ldnumber返回的不是1?

     

    开启调试模式返回的竟然是0XFFFFFFF即   -1。

    又到get_ldnumber里面看到

    if ((i -= '0') < FF_VOLUMES) {        /* If drive id is found, get the valueand strip it */

     

    这里FF_VOLUMES 在ffconfig.h里面定义的是1

     

    #define FF_VOLUMES                1
    /* Number of volumes (logical drives) to beused. (1-10) */

     

    导致我的i -= '0',   i =1;  不满足< FF_VOLUMES导致返回了vol的初始化值 -1.

     

    那好啊,我修改一下FF_VOLUMES =2

     

    擦,结果返回了错误12,逻辑驱动没有工作区域,那我刚才挂载的呢!等等,我刚才挂载的是地址是默认地址""  ,而默认地址是0:啊。来来来,赶快修改成
    f_mount(&fs,"1:",1);


     

    编译,下载!见证奇迹的时刻到了,成功读到了文件。

     

    回头总结一下问题,主要是逻辑驱动号没弄好,因为diskio.c的默认分了三种类型的存储类型RAM/MMC/USB
    而默认的是RAM所以,如果在不修改它的框架情况下,就要逻辑驱动号对应。

     

    TF卡对应MMC所以要地址要是   1:         ,ffconfig里默认了只有一个逻辑驱动号0所以需要修改设置

     

    FF_VOLUMES = 2
    程序这样写
    f_mount(&fs,"1:",1);
    f_open(&fsrc,"1:/test.txt",FA_OPEN_EXISTING| FA_READ);

     

    FAT 0.13 f_mount(&fs,"",1)挂载失败的原因-OpenEdv-开源电子网

    展开全文
  • stm32f407 FATFS f_mount 失败问题

    千次阅读 2020-04-29 01:53:20
    在CubeMX 如果配置了RTC 和SD 卡, FATFS , 则 “__HAL_SD_ENABLE(hsd);” 执行失败, SDI 时钟控制寄存器 (SDIO_CLKCR->CLKEN ) 位不能写入! 并且在时钟系统初始化时总是产生“超时”错误!...
    在CubeMX 如果配置了RTC  和SD 卡, FATFS ,  则 “__HAL_SD_ENABLE(hsd);” 执行失败, SDI 时钟控制寄存器 (SDIO_CLKCR->CLKEN ) 位不能写入!

    并且在时钟系统初始化时总是产生“超时”错误!

    原因未知!

    经反复测试同样的文件读写程序,如果不用RTC 模块则读写正常,用RTC 就不能工作,折腾2天发现:

    问题不是出在RTC 软件,而是RTC的32.768KHZ石英震荡电路不起震导致,改用内部RC 时钟源,一切功能OK .

     

     

     

     STM32 的低速晶振电路有问题,网上早有讨论,这是一个旧疾,今天让我撞上!

     

     

    展开全文
  • fatfs f_mount返回值是13 解决方法

    千次阅读 2020-04-11 16:41:31
    这里写自定义目录标题fatfs f_mount返回值是13 解决方法 fatfs f_mount返回值是13 解决方法 int res = f_mount(&USERFatFS,USERPath,1);//挂载文件系统 当f_mount返回值是13 对应解释为 FR_NO_FILESYSTEM, /*...
  • fatfs 学习笔记--f_mount用法

    万次阅读 2017-07-15 09:59:42
    f_mount The f_mount fucntion registers/unregisters filesystem object to the FatFs module. FRESULT f_mount ( FATFS* fs, /* [IN] Filesystem object */ const TCHAR* path, /* [IN] Logical
  • 当我使用f_mount挂载fatFs后,再卸载,然后挂载FatFs,显示的是挂载成功,但是实际上当我去对文件进行操作的时候,返回FR_NOT_ENABLED,也就是说明挂载是失败的 经过测试,卸载文件系统的时候,实际上是把指针数组...
  • f_mount怎么个用法?

    万次阅读 2018-11-27 08:53:03
    fatfs 学习笔记--f_mount用法 这个文章后面的评论: 疯小草: 我补充一下吧,其实只有一个设备的时候也并不是f_mount(&amp;fs,"",1)就是对的,这牵扯到了ffconf.h里面的默认设置FF_VOLUMES 是1,...
  • 在进行vavido 2018.3 软件进行ZYNQ芯片 SD卡读写测试时,遇到一个问题:undefined reference to `f_mount’,未找到该函数的定义。添加了ff.h头文件但是还是有问题 操作过程:SDK Properties -> C/C++ Build -&...
  • STM32F7使用SDMMC外设移植FatFs遇到f_mount()挂载成功,而f_open函数未运行的解决方法功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表...
  •  result = f_mount(FS_SD, &amp;fs); /* Mount a logical drive */  写了个函数换了个位置,竟然不好用了!最终发现换了位置后,fs没有被分配固定内存。  所以要fs前面加个static就好了!  这个问题搞了...
  • FRESULT f_mount {  BYTE vol, /逻辑驱动器号(0~9)/  FATFS fs / 工作区指针(NULL为注销)*/ } 返回值: FR_OK(0)——函数成功 FR_INVALID_DRIVE——驱动器号无效 说明:  f_mount函数在FatFs模块上注册/...
  • f_write返回值为1,则就是FR_DISK_ERR, /* (1) A hard error occurred in the low level disk I/O layer */ 低级磁盘I/O层中发生硬错误 问题解决方式: 1 更改写扇区函数 2 每次写了之后(f_write)都加一个小...
  • subnets = " subnet-abcd1234,subnet-efgh5678 " vpc_id = " vpc-abcd1234 " } 参数参考 支持以下参数: name (必需)文件系统的reference_name。 另外,在标签中使用。 subnets -(必填)安装目标将位于的子网...
  • 关于f_open遇见的FR_DISK_ERR问题

    千次阅读 2017-08-16 09:46:16
    我想做一个usb_host,usb插入就新建一个文件,通过移植的开源的代码,利用f_open在新建TXT文件的时候总是返回FR_DISK_ERR。 造成这个原因有很多,每个人可能遇见的都不一样,我是自己程序执行的顺序有问题。。代码...
  • 环境: STM32F205 移植 fatfs v.12 问题描述: 遇见通过fatfs 向 读卡器写入文件数据时。写入第一个文件正常。 过程:先f_mount()然后f_open()。...在写入第二个文件时,f_mount()与f_open()均报错...
  • FAFTS文件系统常用函数学习

    千次阅读 2020-09-10 15:58:01
    /* File read/write count */ ​ ​ /* Gives work area to each logical drive */ f_mount(&fs0, "0:", 0); f_mount(&fs1, "1:", 0); ​ /* Open source file on the drive 1 */ fr = f_open(&fsrc, "1:file.bin",...
  • 【STM32-FatFs】FatFs——f_mkfs

    千次阅读 2018-05-28 14:30:08
    f_mkfs The f_mkfs fucntion creates an FAT/exFAT volume on the logical drive. FRESULT f_mkfs ( const TCHAR* path, /* [IN] Logical drive number */ BYTE opt, /* [IN] Format options */ ...
  • 1、函数disk_ioctl()内部*(FFDWORD *)buff = FATFS_FLASH_SECTOR_SIZE;这句代码在有些M0的arm核上会硬件错误,...2、写测试函数时,FATFS定义的变量最好是全局变量,否则可能因为栈空间不足出现奇怪问题,如f_open返回F
  • FatFs读写SD卡出现FR_NO_FILESYSTEM解决方法.
  • 从零实现 FATFS+SD卡

    千次阅读 2020-03-24 17:47:26
    cubemx软件版本是V4.23.0,芯片型号是STM32F103ZET6、STM32F429IGT6;SD卡是闪迪的64G tf卡,然后用了转大卡的卡槽,exFAT。 该篇为调试过程,所以阅读时一定要看到尾,中间的判断是有误的!!!中间会涉及到F429是...
  • FatFs中文资料以及 所有的API函数使用详解
  • f_mkfs() 应在 f_mount()之后,否则出现,无工作区的错位。不经意容易犯错。呵呵。 FR_NOT_ENABLED  逻辑驱动器没有工作区。 基本知识. 1.从MBR说起. MBR(Master Boot Record, 主...
  • STM32Cube配置SdCard+DMA+FatFs

    千次阅读 2019-05-08 23:02:03
    f_res = f_mount(&SDFatFS,(TCHAR const*)SDPath,1); // f_mount(&SDFatFS, (TCHAR const*)SDPath, 1); /*----------------------- 格式化测试 ---------------------------*/ /* 如果没有文件系统就格式...
  • 在移植fatfs文件系统后,可以读写文件系统,但是在读写过程中一直出现FR_DISK_ERR错误,以为是底层函数编写有问题,一直无法解决问题,后经过多方查阅资料,怀疑是SDIO访问时钟频率过高导致,将SDIO时钟频率调低后经...
  • 经过上一篇的分析,目前已经知道mount函数最终进入到mount.c 中的int fuse_kern_mount(const char *mountpoint, struct fuse_args *args) 而主题函数进入到fuse.c中的 fuse_new_common 这两个函数都会在helper.c...
  • 利用fatfs进行文件管理

    千次阅读 2018-08-14 16:15:26
    //利用f_mount挂载SD卡 f_mkdir(file_main_path); //利用f_mkdir创建一个文件夹 f_mkdir(file_path); //利用f_mkdir创建子文件夹,这里主要是通过file_path实现。 FileOpenForRD(readme_path, &gfhReadMe); ...
  • f_mount() 、 f_open() 、 f_write() 、 f_read() 就可以实现文件的读写操作。 FatFs 组件是 FatFs 的主体,文件都在源码 src 文件夹中,其中 ff.c 、 ff.h 、 integer.h 以及 diskio.h 四个文件我们不需要改动,...
  • stm32 sd fatfs应用理解

    千次阅读 2019-10-15 13:41:35
    f_mount(&SDFatFs, (TCHAR const*)SDPath, 0) 3. Create a FAT file system (format) on the logical drive f_mkfs((TCHAR const*)SDPath, FM_ANY, 0, buffer, sizeof(buffer)) 4. Create and Open a new text ...
  • f_mount(&fs,"0:",1); res = f_open(&fdst,"0:/music.wav",FA_READ); if(res==FR_OK) { brw = 0; while(1) { res = f_read(&fdst,ReadBuff,sizeof(ReadBuff),&brw) if(res||brw==0) break; while...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 134,527
精华内容 53,810
关键字:

f_mount