打印

STM32 USB数据收发怎样触发中断

[复制链接]
9060|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hsz9191|  楼主 | 2012-10-25 14:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求香主和各位高手指教,我现在的USB收发数据仅仅只是通过查询的方式实现,现在需要用中断实现,
问题1:不知道怎么进入中断函数USB_LP_CAN1_RX0_IRQHandler();
问题2:进了USB_LP_CAN1_RX0_IRQHandler(),然后进USB_Istr(),代码如下
#if (IMR_MSK & ISTR_CTR)
  if (wIstr & ISTR_CTR & wInterrupt_Mask)
  {
    /* servicing of the endpoint correct transfer interrupt */
    /* clear of the CTR flag into the sub */
    CTR_LP();
#ifdef CTR_CALLBACK
    CTR_Callback();
#endif
  }
#endif
如果有数据传输就会调用CTR_LP(),进入CTR_LP(),
void CTR_LP(void)
{
  __IO uint16_t wEPVal = 0;
  while (((wIstr = _GetISTR()) & ISTR_CTR) != 0)
  {
    EPindex = (uint8_t)(wIstr & ISTR_EP_ID);
    if (EPindex == 0)
    {
   SaveRState = _GetENDPOINT(ENDP0);
   SaveTState = SaveRState & EPTX_STAT;
   SaveRState &=  EPRX_STAT;
  _SetEPRxTxStatus(ENDP0,EP_RX_NAK,EP_TX_NAK);
      if ((wIstr & ISTR_DIR) == 0)
      {
        _ClearEP_CTR_TX(ENDP0);
        In0_Process();
         _SetEPRxTxStatus(ENDP0,SaveRState,SaveTState);
    return;
      }
      else
      {
        wEPVal = _GetENDPOINT(ENDP0);
        
        if ((wEPVal &EP_SETUP) != 0)
        {
          _ClearEP_CTR_RX(ENDP0);
          Setup0_Process();
        _SetEPRxTxStatus(ENDP0,SaveRState,SaveTState);
          return;
        }
        else if ((wEPVal & EP_CTR_RX) != 0)
        {
          _ClearEP_CTR_RX(ENDP0);
          Out0_Process();     
       _SetEPRxTxStatus(ENDP0,SaveRState,SaveTState);
          return;
        }
      }
    }
    else
    {
      wEPVal = _GetENDPOINT(EPindex);
      if ((wEPVal & EP_CTR_RX) != 0)
      {
        _ClearEP_CTR_RX(EPindex);
        (*pEpInt_OUT[EPindex-1])();
      }
      if ((wEPVal & EP_CTR_TX) != 0)
      {
        _ClearEP_CTR_TX(EPindex);
        (*pEpInt_IN[EPindex-1])();
      }
    }
  }
}
ISTR_EP_ID又是怎样识别的?

相关帖子

沙发
HAPPY小越越| | 2012-10-27 09:17 | 只看该作者
楼主,能不能分享一下您的USB程序啊??我现在也在学习USB,可是一直学起来都很费劲,初始化过程,就存在问题,求帮助,感谢。。。。

使用特权

评论回复
板凳
airwill| | 2012-10-30 16:36 | 只看该作者
USB程序在库里有很详细的例子程序, 跑简单的应用都不要太大的修改.
要弄清楼主的问题, 就得好好第啃一啃 USB 协议和 STM32 的数据手册.

使用特权

评论回复
地板
dayplover| | 2012-11-8 09:11 | 只看该作者
正确传输完数据后,ISTR寄存器的CTR位会被硬件置位,如果CNTR寄存器的CTRM位在初始配置的时候置位(正确传输中断允许),也就是你程序中的IMR_MSK宏使能了这个中断允许,就会有一个中断产生了
然后就会跳转到USB_LP_CAN1_RX0_IRQHandler()这个中断程序中来,在这个中断程序中,有USB_Istr()函数,就会执行这个函数,然后依次下来,跳转到产生中断的端点应用程序中去

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

8

帖子

0

粉丝