前面两篇文章介绍了“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 所示。
三、总结
上述功能,可以应用在很多场景,例如,上位机和底层的文件交互,通过 USB 接口导出 eMMC 内的文件;也可以利用该功能实现 IAP 功能,将 bin 文件拷贝到 eMMC,Boot 程序读取 eMMC 进行程序升级。应用时需要注意 USB 接口操作 eMMC 和程序操作 eMMC 不能同时进行,以免发生冲突。
扫码关注尚为网微信公众号
原创文章,作者:sunev,如若转载,请注明出处:https://www.sunev.cn/embedded/940.html