提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
1.USBH_Process_OS的调用
代码如下(示例):
void MX_USB_HOST_Init(void)
{
/* USER CODE BEGIN USB_HOST_Init_PreTreatment */
/* USER CODE END USB_HOST_Init_PreTreatment */
/* Init host Library, add supported class and start the library. */
if (USBH_Init(&hUsbHostFS, USBH_UserProcess, HOST_FS) != USBH_OK)//调用了USBH_Init(&hUsbHostFS, USBH_UserProcess, HOST_FS)
{
Error_Handler();
}
if (USBH_RegisterClass(&hUsbHostFS, USBH_MSC_CLASS) != USBH_OK)
{
Error_Handler();
}
if (USBH_Start(&hUsbHostFS) != USBH_OK)
{
Error_Handler();
}
/* USER CODE BEGIN USB_HOST_Init_PostTreatment */
/* USER CODE END USB_HOST_Init_PostTreatment */
}
USBH_StatusTypeDef USBH_Init(USBH_HandleTypeDef *phost,
void (*pUsrFunc)(USBH_HandleTypeDef *phost,
uint8_t id), uint8_t id)
{
/* Check whether the USB Host handle is valid */
if (phost == NULL)
{
USBH_ErrLog("Invalid Host handle");
return USBH_FAIL;
}
/* Set DRiver ID */
phost->id = id;
/* Unlink class*/
phost->pActiveClass = NULL;
phost->ClassNumber = 0U;
/* Restore default states and prepare EP0 */
(void)DeInitStateMachine(phost);
/* Restore default Device connection states */
phost->device.PortEnabled = 0U;
phost->device.is_connected = 0U;
phost->device.is_disconnected = 0U;
phost->device.is_ReEnumerated = 0U;
/* Assign User process */
if (pUsrFunc != NULL)
{
phost->pUser = pUsrFunc;
}
#if (USBH_USE_OS == 1U)
#if (osCMSIS < 0x20000U)
/* Create USB Host Queue */
osMessageQDef(USBH_Queue, MSGQUEUE_OBJECTS, uint16_t);
phost->os_event = osMessageCreate(osMessageQ(USBH_Queue), NULL);
/* Create USB Host Task */
#if defined (USBH_PROCESS_STACK_SIZE)
osThreadDef(USBH_Thread, USBH_Process_OS, USBH_PROCESS_PRIO, 0U, USBH_PROCESS_STACK_SIZE);//使用OS时自动创建任务
#else
osThreadDef(USBH_Thread, USBH_Process_OS, USBH_PROCESS_PRIO, 0U, 8U * configMINIMAL_STACK_SIZE);
#endif /* defined (USBH_PROCESS_STACK_SIZE) */
phost->thread = osThreadCreate(osThread(USBH_Thread), phost);
#else
/* Create USB Host Queue */
phost->os_event = osMessageQueueNew(MSGQUEUE_OBJECTS, sizeof(uint32_t), NULL);
/* Create USB Host Task */
USBH_Thread_Atrr.name = "USBH_Queue";
#if defined (USBH_PROCESS_STACK_SIZE)
USBH_Thread_Atrr.stack_size = USBH_PROCESS_STACK_SIZE;
#else
USBH_Thread_Atrr.stack_size = (8U * configMINIMAL_STACK_SIZE);
#endif /* defined (USBH_PROCESS_STACK_SIZE) */
USBH_Thread_Atrr.priority = USBH_PROCESS_PRIO;
phost->thread = osThreadNew(USBH_Process_OS, phost, &USBH_Thread_Atrr);
#endif /* (osCMSIS < 0x20000U) */
#endif /* (USBH_USE_OS == 1U) */
/* Initialize low level driver */
(void)USBH_LL_Init(phost);
return USBH_OK;
}
void MX_USB_HOST_Init(void)中调用了USBH_Init(&hUsbHostFS, USBH_UserProcess, HOST_FS)
在USBH_Init中,在使用OS时通过osThreadDef(USBH_Thread, USBH_Process_OS, USBH_PROCESS_PRIO, 0U, USBH_PROCESS_STACK_SIZE);创建任务,所以使用时只要初始化时调用MX_USB_HOST_Init();无需在自己创建;
2.调试出现HardFault_Handler
代码如下(示例):
osThreadDef(Uart1_Task, ReadUSBTask, osPriorityAboveNormal, 0, 1024);//文件系统需要较大的栈空间,默认的128需要改为1024
Uart1_TaskHandle = osThreadCreate(osThread(Uart1_Task), NULL);