STM32
直播中

闷~~

9年用户 759经验值
擅长:可编程逻辑
私信 关注
[问答]

STM32F429 USB和FATFS同时操作eMMC冲突问题怎么解决?

有个32G的eMMC,分成了4个盘。
连上usb只会显示其中的一个盘,用户可以去操作这个盘。
希望在未显示u盘或者显示了u盘但是未进行读写的情况下判断另外几个盘是否存在文件并上传到服务器。
目前已经实现了连上u盘只显示一个盘的功能,读写也正常。退出u盘后,上传文件也正常。
目前的问题是u盘显示出来的情况下,同时进行文件上传就会出现disk error。
我知道是SDIO操作冲突了,想问下这个有好的方案么?
裸机开发,未使用操作系统。
我想到的是弄2个标志位(u盘读写和fatfs上传),u盘读写优先级要高于fatfs上传。
想问下大佬,这个标志位的判断裸机应该怎么写,或者有没有其他更好的方案?
/** * @brief  Reads Sector(s) * @param  pdrv: Physical drive number (0..) * @param  *buff: Data buffer to store read data * @param  sector: Sector address (LBA) * @param  count: Number of sectors to read (1..128) * @retval DRESULT: Operation result */DRESULT USER_read(    BYTE pdrv,    /* Physical drive nmuber to identify the drive */    BYTE *buff,   /* Data buffer to store read data */    DWORD sector, /* Sector address in LBA */    UINT count    /* Number of sectors to read */){  /* USER CODE BEGIN READ */  if (usbd_inuse)  {    return RES_NOTRDY;  }  fatfs_inuse = 1;  DRESULT res = FATFS_read(pdrv, buff, sector, count);  fatfs_inuse = 0;  return res;  /* USER CODE END READ */}/** * @brief  Writes Sector(s) * @param  pdrv: Physical drive number (0..) * @param  *buff: Data to be written * @param  sector: Sector address (LBA) * @param  count: Number of sectors to write (1..128) * @retval DRESULT: Operation result */#if _USE_WRITE == 1DRESULT USER_write(    BYTE pdrv,        /* Physical drive nmuber to identify the drive */    const BYTE *buff, /* Data to be written */    DWORD sector,     /* Sector address in LBA */    UINT count        /* Number of sectors to write */){  /* USER CODE BEGIN WRITE */  /* USER CODE HERE */  if (usbd_inuse)  {    return RES_NOTRDY;  }  fatfs_inuse = 1;  DRESULT res = FATFS_write(pdrv, buff, sector, count);  fatfs_inuse = 0;  return res;  /* USER CODE END WRITE */}#endif /* _USE_WRITE == 1 *//** * @brief  Reads data from the medium. * @param  lun: Logical unit number. * @param  buf: data buffer. * @param  blk_addr: Logical block address. * @param  blk_len: Blocks number. * @retval USBD_OK if all operations are OK else USBD_FAIL */int8_t STORAGE_Read_HS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len){  /* USER CODE BEGIN 13 */  UNUSED(lun);  usbd_inuse = 1;  if (fatfs_inuse)  {    return USBD_BUSY;  }  DRESULT res = FATFS_read(lun, buf, blk_addr, blk_len);  usbd_inuse = 0;  return res == RES_OK ? USBD_OK : USBD_FAIL;  /* USER CODE END 13 */}/** * @brief  Writes data into the medium. * @param  lun: Logical unit number. * @param  buf: data buffer. * @param  blk_addr: Logical block address. * @param  blk_len: Blocks number. * @retval USBD_OK if all operations are OK else USBD_FAIL */int8_t STORAGE_Write_HS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len){  /* USER CODE BEGIN 14 */  UNUSED(lun);  usbd_inuse = 1;  if (fatfs_inuse)  {    return USBD_BUSY;  }  DRESULT res = FATFS_write(lun, buf, blk_addr, blk_len);  usbd_inuse = 0;  return res == RES_OK ? USBD_OK : USBD_FAIL;  /* USER CODE END 14 */}


回帖(1)

陈存楼

2024-6-3 14:14:38
为了解决STM32F429 USB和FATFS同时操作eMMC冲突问题,我们可以采取以下步骤:

1. 定义两个标志位:`usb_operation` 和 `fatfs_upload`。这两个标志位分别表示USB设备操作和FATFS文件上传的状态。

2. 在初始化阶段,将两个标志位都设置为0。

3. 当USB设备连接时,设置 `usb_operation` 标志位为1,并暂停FATFS上传操作。

4. 当USB设备断开连接时,设置 `usb_operation` 标志位为0,并恢复FATFS上传操作。

5. 在FATFS上传操作开始前,检查 `usb_operation` 标志位。如果为1,则暂停上传操作,等待USB设备断开连接。

6. 在FATFS上传操作过程中,定期检查 `usb_operation` 标志位。如果发现标志位变为1,立即停止上传操作,等待USB设备断开连接。

7. 在USB设备读写操作过程中,如果需要访问eMMC,可以设置 `fatfs_upload` 标志位为1,以通知FATFS上传操作暂停。

8. 在USB设备读写操作完成后,将 `fatfs_upload` 标志位设置为0,以恢复FATFS上传操作。

通过以上步骤,我们可以确保在USB设备连接时,FATFS上传操作会被暂停,从而避免SDIO操作冲突。同时,在USB设备断开连接后,FATFS上传操作可以继续进行。

这种方法的优点是简单易实现,不需要使用操作系统。但缺点是可能存在一定的延迟,因为需要在FATFS上传操作过程中定期检查 `usb_operation` 标志位。如果对实时性要求较高,可以考虑使用中断或轮询的方式提高检查频率。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分