STM32H743实现eMMC虚拟U盘+FatFs文件系统

前面两篇文章介绍了“STM32H743 实现 eMMC 虚拟 U 盘功能”和“STM32H743 驱动 eMMC 挂载 FATFS 系统读写文件”,分别实现了 STM32H743 驱动 eMMC 虚拟 U 盘和挂载 FatFs 文件系统,接下来这篇文章基于上述两篇文章同时实现 eMMC 虚拟 U 盘和挂载 FatFs 文件系统,并给出注意事项。

一、开发平台

  • 开发环境:MDK5.30
  • 移植驱动:STM32Cube_FW_H7_V1.9.0
  • 硬件平台:STM32H743VITX + eMMC(型号:MTFC4GACAJCN-1M WT)

二、实现步骤及注意事项

在“STM32H743 实现 eMMC 虚拟 U 盘功能”基础之上,移植 FatFs 文件系统,然后在主函数中增加创建 FatFs 文件系统,并读写文件。这部分与“STM32H743 驱动 eMMC 挂载 FATFS 系统读写文件”一样,不再赘述。

注意,f_mkfs()函数每次程序运行时都会重新创建一次系统,相当于格式化。所以,如果 eMMC 已经创建好 FatFs 文件系统,此语句要屏蔽掉。否则,如果在 USB 接口连接 PC 的情况下运行程序,会造成 USB 接口和 f_mkfs()同时操作 eMMC,导致 FatFs 无法创建成功,且 PC 无法识别虚拟 U 盘

上述是程序创建和读写文件的操作,也可以通过电脑在 U 盘中新建一个文件,例如 123.txt,任意写入一些内容,观察程序是否正确读取到的操作。

首先,将主函数中的 f_mkfs()屏蔽:

  /*-1- Link the micro SD disk I/O driver*/
  if(FATFS_LinkDriver(&USER_Driver, MMCPath) == 0)
  {
    /* Create FAT volume */
//    usb_printf("[CM7]:\tCreating FileSystem...\r\n");
//    res = f_mkfs(MMCPath, FM_FAT32, 0, workBuffer, sizeof(workBuffer));

//    if (res != FR_OK)
//    {
////      usb_printf("[CM7]:\tCreating FileSystem Failed!...\r\n");
//      Error_Handler();
//    }
//    usb_printf("[CM7]:\tFileSystem Created successfully!\r\n");

    /* start the FatFs operations simulaneously with the Core CM4 */
    FS_FileOperations();
  }

同时将刚才的写文件的程序改为读文件,即去掉写操作的部分。

uint32_t file_size;
static void FS_FileOperations(void)
{
  FRESULT res;
  uint32_t byteswritten, bytesread;

//  /* Register the file system object to the FatFs module */
//  if(f_mount(&MMCFatFs, (TCHAR const*)MMCPath, 0) != FR_OK)
//  {
//    Error_Handler();
//  }
//  /* open the file "CM7.TXT" in write mode */
//  res = f_open(&MyFile, CM7_FILE, FA_CREATE_ALWAYS | FA_WRITE);
//  if(res != FR_OK)
//  {
//    Error_Handler();
//  }

//  /* Write data to the text file */
//  res = f_write(&MyFile, wtext, sizeof(wtext), (void *)&byteswritten);

//  if((byteswritten == 0) || (res != FR_OK))
//  {
//    f_close(&MyFile);
//    Error_Handler();
//  }

//  /* Close the open text file */
//  f_close(&MyFile);

  /* Open the text file object with read access */
  if(f_open(&MyFile, (const char*)"123.txt", FA_READ) != FR_OK)
  {
    Error_Handler();
  }

  /* Read data from the text file */
  res = f_read(&MyFile, rtext, sizeof(rtext), (void *)&bytesread);
  if((bytesread == 0) || (res != FR_OK))
  {
    f_close(&MyFile);
    Error_Handler();
  }
  /* Close the open text file */
  f_close(&MyFile);

 /* Compare read data with the expected data */
  if(FatfsBuffercmp(rtext,  (uint8_t *)wtext,  byteswritten) != 0)
  {
    Error_Handler();
  }
  else
  {
//    while(1)
//    {
      HAL_Delay(250);
//    }
  }


//error:
//  Error_Handler();
}

重新运行程序,可以看到 STM32H743 能够正确读到 123.txt 文件里的内容,如图 1 所示。

STM32H743实现eMMC虚拟U盘+FatFs文件系统

三、总结

上述功能,可以应用在很多场景,例如,上位机和底层的文件交互,通过 USB 接口导出 eMMC 内的文件;也可以利用该功能实现 IAP 功能,将 bin 文件拷贝到 eMMC,Boot 程序读取 eMMC 进行程序升级。应用时需要注意 USB 接口操作 eMMC 和程序操作 eMMC 不能同时进行,以免发生冲突。

附件仅博主测试所用,暂不提供下载

扫码关注尚为网微信公众号

尚为网微信公众号
每天学习电路设计嵌入式系统的专业知识,关注一波,没准就用上了。

原创文章,作者:sunev,如若转载,请注明出处:https://www.sunev.cn/embedded/940.html

(1)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2021年3月30日
下一篇 2021年4月5日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注