|
经过不懈的努力 发现自己的错误在于不知道ADC的中断有两个子中断 2440的ADC中断包括INT_ADC_S和INT_TC 需要先处理一下子中断INT_ADC_C 再处理INT_ADC 另外要感谢21icbbs上的网友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 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); } } |