关于2440内部AD中断方式 采集数据
想用AIN2采集模拟量 转换后打印到串口可是老是不出信息 这是为啥啊大伙帮忙看看我菜鸟 可能有许多错误的地方 见谅见谅
#define EnableIrq(bit) rINTMSK &= ~(bit)
#define DisableIrq(bit) rINTMSK |= (bit)
#define BIT_ADC (0x1<<31)
static void __irq ADC_ISR(void)
{
int i;
if(rINTPND==BIT_ADC)
{
ClearPending(BIT_ADC);
i= (int)rADCDAT0 & 0x3ff;
Uart_Printf("AIN2=%4d",i);
}
}
__inline void ClearPending(int bit)
{
rSRCPND = bit;
rINTPND = bit;
}
void main(void)
{
ClearPending(BIT_ADC);
pISR_ADC=(U32)ADC_ISR;
EnableIrq(BIT_ADC);
Uart_Printf( "\nADC INPUT Test, press ESC key to exit !\n" ) ;
preScaler = ADC_FREQ;
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
while( Uart_GetKey() != ESC_KEY ) ;
DisableIrq(BIT_ADC);
} 一网友告诉我说Uart_printf也是需要中断我当时没想起来 最好不要再中断函数里面用Uart_pritf
我又改进了程序
#define EnableIrq(bit) rINTMSK &= ~(bit)
#define DisableIrq(bit) rINTMSK |= (bit)
#define BIT_ADC (0x1<<31)
volatile U32 ADresult=0;
static void __irq ADC_ISR(void)
{
if(rINTPND==BIT_ADC)
{
ClearPending(BIT_ADC);
ADresult= (int)rADCDAT0 & 0x3ff;
}
}
__inline void ClearPending(int bit)
{
rSRCPND = bit;
rINTPND = bit;
}
void main(void)
{
Uart_Printf( "\nADC INPUT Test, press ESC key to exit !\n" ) ;
preScaler = ADC_FREQ;
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
ClearPending(BIT_ADC);
pISR_ADC=(U32)ADC_ISR;
EnableIrq(BIT_ADC);
Uart_Printf("AIN2=%4d",ADresult);
while( Uart_GetKey() != ESC_KEY ) ;
DisableIrq(BIT_ADC);
}
仍然不行进不去中断服务程序 斑竹大人啊 赶快指导指导啊
1# Rain_ning 经过不懈的努力发现自己的错误在于不知道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
页:
[1]