|  | 
| 经过不懈的努力  发现自己的错误在于不知道ADC的中断有两个子中断  2440的ADC中断包括INT_ADC_S和INT_TC  需要先处理一下子中断INT_ADC_C  再处理INT_ADC 另外要感谢网友hbicecream的帮助  我才想起来Uart_Printf函数也是需要中断的
 所以最好不要在中断服务程序中使用Uart_Printf
 最终整理的程序如下:
 使用的板子为TQ2440
 #define        EnableIrq(bit)                rINTMSK &= ~(bit)
 #define        DisableIrq(bit)                rINTMSK |= (bit)
 #define        EnableSubIrq(bit)        rINTSUBMSK &= ~(bit)
 #define        DisableSubIrq(bit)        rINTSUBMSK |= (bit)
 #define BIT_ADC                        (0x1<<31)
 #define BIT_SUB_ADC                (0x1<<10)
 
 __inline void ClearPending(int bit)
 {
 rSRCPND = bit;
 rINTPND = bit;
 }
 
 __inline void ClearSubPending(int bit)
 {
 rSUBSRCPND |= bit;
 }
 
 volatile U32 ADresult=0;//该变量做测试用 看能不能进入中断服务程序
 volatile U32 ADping=0;
 
 static void __irq ADC_ISR(void)
 {
 ADping=8;
 
 if(rINTPND==BIT_ADC)
 {
 ClearSubPending(BIT_SUB_ADC);
 ClearPending(BIT_ADC);
 ADresult= (int)rADCDAT0 & 0x3ff;
 }
 }
 
 
 __inline void ClearPending(int bit)
 {
 rSRCPND = bit;
 rINTPND = bit;
 }
 
 
 void main(void)
 {
 while(1)
 {        Uart_Printf( "\nADC INPUT Test, press ESC key to exit !\n" ) ;
 
 ClearSubPending(BIT_SUB_ADC);//清子中断处理寄存器  因为AD有两个子中断 一个INT_ADC_S  一个INT_TC(即触摸屏中断)
 ClearPending(BIT_ADC);//清中断处理寄存器
 
 EnableSubIrq(BIT_SUB_ADC);//开AD子中断
 EnableIrq(BIT_ADC);//开AD中断
 
 preScaler = ADC_FREQ;//设置AD工作时钟
 Uart_Printf("ADC conv. freq. = %dHz\n",preScaler);
 preScaler = 50000000/ADC_FREQ -1;
 
 Uart_Printf("PCLK/ADC_FREQ - 1 = %d\n",preScaler);
 
 rADCCON = (1<<14)|(preScaler<<6)|(2<<3);                //setup channel
 rADCCON|=0x1;        //start ADC                                                                //start ADC
 
 
 
 pISR_ADC=(U32)ADC_ISR;//设置中断服务程序
 
 
 
 Uart_Printf("AIN2=%4d/n",ADresult);//打印转换结果
 Uart_Printf("ADping=%4d",ADping);//该变量是我做测试用的 看有没有进入中断服务程序
 
 while( Uart_GetKey() != ESC_KEY ) ;//当按下ESC键以后 会停止中断
 DisableIrq(BIT_ADC);
 DisableSubIrq(BIT_SUB_ADC);
 }
 }
 2# Rain_ning
 | 
 |