在STM32F4上开发USB高速接口。在其USBH_USR_MSC_Application()函数下编写用户程序。发现之后函数调用完之后,返回值0。程序跑usbh_msc_core.h里去了。
case USBH_MSC_DEFAULT_APPLI_STATE:
/* Process Application callback for MSC */
appliStatus = pphost->usr_cb->UserApplication();
--> if(appliStatus == 0)
{
USBH_MSC_BOTXferParam.MSCState = USBH_MSC_DEFAULT_APPLI_STATE;
}
执行完这条if 语句
上面的语句被包含在函数static USBH_Status USBH_MSC_Handle()
static USBH_Status USBH_MSC_Handle(USB_OTG_CORE_HANDLE *pdev ,
void *phost)
if(HCD_IsDeviceConnected(pdev))
{
switch(USBH_MSC_BOTXferParam.MSCState)
然后 return status;
也就是USBH_Status USBH_MSC_Handle() 函数被执行完。
接着程序跳转到
case HOST_CLASS:
/* process class state machine */
status = phost->class_cb->Machine(pdev, phost);
USBH_ErrorHandle(phost, status);
--> break;
最后执行到USBH_ErrorHandle()这个函数下,
void USBH_ErrorHandle(USBH_HOST *phost, USBH_Status errType)
{
/* Error unrecovered or not supported device speed */
if ( (errType == USBH_ERROR_SPEED_UNKNOWN) ||
(errType == USBH_UNRECOVERED_ERROR) )
{
phost->usr_cb->UnrecoveredError();
phost->gState = HOST_ERROR_STATE;
}
/* USB host restart requested from application layer */
else if(errType == USBH_APPLY_DEINIT)
{
phost->gState = HOST_ERROR_STATE;
/* user callback for initalization */
phost->usr_cb->Init();
}
然后跳出。
结论:
执行完这段代码后,USB状态进入错误状态,必须重新启动USB
内核库,这个用户函数用swtich()语句还是有道理的。实现无限状
态机的效果。
实践证明,加了swtich语句还是跳进错误。说明这完全跟用户代码无关。