OpenEdv-开源电子网

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

关于FATFS文件系统的相关问题

[复制链接]

23

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
365
金钱
365
注册时间
2018-3-21
在线时间
64 小时
发表于 2022-7-23 10:54:23 | 显示全部楼层 |阅读模式
10金钱
前提描述:
      1、使用FATFS同时操作U盘和外部flash(w25qxx)
      2、使用的是stm32f4的片子,使用CUBEMX创建的工程
      3、单独测试fatfs读写U盘和falsh都没有问题
      4、同时读写U盘和flash的时候不能够成功,有几个疑惑点


疑惑点:
      1、当我初始化的时候,创建的最大卷_VOLUMES是指的当前文件系统的么,或者简单的说
           初始化的时候,初始化了4个卷,这4个卷分别对应U盘和flash
           char USBHPath[4];   /* USBH logical drive path */
           char USERPath[4];   /* USER logical drive path */

            /*## FatFS: Link the USBH driver ###########################*/
             retUSBH = FATFS_LinkDriver(&USBH_Driver, USBHPath);
             /*## FatFS: Link the USER driver ###########################*/
             retUSER = FATFS_LinkDriver(&USER_Driver, USERPath);                  
      2、我怎么区分U盘和falsh呢?
           原子的例程在初始化的时候disk_initialize的时候,通过Switch去区分,就是"0:/"  "1:/"等等
          但是我在初始化的时候初始化的4个磁盘指的就是独立的

      3、这个是FATFS_LinkDriver(&USBH_Driver, USBHPath);和 FATFS_LinkDriver(&USER_Driver, USERPath)调用的底层函数,分为为U盘和falsh加载了4个卷,我这样没法区分使用的时候使用的是哪个
uint8_t FATFS_LinkDriverEx(const Diskio_drvTypeDef *drv, char *path, uint8_t lun)
{
  uint8_t ret = 1;
  uint8_t DiskNum = 0;

  if(disk.nbr < _VOLUMES)
  {
    disk.is_initialized[disk.nbr] = 0;
    disk.drv[disk.nbr] = drv;
    disk.lun[disk.nbr] = lun;
    DiskNum = disk.nbr++;
    path[0] = DiskNum + '0';
    path[1] = ':';
    path[2] = '/';
    path[3] = 0;
    ret = 0;
  }

  return ret;
}

      4、对应的f_open f_write操作的时候不知道怎么指定是操作U盘还是flash,因为初始化的时候都加载了4个卷

就是有这个点疑惑住我了,请教一下

最佳答案

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

官方生成的MX_FATFS_Init()函数里会依次调用FATFS_LinkDriver()函数,谁先调用谁就是0,之后依次++。例如你1里展示的代码,那么先被调用的USBH_Driver(也就是USB)对应就是0盘,再被调用的USER_Driver(你这里是W25Q)就是1盘。那么想打开W25Q里的test.txt文件,就可以用: f_open(&USERFile, "1:test.txt", FA_OPEN_EXISTING | FA_READ); 同理,想打开U盘里的,就可以用: f_open(&USBHFile, "0:test.txt", FA_OPEN_EXISTING ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2019-6-27
在线时间
15 小时
发表于 2022-7-23 10:54:24 | 显示全部楼层
官方生成的MX_FATFS_Init()函数里会依次调用FATFS_LinkDriver()函数,谁先调用谁就是0,之后依次++。例如你1里展示的代码,那么先被调用的USBH_Driver(也就是USB)对应就是0盘,再被调用的USER_Driver(你这里是W25Q)就是1盘。那么想打开W25Q里的test.txt文件,就可以用:
f_open(&USERFile, "1:test.txt", FA_OPEN_EXISTING | FA_READ);
同理,想打开U盘里的,就可以用:
f_open(&USBHFile, "0:test.txt", FA_OPEN_EXISTING | FA_READ);

回复

使用道具 举报

23

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
365
金钱
365
注册时间
2018-3-21
在线时间
64 小时
 楼主| 发表于 2022-7-23 11:05:01 | 显示全部楼层
  if((FATFS_LinkDriver(&SDRAMDISK_Driver, RAMpath) == 0) && (FATFS_LinkDriver(&SD_Driver, SDpath) == 0))
  {  
    /*##-2- Register the file system object to the FatFs module ##############*/
    res1 = f_mount(&RAMFatFs, (TCHAR const*)RAMpath, 0);
    res2 = f_mount(&SDFatFs, (TCHAR const*)SDpath, 0);
   
    if((res1 != FR_OK) || (res2 != FR_OK))
    {
      /* FatFs Initialization Error */
      Error_Handler();
    }
    else
    {
      /*##-3- Create a FAT file system (format) on the logical drives ########*/
      /* WARNING: Formatting the uSD card will delete all content on the device */
      res1 = f_mkfs((TCHAR const*)RAMpath, 0, 0);
      res2 = f_mkfs((TCHAR const*)SDpath, 0, 0);
      
      if((res1 != FR_OK) || (res2 != FR_OK))
      {
        /* FatFs Format Error */
        Error_Handler();
      }
      else
      {
        /*##-4- Create and Open new text file objects with write access ######*/
        res1 = f_open(&RAMFile, "0:STM32.TXT", FA_CREATE_ALWAYS | FA_WRITE);
        res2 = f_open(&SDFile, "1:STM32.TXT", FA_CREATE_ALWAYS | FA_WRITE);

这个是官方多个文件系统的例子,最后f_open 的时候是通过 "0:STM32.TXT"和 "1:STM32.TXT"来区分操作的么,那么初始化的时候char RAMpath[4], SDpath[4]; /* RAM disk and SD card logical drives paths */这个的定义意义在哪呢
回复

使用道具 举报

23

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
365
金钱
365
注册时间
2018-3-21
在线时间
64 小时
 楼主| 发表于 2022-7-25 09:36:42 | 显示全部楼层
Egoista 发表于 2022-7-23 16:30
官方生成的MX_FATFS_Init()函数里会依次调用FATFS_LinkDriver()函数,谁先调用谁就是0,之后依次++。例如你 ...

确实是这样,已经搞明白了,多谢多谢
回复

使用道具 举报

3

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2017-11-11
在线时间
30 小时
发表于 2022-11-18 14:55:30 | 显示全部楼层
楼主代码可以用了吗?请教一下用CubeMX生成的这个FATFs系统,为什么有个MX_FATFS_Init()函数?如果我同时挂载SD卡和Flash到文件系统,是不是要写两个MX_FATFS_Init()函数里面的初始化那些函数?
挂载两个这块没看明白,可以观摩一下楼主的代码学习一下吗?
回复

使用道具 举报

23

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
365
金钱
365
注册时间
2018-3-21
在线时间
64 小时
 楼主| 发表于 2022-11-24 09:11:33 | 显示全部楼层
沐夕 发表于 2022-11-18 14:55
楼主代码可以用了吗?请教一下用CubeMX生成的这个FATFs系统,为什么有个MX_FATFS_Init()函数?如果我同时挂 ...

可以用,你留个邮箱我发你,只要一个函数初始化就行了,谁先初始化谁就是0,其他是1,以此类推
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2022-6-30
在线时间
3 小时
发表于 2022-11-27 12:52:50 | 显示全部楼层
用最新CubeMX配置FATFS使用DMA传输模式,在打开两个文件的情况下,第二次读取就会卡死在
if(BSP_SD_ReadBlocks_DMA((uint32_t*)buff,
                             (uint32_t) (sector),
                             count) == MSD_OK)
    {
      ReadStatus = 0;
      /* Wait that the reading process is completed or a timeout occurs */
      timeout = HAL_GetTick();
      while((ReadStatus == 0) && ((HAL_GetTick() - timeout) < SD_TIMEOUT))
      {
      }
我一直找不到问题
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2022-6-30
在线时间
3 小时
发表于 2022-11-27 12:54:39 | 显示全部楼层
只打开一个文件的情况下是可以完成读取的。在轮询模式下是可以打开两个文件,读取。
(我的目的是打开一个文件,对里面的数据处理,存到另一个文件里)
回复

使用道具 举报

3

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2017-11-11
在线时间
30 小时
发表于 2023-1-30 10:52:25 | 显示全部楼层
随风飘动 发表于 2022-11-24 09:11
可以用,你留个邮箱我发你,只要一个函数初始化就行了,谁先初始化谁就是0,其他是1,以此类推

邮箱wuming1301@126.com,论坛密码忘了,刚登上
谢谢楼主
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 18:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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