一段usbd的中断服务程序——为什么第4次中断以后,不再进入这段中断服务程序
这是我在网上找到的一个跟我有着同样原因的人的帖子:
通过串口打印,可以知道当usb线插入pc时,有中断产生.
void __irq IsrUsbd(void) //usb设备中断服务程序
{
U8 usbdIntpnd,epIntpnd;
U8 saveIndexReg=rINDEX_REG;
usbdIntpnd=rUSB_INT_REG;
epIntpnd=rEP_INT_REG;
DbgPrintf( "[INT:EP_I=%x,USBI=%x]",epIntpnd,usbIntpnd );
if(usbdIntpnd&SUSPEND_INT)
{
rUSB_INT_REG=SUSPEND_INT;
DbgPrintf( "<SUS]");
}
if(usbdIntpnd&RESUME_INT)
{
rUSB_INT_REG=RESUME_INT;
DbgPrintf("<RSM]");
}
if(usbdIntpnd&RESET_INT)
{
DbgPrintf( "<RST]"); 4次中断都是进入这里
//ResetUsbd();
ReconfigUsbd();
rUSB_INT_REG=RESET_INT; //RESET_INT should be cleared after ResetUsbd().
PrepareEp1Fifo();
}
if(epIntpnd&EP0_INT) //正常情况下,在复位中断处理以后的下一次中断应该执行到这里,可以始终执行不到
{
rEP_INT_REG=EP0_INT;
Ep0Handler();
}
if(epIntpnd&EP1_INT)
{
rEP_INT_REG=EP1_INT;
Ep1Handler();
}
if(epIntpnd&EP2_INT)
{
rEP_INT_REG=EP2_INT;
DbgPrintf("<2:TBD]"); //not implemented yet
//Ep2Handler();
}
if(epIntpnd&EP3_INT)
{
rEP_INT_REG=EP3_INT;
Ep3Handler();
}
if(epIntpnd&EP4_INT)
{
rEP_INT_REG=EP4_INT;
DbgPrintf("<4:TBD]"); //not implemented yet
//Ep4Handler();
}
ClearPending(BIT_USBD);
rINDEX_REG=saveIndexReg;
}
每次都是执行4次DbgPrintf( "<RST]")
然后就没有中断了 。
我用的是立于泰的s3c2410开发板,将程序从ads移植到keil下执行的,由于二者启动代码不同,我将ads下的中断向量表移植到keil下,中断可以响应了,但是在ads下这个中断要响应60次左右,用作整个枚举状态。但是在keil下响应到第4次就不行了,这4次都是在响应复位中断。
本人对usbd的枚举具体过程不是很熟,通过跟踪程序我发现,在ads下的中断响应第1、2、6次都是执行复位,第3-5、7-60次都在执行配置工作。有没有高人指点一下,为何我的keil下的程序只是执行4次复位中断就不行了。这段代码是从ads下移植过来的,只是修改了中断向量表,而且现在已经能形影中断了。问题出在哪了(硬件没问题,同一块板子,ads可以,keil不行)
通过串口打印,可以知道当usb线插入pc时,有中断产生.
void __irq IsrUsbd(void) //usb设备中断服务程序
{
U8 usbdIntpnd,epIntpnd;
U8 saveIndexReg=rINDEX_REG;
usbdIntpnd=rUSB_INT_REG;
epIntpnd=rEP_INT_REG;
DbgPrintf( "[INT:EP_I=%x,USBI=%x]",epIntpnd,usbIntpnd );
if(usbdIntpnd&SUSPEND_INT)
{
rUSB_INT_REG=SUSPEND_INT;
DbgPrintf( "<SUS]");
}
if(usbdIntpnd&RESUME_INT)
{
rUSB_INT_REG=RESUME_INT;
DbgPrintf("<RSM]");
}
if(usbdIntpnd&RESET_INT)
{
DbgPrintf( "<RST]"); 4次中断都是进入这里
//ResetUsbd();
ReconfigUsbd();
rUSB_INT_REG=RESET_INT; //RESET_INT should be cleared after ResetUsbd().
PrepareEp1Fifo();
}
if(epIntpnd&EP0_INT) //正常情况下,在复位中断处理以后的下一次中断应该执行到这里,可以始终执行不到
{
rEP_INT_REG=EP0_INT;
Ep0Handler();
}
if(epIntpnd&EP1_INT)
{
rEP_INT_REG=EP1_INT;
Ep1Handler();
}
if(epIntpnd&EP2_INT)
{
rEP_INT_REG=EP2_INT;
DbgPrintf("<2:TBD]"); //not implemented yet
//Ep2Handler();
}
if(epIntpnd&EP3_INT)
{
rEP_INT_REG=EP3_INT;
Ep3Handler();
}
if(epIntpnd&EP4_INT)
{
rEP_INT_REG=EP4_INT;
DbgPrintf("<4:TBD]"); //not implemented yet
//Ep4Handler();
}
ClearPending(BIT_USBD);
rINDEX_REG=saveIndexReg;
}
每次都是执行4次DbgPrintf( "<RST]")
然后就没有中断了 。
我用的是立于泰的s3c2410开发板,将程序从ads移植到keil下执行的,由于二者启动代码不同,我将ads下的中断向量表移植到keil下,中断可以响应了,但是在ads下这个中断要响应60次左右,用作整个枚举状态。但是在keil下响应到第4次就不行了,这4次都是在响应复位中断。
本人对usbd的枚举具体过程不是很熟,通过跟踪程序我发现,在ads下的中断响应第1、2、6次都是执行复位,第3-5、7-60次都在执行配置工作。有没有高人指点一下,为何我的keil下的程序只是执行4次复位中断就不行了。这段代码是从ads下移植过来的,只是修改了中断向量表,而且现在已经能形影中断了。问题出在哪了(硬件没问题,同一块板子,ads可以,keil不行)
...全文
相关推荐
GD32 USBD 编程指导手册
2.1.4 应用配置应用配置是实现 USB 设备编程的最后一个步骤,需要正确地配置应用,以确保 USB 设备的正常工作。
stm32f407 USBD VCP+Printer 精简工程
在压缩包"stm32f407_usbd_proj"中,可能包含以下关键文件:1. `main.c` - 主函数,通常包含初始化代码,设置中断服务例程,以及VCP和Printer类设备的控制逻辑。2.
GD32F103 USBD CDC移植[可运行源码]
文章还介绍了如何添加自定义回调函数usbd_cdc_data_out_irq_callback来处理中断中的USB数据,这使得整个数据处理过程更加高效和灵活。
uCOS-III 3.04 +uc-USBD for STM32F4
**uc-USBD集成**:配置USB控制器的硬件寄存器,然后将uc-USBD库集成到工程中,根据需要选择并配置相应的USB类驱动。4.
VMT在USBD模块验证中的应用.pdf
#### 三、USBD模块验证##### 1.


