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;
}