STM32 USB部分中断函数简要分析

来源:互联网 发布:手机解压缩软件 编辑:程序博客网 时间:2024/06/06 07:45

void USB_LP_CAN1_RX0_IRQHandler(void)
{
  USB_Istr();
}

可见USB_Istr()是处理USB_LP_CAN1_RX0_IRQHandler中断的,而这个中断管理的是控制传输、中断传输、批量传输(单缓冲区)。

下面对此函数中关键部分进行分析

wIstr = _GetISTR();这句说白了就是获取ISTR寄存器的值,从usb_regs.h中这个宏定义#define _GetISTR()  ((uint16_t) *ISTR)中便知

 

#define IMR_MSK (CNTR_CTRM  | CNTR_WKUPM | CNTR_SUSPM | CNTR_ERRM  | CNTR_SOFM \
                 | CNTR_ESOFM | CNTR_RESETM )这个宏定义就是声明下这些位的集合,估计要跟什么&下

ISTR_CTR是寄存器USB_ISTR中的CTR位,表明端点一次正确的传输

wInterrupt_Mask这个可能是表示允许CNTR中的哪些位中断

if (wIstr & ISTR_CTR & wInterrupt_Mask)那么这句话就容易理解了,就是说某位中断了并且是正确的传输,意思是我们可以来处理了


ISTR_EP_ID是端点号

CTR_LP()这个函数是真正的中断服务函数,大致上的结构是这样的

EPindex = (uint8_t)(wIstr & ISTR_EP_ID);这句是读取端点号,下面分端点是否为0展开

if (EPindex == 0)

{//端点是0

  if ((wIstr & ISTR_DIR) == 0)

  {//获取方向标志,如果是0表示主机要“IN”数据

     。。。。。。  

    In0_Process();//调用此函数

     。。。。。。

  }

  else

  { //方向标志为1,有两种情况,可能是主机要“OUT”也可能是在“SETUP”

        if ((wEPVal &EP_SETUP) != 0)

        {//在被主机setup

          。。。。。。

          Setup0_Process();//调用此函数

          。。。。。。

        }

        else if ((wEPVal & EP_CTR_RX) != 0)

        {//主机在out

          。。。。。。

          Out0_Process();//调用此函数

          。。。。。。

        }

  }

}

else

{//端点非0

   wEPVal = _GetENDPOINT(EPindex);

   if ((wEPVal & EP_CTR_RX) != 0)

   {//设备接收完成

      。。。。。。

      (*pEpInt_OUT[EPindex-1])();//调用此函数

      。。。。。。

   

   if ((wEPVal & EP_CTR_TX) != 0)

   //设备发送完成

      。。。。。。

      (*pEpInt_IN[EPindex-1])();//调用此函数

      。。。。。。

    }

}


0 0
原创粉丝点击