whws007 发表于 2011-12-1 15:22

ucos 触摸屏中断和UART接收中断冲突?麻烦大侠给指点指点

ucos,ADS,2440   在点击触摸屏的同时给板子串口发数据,就会引起串口接收中断失效,即使不点击触屏只是发数据也无法进入串口接收中断子程序,触屏中断还是好的没影响,代码如下:



//触摸屏中断初始化
void TouchINT_Init(void)
{
    rSUBSRCPND |= BIT_SUB_TC; //屏蔽SUBSRCPND所标识的中断,此处所有位对应的中断都被屏蔽
   // rSUBSRCPND |= BIT_SUB_ADC; //屏蔽SUBSRCPND所标识的中断,此处所有位对应的中断都被屏蔽
   
    rSRCPND   |= BIT_ADC;   
   // rINTPND |= (BIT_ADC);//清除总中断状态寄存器
   
   pISR_ADC=(unsigned)Adc_Tc_ISR;//设置中断向量
   
   
   
    rINTMSK &= ~(BIT_ADC);       //开启 ADC 中断
    rINTSUBMSK &= ~(BIT_SUB_TC); //打开TC中断屏蔽
//rINTSUBMSK &= ~(BIT_SUB_ADC); //打开ADC子中断屏蔽
}

//触摸屏中断程序
voidAdc_Tc_ISR(void)
{


    if(rADCDAT0&0x8000) //触笔没按下
   {

    rADCTSC=0xd3; //进等待模式,等待触笔按下
   
   }
      
    rADCTSC=(1<<3)|(1<<2);   /* 进入自动(连续) X/Y轴坐标转换模式 */

      /* 设置位为1,启动A/D转换
         * 注意:ADCDLY为50000,PCLK = 50MHz,
         *       要经过(1/50MHz)*50000=1ms之后才开始转换X坐标
         *       再经过1ms之后才开始转换Y坐标
         */
         
    rADCCON |= 0x1;//启动AD转换
    // 当A/D转换真正开始时,位会自动清0
    while (rADCCON & 0x01);
      // 检测位,当它为1时表示转换结束
    while (!(rADCCON & 0x8000));
   
    xdata=(rADCDAT0 & 0x3ff);
    ydata=(rADCDAT1 & 0x3ff);
   
      
    TC_flag1=1;
   

      // 清触摸屏中断
    rSUBSRCPND |= BIT_SUB_TC;
    rSUBSRCPND |= BIT_SUB_ADC;
    rSRCPND   |= BIT_ADC;   
//开中断
//rINTMSK &= ~(BIT_ADC);
rINTSUBMSK &= ~(BIT_SUB_TC);
rINTSUBMSK &= ~(BIT_SUB_ADC); // 开启INT_ADC中断,即A/D转换结束时产生中断

    rADCTSC =0xd3;    //Waiting for interrupt
rADCTSC=rADCTSC|(1<<8); // Detect stylus up interrupt signal.
    //rADCTSC = 0x1d3;//进入"等待中断模式",等待触摸屏被松开


    while(!(rSUBSRCPND & BIT_SUB_TC));//触摸笔松开,SUBSRCPND的BIT_SUB_TC置1   
    rADCTSC = 0xd3;//进入"等待中断模式",等待触摸屏被按下
   
    rSUBSRCPND|=BIT_SUB_TC;
    rSUBSRCPND |= BIT_SUB_ADC;
ClearPending(BIT_ADC);
   
    rINTMSK &= ~(BIT_ADC);
    rINTSUBMSK &= ~(BIT_SUB_TC); // Unmask sub interrupt (TC)
   
   // Uart0INT_Init();//测试时触摸屏按的太快,就会出现串口接受中断失灵,在此初始化串口接受中断程序

    }


//USART中断初始化
void Uart0INT_Init(void)
{

    rINTMOD = 0x0;            //INTMOD寄存器中所有位为0,对应的中断都为IRQ普通中断,都不是FIQ快速中断
    rSUBSRCPND |= 0x3;//清除UART0接受中断状态寄存器
    rSRCPND |= (0x1<<28);//清除UART中断状态寄存器
       pISR_UART0=(unsigned)Uart0GetINT_Handler;//把 TICKINT_Handler 这个中断服务子程序的入口地址放到pISR_TICK,
                                        //也就是放到0x33ffff00+0x04这个地址单元,即放入对应的中断向量表,
                                        //当中断发生时可通过查向量表找到这个入口地址
    rINTMSK &= ~(BIT_UART0);       //开启 UART0 中断
    rINTSUBMSK &= ~(BIT_SUB_RXD0); //开UART接受中断
   
}
//中断程序
voidUart0GetINT_Handler(void)
{

    static int i;
    int uart_flag;
   
      for(i=0;i<8;i++)
   {
   str2=rURXH0;
   
      delay(1000);
   }
    uart_flag=((str2=='s')&(str2=='h')&(str2=='a')&(str2=='n')&(str2=='0')&(str2=='0')&(str2=='0')&(str2=='0'));
   
      if(uart_flag)
   {
       Uart_Printk(s3);//数据以字符串形式发送
   }
   
   rSUBSRCPND |= 0x3;//清除UART0接收中断状态寄存器
   rSRCPND |= (0x1<<28);//清除UART0中断状态寄存器
   rINTPND |= (0x1<<28);//清除总中断状态寄存器
   
   rINTMSK &= ~(BIT_UART0);       //开启 UART0 中断
   rINTSUBMSK &= ~(BIT_SUB_RXD0); //开UART接受中断
   //UART_key=1;   
    }

airwill 发表于 2011-12-3 21:08

触屏中断里的等待是否不要做?
while(!(rSUBSRCPND & BIT_SUB_TC));//触摸笔松开,SUBSRCPND的BIT_SUB_TC置1
这个费太长时间, 肯定影响 USART 接收数据. 可以不等松开就退出. 以后再定时去监测一下.
uart 中断里也有延时程序, 是否可以采用 FIFO, 足够数据后集中处理?

whws007 发表于 2011-12-13 10:15

本帖最后由 whws007 于 2011-12-13 10:26 编辑

不好意思,前段时间这问题稀里糊涂给解决了(给串口加了超时中断和FIFO),这帖子放这都给忘了。
while(!(rSUBSRCPND & BIT_SUB_TC));//触摸笔松开,SUBSRCPND的BIT_SUB_TC置1这个费太长时间, 肯定影响 USART 接收数据.可以不等松开就退出. 以后再定时去监测一下.   
这个方法我准备试下,
uart 中断里也有延时程序, 是否可以采用 FIFO, 足够数据后集中处理
这个现在程序已经采用的是FIFO了
非常感谢

2# airwill

tzzhuang 发表于 2012-1-26 10:03

有个疑问请教楼主,书上说进入中断服务子程序后CPU寄存器内容要入栈,还要调用OSIntEnter(),但楼主的ISR好像只是关闭了中断而已,这是为什么?(我是菜鸟^_^,请指教)

i55 发表于 2012-1-31 15:51

USART中断处理太扯淡了,耗费的时间太多了。
正确的做法是中断里面post sem/mbox/q,然后在一个task里面pend之。
页: [1]
查看完整版本: ucos 触摸屏中断和UART接收中断冲突?麻烦大侠给指点指点