更新 'DOC/21_FATFS_MSC.md'

main
esea_info 2 years ago
parent ddd8b6f402
commit f77521fc26
  1. 93
      DOC/21_FATFS_MSC.md

@ -0,0 +1,93 @@
### 解决fatfs msc 冲突
sd_diskio.c增加两个函数, msc usb中断时关闭消息
```C
void SD_Delet_Queue(void) {
osMessageDelete(SDQueueID);
}
void SD_Create_Queue(void) {
SDQueueID = osMessageQueueNew(QUEUE_SIZE, 2, NULL);
}
```
启用或禁用 SD FatFS 0禁止
```C
static void Set_SD_WriteOrRead(uint8_t en) {
if (en == 1) {
SD_Create_Queue();
SDCard_EN = 1;
} else {
SD_Delet_Queue();
SDCard_EN = 0;
}
}
```
USB回调
```C
void OTG_FS_IRQHandler(void)
{
HAL_PCD_IRQHandler(&hpcd_USB_OTG_FS);
FILE_MGT_USB_CHECK(); // 自定义的函数
}
```
两个任务,一个是FatFs 读写任务,一个是 USB 状态连接任务
FatFS 读写放到任务里面取, 等待信号量执行读写
两个任务互斥信号量 osMutexWait(sdFreeMutexHandle, osWaitForever);
```C
static void FILE_MGT_SD_TEST_TASK(const void *arg) {
osDelay(500);
for (;;) {
osDelay(500);
osMutexWait(sdFreeMutexHandle, osWaitForever);
if (SDCard_EN) {
FatFs_FileTest();
} else {
printf("禁止使用SD卡\n");
}
osMutexRelease(sdFreeMutexHandle);
}
}
```
USB 状态连接检测任务, 检测到USB 关闭 SD FATFS
需要提供 信号量 usbStateQueueHandle
```C
static void FILE_MGT_USB_CHECK_TASK(const void *arg) {
uint8_t dev_state = 0;
osEvent event;
FatFs_Check();
for (;;) {
event = osMessageGet(usbStateQueueHandle, osWaitForever); // 改osMessageQueueGet
if (event.status == osEventMessage) {
osMutexWait(sdFreeMutexHandle, osWaitForever);
printf("hUsbDeviceFS:%d\n", (uint8_t) event.value.v);
if ((uint8_t) event.value.v == USBD_STATE_ADDRESSED) {
dev_state = USBD_STATE_ADDRESSED;
} else if ((dev_state == USBD_STATE_ADDRESSED)
&& ((uint8_t) event.value.v == USBD_STATE_CONFIGURED)) {
Set_SD_WriteOrRead(0);
printf("usb connect\n");
} else {
dev_state = 0;
Set_SD_WriteOrRead(1);
printf("usb disconnect\n");
}
osMutexRelease(sdFreeMutexHandle);
}
}
}
```
Loading…
Cancel
Save