|
|
|
### 解决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);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|