香主:
您好!
我在使用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的优化之后,整过变量或者寄存器又无法跟踪,没法再进行下去了。
完全没有了思路,请香主指点一二,我到这一步该怎么做?万谢!!
|