WCH沁恒单片机
直播中

李维嘉

8年用户 1513经验值
私信 关注
[问答]

ch55x usb未响应中断是为什么?

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;            
   //P15P14P13?????;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();

    }
}

回帖(12)

毛春华

2022-7-11 10:18:43
EA = 1后代码卡在了while循环里,USB_Enum_OK这个变量应该是usb枚举完成后才置位的。
举报

刘峰

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

邬连拓

2022-7-11 10:18:52
你好,这个不是bug,也跟中断没有关系,看你上面贴的代码,是死在了while循环里面,你把那个while循环注释掉就好了。
举报

侯倩

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

更多回帖

发帖
×
20
完善资料,
赚取积分