各位大神给瞅瞅,我要用ADC采样,使用EVA的周期中断启动adc,但是怎么都进入不了中断,希望有大神能够帮忙,小弟感激不尽了。
下面是源程序:
int n;
float adc[16]; //用于存储AD转换结果
float adclo; //AD转换的模拟参考电平,super2812中已经将其接地
float result[ 100];
void main(void)
{ n=0;//用于统计采样次数
InitSysCtrl();
// Disable and clear all CPU interrupts:
DINT;
IER = 0x0000;
IFR = 0x0000;
// Initialize Pie Control Registers To Default State:
InitPieCtrl();
InitPieVectTable();
InitEv();
InitAdc();
InitSci();
InitGpio();
// Init_LCD();
adclo=0; //通常ADCLO接地,super2812中已经将其接地
PieCtrl.PIEIER1.bit.INTx6 =1; //使能PIE模块中的AD采样中断
PieCtrl.PIEIER2.bit.INTx4=1; //使能PIE模块中的T1周期中断
EALLOW;
PieVectTable.ADCINT=&ADCINT_ISR;
PieVectTable.T1PINT=&T1PINT_ISR;
EDIS;
IER|=M_INT1; //开CPU中断
IER|=M_INT2;
EINT; //使能全局中断
ERTM; //使能实时中断
EvaRegs.T1CON.bit.TENABLE=1; //启动T1计数
while(1)
{ }
}
void InitAdc(void)
{
unsigned int i;
AdcRegs.ADCTRL1.bit.RESET=1;
for(i=0;i<300;i++) {};
AdcRegs.ADCTRL1.bit.RESET=0;
AdcRegs.ADCTRL1.bit.SUSMOD=3; //仿真暂停时,序列发生器和其他数字电路逻辑立即停止
AdcRegs.ADCTRL1.bit.ACQ_PS=0; //采样窗口大小,SOC脉冲宽度为1个ADCLK
AdcRegs.ADCTRL1.bit.CPS=0; //核时钟预定标器,等于0,未将时钟进行2分频
AdcRegs.ADCTRL1.bit.CONT_RUN=0; //运行于启动/停止模式
AdcRegs.ADCTRL1.bit.SEQ_CASC=1; //单序列级联发生器模式
AdcRegs.ADCTRL3.bit.ADCBGRFDN=3;
for(i=0;i<10000;i++) {};
AdcRegs.ADCTRL3.bit.ADCPWDN=1;
for(i=0;i<5000;i++) {};
AdcRegs.ADCTRL3.bit.ADCCLKPS=15; //ADCLK=HSPCLK/30 2.5MHZ
AdcRegs.ADCTRL3.bit.SMODE_SEL=0; //采用顺序采样模式
AdcRegs.MAX_CONV.bit.MAX_CONV=0x07; //用8路采样
AdcRegs.CHSELSEQ1.bit.CONV00=0; //采集通道1
AdcRegs.CHSELSEQ1.bit.CONV01=1; //对ADCINA1通道进行采样
AdcRegs.CHSELSEQ1.bit.CONV02=2; //对ADCINA2通道进行采样
AdcRegs.CHSELSEQ1.bit.CONV03=3; //对ADCINA3通道进行采样
AdcRegs.CHSELSEQ2.bit.CONV04=4; //对ADCINA4通道进行采样
AdcRegs.CHSELSEQ2.bit.CONV05=5; //对ADCINA5通道进行采样
AdcRegs.CHSELSEQ2.bit.CONV06=6; //对ADCINA6通道进行采样
AdcRegs.CHSELSEQ2.bit.CONV07=7; //对ADCINA7通道进行采样
/* AdcRegs.CHSELSEQ3.bit.CONV08=8; //参考通道2
AdcRegs.CHSELSEQ3.bit.CONV09=9; //对ADCINB1通道进行采样
AdcRegs.CHSELSEQ3.bit.CONV10=10; //对ADCINB2通道进行采样
AdcRegs.CHSELSEQ3.bit.CONV11=11; //对ADCINB3通道进行采样
AdcRegs.CHSELSEQ4.bit.CONV12=12; //对ADCINB4通道进行采样
AdcRegs.CHSELSEQ4.bit.CONV13=13; //对ADCINB5通道进行采样
AdcRegs.CHSELSEQ4.bit.CONV14=14; //对ADCINB6通道进行采样
AdcRegs.CHSELSEQ4.bit.CONV15=15; //对ADCINB7通道进行采样*/
AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1; //清除SEQ1中的中断标志位INT_SEQ1
AdcRegs.ADC_ST_FLAG.bit.INT_SEQ2_CLR=1; //清除SEQ2中的中断标志位INT_SEQ2
AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ=0;
AdcRegs.ADCTRL2.bit.RST_SEQ1=0;
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1;//使能SEQ1的中断请求
AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1=0;
AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=1; //允许EVA启动触发SEQ1/SEQ
AdcRegs.ADCTRL2.bit.EXT_SOC_SEQ1=0;
AdcRegs.ADCTRL2.bit.RST_SEQ2=0;
AdcRegs.ADCTRL2.bit.SOC_SEQ2=0;
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2=0;
AdcRegs.ADCTRL2.bit.INT_MOD_SEQ2=0;
AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ2=0;
AdcRegs.ADCTRL2.bit.SOC_SEQ1=0;
}
void InitEv(void)
{
EvaRegs.T1CON.bit.TMODE=2; //计数模式为连续增计数
EvaRegs.T1CON.bit.TPS=1; //T1CLK=HSPCLK/2=37.5MHz
EvaRegs.T1CON.bit.TENABLE=0; //暂时禁止T1计数
EvaRegs.T1CON.bit.TCLKS10=0; //使用内部时钟
EvaRegs.GPTCONA.bit.T1TOADC=2; //周期中断启动ADC
EvaRegs.EVAIMRA.bit.T1PINT=1; //使能定时器T1的周期中断
EvaRegs.EVAIFRA.bit.T1PINT=1; //清除定时器T1的周期中断标志位
EvaRegs.T1PR=0x0EA5; //周期为0.1ms
EvaRegs.T1CNT=0; //初始化计数器寄存器
}
interrupt void ADCINT_ISR(void) // ADC
{
IFR = 0x0000; //清除CPU中断标志
adc[0]=((float)AdcRegs.RESULT0)*3.0/65520.0+adclo; //存放ADCINA0的结果
adc[1]=((float)AdcRegs.RESULT1)*3.0/65520.0+adclo; //存放ADCINB0的结果
adc[2]=((float)AdcRegs.RESULT2)*3.0/65520.0+adclo; //存放ADCINA1的结果
adc[3]=((float)AdcRegs.RESULT3)*3.0/65520.0+adclo; //存放ADCINB1的结果
adc[4]=((float)AdcRegs.RESULT4)*3.0/65520.0+adclo; //存放ADCINA2的结果
adc[5]=((float)AdcRegs.RESULT5)*3.0/65520.0+adclo; //存放ADCINB2的结果
adc[6]=((float)AdcRegs.RESULT6)*3.0/65520.0+adclo; //存放ADCINA3的结果
adc[7]=((float)AdcRegs.RESULT7)*3.0/65520.0+adclo; //存放ADCINB3的结果
adc[8]=((float)AdcRegs.RESULT8)*3.0/65520.0+adclo; //存放ADCINA4的结果
adc[9]=((float)AdcRegs.RESULT9)*3.0/65520.0+adclo; //存放ADCINB4的结果
adc[10]=((float)AdcRegs.RESULT10)*3.0/65520.0+adclo;//存放ADCINA5的结果
adc[11]=((float)AdcRegs.RESULT11)*3.0/65520.0+adclo;//存放ADCINB5的结果
adc[12]=((float)AdcRegs.RESULT12)*3.0/65520.0+adclo;//存放ADCINA6的结果
adc[13]=((float)AdcRegs.RESULT13)*3.0/65520.0+adclo;//存放ADCINB6的结果
adc[14]=((float)AdcRegs.RESULT14)*3.0/65520.0+adclo;//存放ADCINA7的结果
adc[15]=((float)AdcRegs.RESULT15)*3.0/65520.0+adclo;//存放ADCINB7的结果
result[n]=adc[0];
n++;
PieCtrl.PIEACK.all=0x0001; //响应PIE同组中断
AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1; //清除AD中断的标志位
AdcRegs.ADCTRL2.bit.SOC_SEQ1=1; //使能下一次
AdcRegs.ADCTRL2.bit.RST_SEQ1=1;
AdcRegs.ADCTRL2.bit.RST_SEQ2=1;
EINT; //使能全局中断
}
interrupt void T1PINT_ISR(void) // EV-A
{
PieCtrl.PIEACK.bit.ACK2=1; //响应同组其他中断
EvaRegs.EVAIFRA.bit.T1PINT=1; //清除定时器T1周期中断标志位
EINT; //使能全局中断
}
此帖出自
小平头技术问答
一周热门 更多>