ch55x usb未响应中断大BUG!stm32 usb不会有这种大bug!!

usb一旦没有接入,比如说usb只接电源,不通信的时候,下面的函数一直卡在内部,有什么办法绕过去的哦!就是EA=1启动,我别的功能都没有用了(注意重点gpio中断函数不执行,执行失败),一直卡在里面!现在就是需要我usb万一只是通电,不能影响我其他功能(GPIO中断);要是usb通信的时候,也要能通信!

USBDeviceInit();                                                 
  EA = 1;

//注意这个是中断函数,只要usb通信了,哪怕是当前状态usb通电状态,再加入usb信号,这个中断都可以使能,一旦usb通信数据线拔掉又没有功能,再插入usb数据线又有功能,请问这个是啥问题呢??


void GPIOInterruptCfg()
{
   GPIO_IE &= ~bIE_IO_EDGE;                                                    //?/?????
//    GPIO_IE |= bIE_IO_EDGE;                                                  //??/???? 
//    GPIO_IE |= bIE_RXD1_LO;                                                     //RXD1?????????
   GPIO_IE |= bIE_P3_1_LO;           
   //P15\P14\P13?????;RST?????
//    GPIO_IE |= bIE_P3_1_LO;                                                     //P31?????????
//    GPIO_IE |= bIE_RXD0_LO;                                                     //RXD0????????? 
   IE_GPIO  = 1;                                                               //GPIO????
 
 IP_EX|=bIP_GPIO;//注意这个中断在while循坏就搞定了!!
}



IT0 = 1;

EX0 = 1;   

你开启gpio外部中断IN0(P3.2)  

跟我那个P3.1没有任何关系!


voidGPIOInterrupt( void ) interrupt INT_NO_GPIO  using 3                      //GPIO??????,??????1

kd_led();

}


void main( void )
{


    CfgFsys( );
  kd_pwm_init(); 
  kd_gpio_init(); 

 
   mDelaymS(5);                                                          
 
 memset(TP,0,sizeof(TP));
 CTP_Info.x_max_pos = 0;
 CTP_Info.y_max_pos = 0; 
 CTP_Info.IRQ_Flag = 0;
 
 
 
 

 GT_Init();

 MAX_POINT = 5;                                                     


 MyManuInfo_Len = sizeof(MyManuInfo);
 MyProdInfo_Len = sizeof(MyProdInfo);

  GPIOInterruptCfg();
  USBDeviceInit();                                                     
  EA = 1;              //注意就是卡在了这里,因为usb只通电了,USBDeviceInit 源码也看不到,只有lib文件,把相关函数放在EA=1前面就可以正常,EA=1后面就不行了,因为这个是全局中断使能啦啦!usb中断优先级比gpio中断优先级要高,就卡在那里了! 

                                    

 while( USB_Enum_OK == 0 )
 {
  

 };                                           
 
 IT0 = 1;
 EX0 = 1;                                                                /* ??????????????????,?????ì?????? */
 
 CH554WDTModeSelect(1);                                                  /* ?????????ú?????????· */
    while(1)
    {

  
    
  CH554WDTFeed(0);


  GT_Touch_Check();

    }
}


EA = 1后代码卡在了while循环里,USB_Enum_OK这个变量应该是usb枚举完成后才置位的。


把相关函数放在EA=1前面就可以正常,EA=1后面就不行了,因为这个是全局中断使能啦啦!usb中断优先级比gpio中断优先级要高,就卡在那里了!


你好,这个不是bug,也跟中断没有关系,看你上面贴的代码,是死在了while循环里面,你把那个while循环注释掉就好了。


你好,这个不是bug,也跟中断没有关系。看你上面贴的代码,是死在了while( USB_Enum_OK == 0 )循环里面,你把那个while循环注释掉就好了。


//注意这个是中断函数,只要usb通信了,哪怕是当前状态usb通电状态,再加入usb信号,这个中断都可以使能,一旦usb通信数据线拔掉又没有功能,再插入usb数据线又有功能,请问这个是啥问题呢??

voidGPIOInterrupt( void ) interrupt INT_NO_GPIO  using 3                      //GPIO??????,??????1

kd_led();

}


这个中断函数不管你while啥的,都是可以中断到的,结果就是不行!!!请问到底是啥问题,莫名其妙的!usb随时通信,功能都可以,不通信这个功能就没有了!!!


另外还有一个问题就是这个芯片对电流稳定性很敏感,我用这个芯片去复位别的芯片,结果这个芯片就自动重启了!浪涌敏感有点高!!


IT0 = 1;

EX0 = 1;   

你开启gpio外部中断是在while后,这两句不启用usb通讯跳过while循环代码怎么执行到呢?

若只是通过芯片io拉高低电平来模拟另外芯片外部复位环境,不会导致复位,芯片只是io口操作而已。具体情况可打我电话或者加我微信详细沟通一下,18951773083这是我手机,微信同号。


void GPIOInterruptCfg()
{
   GPIO_IE &= ~bIE_IO_EDGE;                                                    //?/?????
//    GPIO_IE |= bIE_IO_EDGE;                                                  //??/???? 
//    GPIO_IE |= bIE_RXD1_LO;                                                     //RXD1?????????
   GPIO_IE |= bIE_P3_1_LO;           
   //P15\P14\P13?????;RST?????
//    GPIO_IE |= bIE_P3_1_LO;                                                     //P31?????????
//    GPIO_IE |= bIE_RXD0_LO;                                                     //RXD0????????? 
   IE_GPIO  = 1;                                                               //GPIO????
 
 IP_EX|=bIP_GPIO;//注意这个中断在while循坏就搞定了!!
}



IT0 = 1;

EX0 = 1;   

你开启gpio外部中断IN0(P3.2)  

跟我那个P3.1没有任何关系!


只要usb通信了,哪怕是当前状态usb通电状态,再加入usb信号,这个中断都可以有功能,一旦usb通信数据线拔掉又没有功能,再插入usb数据线又有功能,请问这个做如何解释??


第一次若只是上电运行程序,肯定不会影响你的gpio中断。当usb通讯后再去掉d+ d-线的话会进挂起中断,我们例程中会将芯片睡眠,不知道你的代码是怎么处理的,有可能后面就将芯片睡眠了。


例程中会将芯片睡眠!如何关闭这个功能!谢谢!!我需当usb通讯后再去掉d+ d-线,不能影响我的芯片功能!!


您好,TP例程在USB收到挂起信号之后就进入睡眠,该功能集成在LIB库内部无法修改。如果对USB有自定义开发需求,可以尝试使用通用USB例程进行开发,参考/downloads/CH554EVT_ZIP.html


只有登录才能回复,可以选择微信账号登录