不含stm32 底层的代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
MyStm32Code/DOC/21_FATFS_MSC.md

1.9 KiB

解决fatfs msc 冲突

sd_diskio.c增加两个函数, msc usb中断时关闭消息

void SD_Delet_Queue(void) {
	osMessageDelete(SDQueueID);
}

void SD_Create_Queue(void) {
    SDQueueID = osMessageQueueNew(QUEUE_SIZE, 2, NULL);
}

启用或禁用 SD FatFS 0禁止

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回调

void OTG_FS_IRQHandler(void)
{
 
  HAL_PCD_IRQHandler(&hpcd_USB_OTG_FS);
 
  FILE_MGT_USB_CHECK(); // 自定义的函数
 
}

两个任务,一个是FatFs 读写任务,一个是 USB 状态连接任务 FatFS 读写放到任务里面取, 等待信号量执行读写 两个任务互斥信号量 osMutexWait(sdFreeMutexHandle, osWaitForever);

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

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);
		}

	}
}