From f77521fc2613ffdf0769a06bcb6428d1065a15c8 Mon Sep 17 00:00:00 2001 From: esea_info Date: Tue, 9 Apr 2024 03:12:24 +0000 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20'DOC/21=5FFATFS=5FMSC.md'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DOC/21_FATFS_MSC.md | 93 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/DOC/21_FATFS_MSC.md b/DOC/21_FATFS_MSC.md index e69de29..d7820da 100644 --- a/DOC/21_FATFS_MSC.md +++ b/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); + } + + } +} +``` \ No newline at end of file