TMS320F28379D: 移植例程无法进入中断

Part Number: TMS320F28379D

hi,TI工程师

  我在移植adc_soc_epwm_cpu01.c例程到我的工程中发现,程序不进入adca1_isr中断。不确定是否是工程配置导致的问题。

#include "F28x_Project.h"
#include "drv_cfg.h"
#include "board.h"

void ConfigureADC(void);
void ConfigureEPWM(void);
void SetupADCEpwm(Uint16 channel);
interrupt void adca1_isr(void);

uint16_t aa=0,bb=55,cc=0;
/**
 * main.c
 */
uint16_t temp=0,temp2=0x80;
int main(void)
{
    //初始化PLL、看门狗、使能外设时钟
    InitSysCtrl();
    //关闭CPU中断
    DINT;
    //初始化PIE向量表
    InitPieCtrl();
    //清除所有CPU中断标志:
    IER = 0x0000;
    IFR = 0x0000;
    //初始化中断向量表
    InitPieVectTable();

//    board_init();
//    bool read_flag= drv_eeprom_init();
//    //检查参数是否读取成功
//    if(read_flag != true){
//
//    }
//    drv_rdcInit();

        EALLOW;
        PieVectTable.ADCA1_INT = &adca1_isr; //function for ADCA interrupt 1
        EDIS;

        ConfigureADC();
        ConfigureEPWM();
        SetupADCEpwm(0);

        EALLOW;
        CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
        EDIS;

        EALLOW;
        PieCtrlRegs.PIEIER1.bit.INTx1 = 1;
        EDIS;


        IER |= M_INT1;
        EINT;
        ERTM;
        EALLOW;
         EPwm1Regs.ETSEL.bit.SOCAEN = 1;
         EPwm1Regs.TBCTL.bit.CTRMODE = 0;
         EDIS;
	 while(1){
//	     bsp_sci_send(&SciaRegs,bb);
//	     delay_ms(50);

//	     if(aa==1){

//	         aa=0;
//	     }

	 }
}
#define RESULTS_BUFFER_SIZE 256
uint16_t AdcaResults[RESULTS_BUFFER_SIZE]={0},resultsIndex=0;

interrupt void adca1_isr(void){

    AdcaResults[resultsIndex++] = AdcaResultRegs.ADCRESULT0;
    if(RESULTS_BUFFER_SIZE <= resultsIndex)
    {
        resultsIndex = 0;

    }
    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

    if(1 == AdcaRegs.ADCINTOVF.bit.ADCINT1)
    {
        AdcaRegs.ADCINTOVFCLR.bit.ADCINT1 = 1; //clear INT1 overflow flag
        AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //clear INT1 flag
    }

    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
void ConfigureADC(void)
{
    EALLOW;

    //
    //write configurations
    //
    AdcaRegs.ADCCTL2.bit.PRESCALE = 6; //set ADCCLK divider to /4
    AdcSetMode(ADC_ADCA, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);

    //
    //Set pulse positions to late
    //
    AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;

    //
    //power up the ADC
    //
    AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;

    //
    //delay for 1ms to allow ADC time to power up
    //
    DELAY_US(1000);

    EDIS;
}
void ConfigureEPWM(void)
{
    EALLOW;
    // Assumes ePWM clock is already enabled
    EPwm1Regs.ETSEL.bit.SOCAEN    = 0;    // Disable SOC on A group
    EPwm1Regs.ETSEL.bit.SOCASEL    = 4;   // Select SOC on up-count
    EPwm1Regs.ETPS.bit.SOCAPRD = 1;       // Generate pulse on 1st event
    EPwm1Regs.CMPA.bit.CMPA = 0x0800;     // Set compare A value to 2048 counts
    EPwm1Regs.TBPRD = 0x1000;             // Set period to 4096 counts
    EPwm1Regs.TBCTL.bit.CTRMODE = 3;      // freeze counter
    AdcaRegs.ADCINTOVFCLR.bit.ADCINT1 = 1;
    EDIS;
}

//
// SetupADCEpwm - Setup ADC EPWM acquisition window
//
void SetupADCEpwm(Uint16 channel)
{
    Uint16 acqps;

    //
    // Determine minimum acquisition window (in SYSCLKS) based on resolution
    //
    if(ADC_RESOLUTION_12BIT == AdcaRegs.ADCCTL2.bit.RESOLUTION)
    {
        acqps = 14; //75ns
    }
    else //resolution is 16-bit
    {
        acqps = 63; //320ns
    }

    //
    //Select the channels to convert and end of conversion flag
    //
    EALLOW;
    AdcaRegs.ADCSOC0CTL.bit.CHSEL = channel;  //SOC0 will convert pin A0
    AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps; //sample window is 100 SYSCLK cycles
    AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5; //trigger on ePWM1 SOCA/C
    AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0; //end of SOC0 will set INT1 flag
    AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;   //enable INT1 flag
    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //make sure INT1 flag is cleared
    EDIS;
}