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;
} |