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