打印
[STM32F4]

STM32F407复合设备下的USB中断问题,敬请香水城指点

[复制链接]
2307|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qq302011|  楼主 | 2015-8-19 00:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
香主:
您好!
  我在使用STM32F4的USB的时候,自己做了一个USB的复合设备类,经过一番折腾,终于可以跑起来了,我的复合类是(CDC+Msc),
  我的初始代码如下,根据一个变量选择是否初始化为复合设备
if(USB_DEVICE_VCP==g_usb_device_mode)
                {
                USBD_Init(&USB_OTG_Core,
                      USB_OTG_FS_CORE_ID,
                      &USR_VCP_desc,
                      &USBD_CDC_cb,
                      &USR_VCP_cb);
                }
                else if(USB_DEVICE_UDISK==g_usb_device_mode)
                {
                USBD_Init(&USB_OTG_Core,
                 USB_OTG_FS_CORE_ID,
                 &USR_MSC_desc,
                 &USBD_MSC_cb,
                 &USR_MSC_cb);
                }
                else if(USB_DEVICE_IAP==g_usb_device_mode)
                {
                                        USBD_Init(&USB_OTG_Core,
                                                                                USB_OTG_FS_CORE_ID,
                                                                                &USR_IAD_desc,
                                                                                &USBD_IAD_cb,
                                                                                &USR_IAD_cb);
                }
  请注意,如果我只使用单设备(只是用CDC或者只使用MSC)都没有问题,但是使用符合设备的时候,
STM32F4在正常运行一段时间之后死机,经过跟踪调试发现,原来STM32F4一直进入USB的中断程序里面出不来了。
感觉是进入了IN 断点的某个中断,又没有处理这个中断而导致。
于是进入到 IN端点的中断处理函数,试着修改了一下这个函数,注释的两句是我自己添加的,意思是清除所有的中断,加上这两句之后,设备异常,能找到设备,很慢的速度安装驱动,但是无法打开串口,也无法打开U盘。
USB_OTG_DIEPINTn_TypeDef  diepint;
static uint32_t DCD_HandleInEP_ISR(USB_OTG_CORE_HANDLE *pdev)
{
  
  
  uint32_t ep_intr;
  uint32_t epnum = 0;
  uint32_t fifoemptymsk;
  diepint.d32 = 0;
  ep_intr = USB_OTG_ReadDevAllInEPItr(pdev);
  
  while ( ep_intr )
  {
    if (ep_intr&0x1) /* In ITR */
    {
      diepint.d32 = DCD_ReadDevInEP(pdev , epnum); /* Get In ITR status */
      if ( diepint.b.xfercompl )
      {
        fifoemptymsk = 0x1 << epnum;
        USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, fifoemptymsk, 0);
        CLEAR_IN_EP_INTR(epnum, xfercompl);
        /* TX COMPLETE */
        USBD_DCD_INT_fops->DataInStage(pdev , epnum);
        
        if (pdev->cfg.dma_enable == 1)
        {
          if((epnum == 0) && (pdev->dev.device_state == USB_OTG_EP0_STATUS_IN))
          {
            /* prepare to rx more setup packets */
            USB_OTG_EP0_OutStart(pdev);
          }
        }           
      }
      if ( diepint.b.timeout )
      {
        CLEAR_IN_EP_INTR(epnum, timeout);
      }
      if (diepint.b.intktxfemp)
      {
        CLEAR_IN_EP_INTR(epnum, intktxfemp);
      }
      if (diepint.b.inepnakeff)
      {
        CLEAR_IN_EP_INTR(epnum, inepnakeff);
      }
      if ( diepint.b.epdisabled )
      {
        CLEAR_IN_EP_INTR(epnum, epdisabled);
      }      
      if (diepint.b.emptyintr)
      {
        
        DCD_WriteEmptyTxFifo(pdev , epnum);
        
        CLEAR_IN_EP_INTR(epnum, emptyintr);
      }
//                        diepint.d32=0x3bdb;
//                        USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[epnum]->DIEPINT,diepint.d32);
    }
    epnum++;
    ep_intr >>= 1;
  }
  
  return 1;
}

到这一步由于对整个USB的寄存器不熟悉,加上MDK的优化之后,整过变量或者寄存器又无法跟踪,没法再进行下去了。
完全没有了思路,请香主指点一二,我到这一步该怎么做?万谢!!
沙发
qq302011|  楼主 | 2015-8-29 08:12 | 只看该作者
只能自己顶了

使用特权

评论回复
板凳
STARM| | 2015-8-29 08:22 | 只看该作者
关掉优化看看再说。

使用特权

评论回复
地板
zh113214| | 2015-8-29 08:35 | 只看该作者
楼主问题解决了吗?我觉得问题在优化上面,楼主看看。

使用特权

评论回复
5
玛尼玛尼哄| | 2015-8-29 08:46 | 只看该作者
城主忙的很,不可能每个帖子都来回复的,那版主又不是他一个,其他的版主也有责任来回复嘛。

使用特权

评论回复
6
捉虫天师| | 2015-8-29 10:26 | 只看该作者
关掉优化看看再说

使用特权

评论回复
7
迪卡| | 2015-8-29 10:47 | 只看该作者
USB也是中断,清除所有的中断不合适吧

使用特权

评论回复
8
捉虫天师| | 2015-8-29 11:19 | 只看该作者
楼主问题解决了吗?

使用特权

评论回复
9
稳稳の幸福| | 2015-8-29 11:44 | 只看该作者
符合设备是个什么样的设备啊。

使用特权

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

本版积分规则

8

主题

55

帖子

1

粉丝