parent
ddd8b6f402
commit
f77521fc26
@ -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…
Reference in new issue