打印

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

[复制链接]
3691|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
whws007|  楼主 | 2011-12-1 15:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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子中断屏蔽
}

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

    if(rADCDAT0&0x8000) //触笔没按下
     {
  
    rADCTSC=0xd3; //进等待模式,等待触笔按下
   
     }
      
    rADCTSC=(1<<3)|(1<<2);     /* 进入自动(连续) X/Y轴坐标转换模式 */
  
        /* 设置位[0]为1,启动A/D转换
         * 注意:ADCDLY为50000,PCLK = 50MHz,
         *       要经过(1/50MHz)*50000=1ms之后才开始转换X坐标
         *       再经过1ms之后才开始转换Y坐标
         */
         
    rADCCON |= 0x1;  //启动AD转换
    // 当A/D转换真正开始时,位[0]会自动清0
    while (rADCCON & 0x01);
      // 检测位[15],当它为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接受中断
   
}
//中断程序
void  Uart0GetINT_Handler(void)
{

    static int i;
    int uart_flag;
   
      for(i=0;i<8;i++)
     {  
   str2=rURXH0;
   
      delay(1000);
     }
    uart_flag=((str2[0]=='s')&(str2[1]=='h')&(str2[2]=='a')&(str2[3]=='n')&(str2[4]=='0')&(str2[5]=='0')&(str2[6]=='0')&(str2[7]=='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好像只是关闭了中断而已,这是为什么?(我是菜鸟^_^,请指教)

使用特权

评论回复
5
i55| | 2012-1-31 15:51 | 只看该作者
USART中断处理太扯淡了,耗费的时间太多了。
正确的做法是中断里面post sem/mbox/q,然后在一个task里面pend之。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

6

帖子

1

粉丝