本帖最后由 quanshimutou 于 2026-1-19 09:45 编辑
你可以看看这个
STM32CubeMX在freertos操作系统下驱动U盘_freertos usb host-CSDN博客
就是说,在CubeMX生成的FreeRTOS+USB的工程中,freertos默认任务初始化USB_HOST,创建一个USB的任务和消息队列,USB的任务等待消息队列,然后执行USB背景函数,你需要给这个消息队列发送消息,USB检测U盘状态就能运行。
[C] 纯文本查看 复制代码 void StartDefaultTask(void *argument){ // 默认任务
MX_USB_HOST_Init();// 调用一次
......
}
void MX_USB_HOST_Init(void){
/* Init host Library, add supported class and start the library. */
USBH_Init(&hUsbHostFS, USBH_UserProcess, HOST_FS)// 初始化
......
USBH_RegisterClass(&hUsbHostFS, USBH_MSC_CLASS) // 注册
......
USBH_Start(&hUsbHostFS) // 启动
......
}
// 里面的USBH_Init()函数会创建一个信号队列,创建一个任务
USBH_Init(&hUsbHostFS, USBH_UserProcess, HOST_FS){
// 创建一个信号队列,创建一个任务
#if (USBH_USE_OS == 1U)
/* Create USB Host Queue */
phost->os_event = osMessageQueueNew(MSGQUEUE_OBJECTS, sizeof(uint32_t), NULL);
/* Create USB Host Task */
USBH_Thread_Atrr.name = "USBH_Queue";
USBH_Thread_Atrr.stack_size = USBH_PROCESS_STACK_SIZE;
USBH_Thread_Atrr.priority = USBH_PROCESS_PRIO;
phost->thread = osThreadNew(USBH_Process_OS, phost, &USBH_Thread_Atrr);
// 任务的函数是 USBH_Process_OS
#endif /* (USBH_USE_OS == 1U) */
}
// 任务函数
static void USBH_Process_OS(void *argument) {
osStatus_t status;
for (;;) { // 等消息,然后执行USB背景任务
status = osMessageQueueGet(((USBH_HandleTypeDef *)argument)->os_event,
&((USBH_HandleTypeDef *)argument)->os_msg, NULL, osWaitForever);
if (status == osOK) {
USBH_Process((USBH_HandleTypeDef *)argument); // USB背景任务
}
}
}
所以,freertos建立的任务,不断的发送消息给这个任务,启动执行"USBH_Process"后台处理函数。
[C] 纯文本查看 复制代码 extern USBH_HandleTypeDef hUsbHostFS;
uint32_t msg = 0;
osMessageQueuePut(hUsbHostFS.os_event, &msg, 1, 10);
|