ARM-MDK4.12关于中断奇怪的BUG


调一个程序,遇到了一个非常奇怪的问题,至今也不知道是为什么,但是,总算解决了,知道问题出在哪,但不知道根本原因在哪。想不通,先不去想了。把这个问题记录下来吧。

本来已经调试好的串口中断接收程序,和触屏校正程序,组合到一起就发现串口中断无法进入,但用查询的方式却能发送数据到电脑上,找了很久,把触摸屏程序先屏蔽看看怎么样。不做不知道,一试吓一跳!把触摸屏程序屏蔽了竟然串口中断又能正常进入了!初步知道问题是出在触摸屏上了。于是再一步步的测试,最后更让我吃惊的的事情出现了,问题锁定!竟然是触摸屏初始化程序中清除AD中断屏蔽和TC中断屏蔽这两条语句(rINTMSK=~BIT_ADC;rINTSUBMSK=~(BIT_SUB_TC); )的影响。把这两条语句(rINTMSK=~BIT_ADC;rINTSUBMSK=~(BIT_SUB_TC); )屏蔽了,串口中断正常!但这不现实,没有这两条语句我的触摸屏程序根本没有办法正常执行,难道串口中断的触摸屏中断只能二选择一?那这样就太糟糕了~!

继续思考,测试,最后发现:把串口初始化程序放到触摸屏初始化程序中清除AD中断屏蔽和TC中断屏蔽这两条语句(rINTMSK=~BIT_ADC;rINTSUBMSK=~(BIT_SUB_TC); 后面,二者就能和平共处。真的想不通为什么是这样。为什么证实这个想法,我在触摸屏中断服务程序中加了清除AD中断屏蔽和TC中断屏蔽这两条语句(rINTMSK=~BIT_ADC;rINTSUBMSK=~(BIT_SUB_TC); ),结果只要我点过屏,也就是触屏中断服务程序运行过,串口中断就没有办法进入。想来想去也不知道加上这两条语句对串口中断服务程序有什么时候影响。下面是串口中断初始化程序,和触摸屏中断初始化程序。帖出来做个证据!以后备查!哪位大虾看到了知道是什么原因还请多指教! 

//触摸屏中断初始化程序 

void TouchpanelInit(void)

{

rADCUPDN = 0;

rADCDLY=50000;                  //Normal conversion mode delay about (1/3.6864M)*50000=13.56ms

rADCCON=(1<<14)+(ADCPRS<<6);   //ADCPRS En, ADCPRS Value

rADCTSC=0xd3;                  //Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En  等等中断模式 

pISR_ADC = (int)AdcTsAuto;

rINTMSK=~BIT_ADC;       //ADC Touch Screen Mask bit clear

rINTSUBMSK=~(BIT_SUB_TC);

//串口中断初始化程序。 

void UART0_INT_INIT(void)

/*IIC中断源有效(IIC中断源使能)*/

rINTMSK &= ~(BIT_UART0); 

rSUBSRCPND=BIT_SUB_RXD0;      //清除SUBSRCPND中BIT_SUB_RXD0,INTSUBMSK标示

rSUBSRCPND=BIT_SUB_ERR0;

rINTSUBMSK=rINTSUBMSK&(~BIT_SUB_RXD0);//清除屏蔽

rINTSUBMSK=rINTSUBMSK&(~BIT_SUB_ERR0);

ClearPending(BIT_UART0);              //清除INTPND,SRCPND中断标示

rINTMSK=rINTMSK&(~BIT_UART0);         //清除屏蔽 

/*pISR_IIC:IIC中断服务程序地址寄存器  IicInt为IIC中断服务函数名*/

pISR_UART0 = (unsigned)UART0_ISR;

最后解决方案:把/串口中断初始化程序放到触摸屏中断初始化程序后边,并且以后和程序都不再出现有操作rINTSUBMSK,rINTMSK寄存器清0的语句,那么一切正常!我还测试过,在程序后面换了操作别的中断源屏蔽寄存器清0操作的同样的也会造成串口无法进入到中断和情况下。以后记住这个!先把这个当是MDK的一个BUG吧。!

相关内容