DSP2812 ADC进入不了中断

2019-03-26 16:04发布

各位大神给瞅瞅,我要用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;   //使能全局中断

} 此帖出自小平头技术问答
0条回答

一周热门 更多>