4、中断处理过程大致理解 (1)usb_istr()函数中的中断处理简单分析 有用的代码大概以下几段,首先是处理复位的代码,调用设备结构中的复位处理函数。
wIstr = _GetISTR();
if (wIstr & ISTR_RESET & wInterrupt_Mask)
{
_SetISTR((u16)CLR_RESET); //清复位中断
Device_Property.Reset();
}
处理唤醒的代码:
if (wIstr & ISTR_WKUP & wInterrupt_Mask)
{
_SetISTR((u16)CLR_WKUP);
Resume(RESUME_EXTERNAL);
}
处理总线挂起的代码:
if (wIstr & ISTR_SUSP & wInterrupt_Mask)
{
if (fSuspendEnabled) /* check if SUSPEND is possible */
{
Suspend();
}
else
{
/* if not possible then resume after xx ms */
Resume(RESUME_LATER);
}
/* clear of the ISTR bit must be done after setting of CNTR_FSUSP */
_SetISTR((u16)CLR_SUSP);
}
处理端点传输完成的代码,这段是最重要的,它调用底层usb_int.c()文件中的CTR_LP()函数来处理端点数据传输完成中断。
if (wIstr & ISTR_CTR & wInterrupt_Mask)
{
CTR_LP(); /* servicing of the endpoint correct transfer interrupt */
}
|