找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3375|回复: 0
收起左侧

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

[复制链接]
ID:105323 发表于 2016-2-12 19:09 | 显示全部楼层 |阅读模式
在"stm32f10x_it.c"中有下面这个函数
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])();//调用此函数
     。。。。。。
    }
}


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表