TI中文支持网
TI专业的中文技术问题搜集分享网站

程序融合,两个都有中断触发,但是运行时,一个只触发一次,另一个可以正常触发进入中断服务子程序,求指教。。。。

芯片:F28027 仿真器:XDS100V2

问题:本人将LED例程与ADC采样例程融合时,编译无错,debug模式下ADC中断只触发一次,LED中定时器中断正常触发,并进入中断服务子程序?

求指教,程序如下:

#include "DSP28x_Project.h" // 头文件
__interrupt void cpu_timer0_isr(void);//定时器0中断服务子函数声明,用于LED灯
__interrupt void adc_isr(void);//ADC采样中断服务子函数声明
void Adc_Config(void);//
uint16_t LoopCount;
uint16_t ConversionCount;
uint16_t Voltage1[10];
uint16_t Voltage2[10];
void main(void)
{
#ifdef _FLASH
memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
#endif
//step1:系统初始化
InitSysCtrl();
// Step 2.GPIO口初始化:
// InitGpio(); // 本程序GPIO口初始化后续会给出,此处屏蔽
// Step 3. 清除所有中断及中断向量表:
DINT; // 禁用CPU中断
InitPieCtrl();//初始化中断向量表
IER = 0x0000; //中断使能及标志位清零
IFR = 0x0000;
InitPieVectTable();//中断向量表初始化
EALLOW; // 受EALLOW保护寄存器
PieVectTable.TINT0 = &cpu_timer0_isr;//将CPU中断服务子函数放入中断向量表中
EDIS; // 寄存器保护终止
EALLOW;
PieVectTable.ADCINT1 = &adc_isr;//将ADC中断服务子函数放入中断向量表中
EDIS;
// Step 4. 初始化外部设备
InitCpuTimers(); // 函数调用
ConfigCpuTimer(&CpuTimer0, 60, 500000);//配置CPU定时器0中断,定时500毫秒,CPU时钟为60MHZ,
CpuTimer0Regs.TCR.all = 0x4001; // 使用只写指令,设置状态位为0
InitAdc(); //
AdcOffsetSelfCal();
// Step 5. 用户代码区,使能中断:
EALLOW;// 配置GPIO16,17,19口为普通口及输出口
GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 0;
GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 0;
GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO16 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO17 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO19 = 1;
EDIS;
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;// 使能PIE中断,组1中断1用于ADC采样
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;// 使能PIE中断,组1中断7用于CPU定时器0
IER |= M_INT1;//使能中断1
EINT; // 使能全局中断
ERTM; // 使能全局实时中断DBGM
LoopCount = 0; //ADC采样,变量初始化
ConversionCount = 0; //ADC采样,变量初始化
//配置ADC
EALLOW;
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1; //ADCINT1 trips after AdcResults latch
AdcRegs.INTSEL1N2.bit.INT1E = 1; // ADCINT1使能
AdcRegs.INTSEL1N2.bit.INT1CONT = 0; // 禁止ADCINT1 连续模式
AdcRegs.INTSEL1N2.bit.INT1SEL = 2; // 设置EOC2为ADCINT1的触发源
AdcRegs.ADCSOC0CTL.bit.CHSEL = 4; // 设置SOC0采样通道为ADCINA4
AdcRegs.ADCSOC1CTL.bit.CHSEL = 14; // 设置SOC1采样通道为ADCINB6
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5; // 设置SOC0触发事件为EPWM1A
AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 5; // 设置SOC1触发事件为EPWM1A
//AdcRegs.ADCSOC2CTL.bit.TRIGSEL = 5; //set SOC2 start trigger on EPWM1A, due to round-robin SOC0 converts first then SOC1, then SOC2
AdcRegs.ADCSOC0CTL.bit.ACQPS = 6; // 设置ADC SOC0采样周期为7个ADC时钟周期
AdcRegs.ADCSOC1CTL.bit.ACQPS = 6; // 设置ADC SOC1采样周期为7个ADC时钟周期
//AdcRegs.ADCSOC2CTL.bit.ACQPS = 6; //set SOC2 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
EDIS;
//ADC触发事件pwm1A模块配置
EPwm1Regs.ETSEL.bit.SOCAEN = 1; // 在组中启用SoC
EPwm1Regs.ETSEL.bit.SOCASEL = 4; // 从UpCount上的CPMA中选择SOC
EPwm1Regs.ETPS.bit.SOCAPRD = 1; // 在第1次事件上生成脉冲
EPwm1Regs.CMPA.half.CMPA = 0x0080; // 设置比较器A的值
EPwm1Regs.TBPRD = 0xFFFF; // ePWM1设定周期
EPwm1Regs.TBCTL.bit.CTRMODE = 0; // 开始增计数
// Step 6 死循环停住程序:
for(;;);
}
__interrupt void cpu_timer0_isr(void)//CPU定时器0中断服务子函数结构
{
CpuTimer0.InterruptCount++;
GpioDataRegs.GPATOGGLE.bit.GPIO16 = 1; // 每0.5秒对GPIO16口输出电平翻转一次
GpioDataRegs.GPATOGGLE.bit.GPIO17 = 1;
GpioDataRegs.GPATOGGLE.bit.GPIO19 = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // 确保后续中断能够检知
}
__interrupt void adc_isr(void)//ADC中断服务子函数结构
{
Voltage1[ConversionCount] = AdcResult.ADCRESULT0;
//将结果寄存器1中的采样转换值放入数组Voltage1中
Voltage2[ConversionCount] = AdcResult.ADCRESULT1;
// 每记录10次数据覆盖一次
if(ConversionCount == 9)
{
ConversionCount = 0;
}
else
{
ConversionCount++;
}

AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //为下一次采样清除中断标志
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //确保后续中断能够检知
return;
}

//程序结束

Annie Liu:

为更加有效地解决您的问题,我们建议您将问题发布在E2E英文技术论坛上https://e2e.ti.com/support/microcontrollers/c2000/f/171,将由资深的工程师为您提供帮助。我们的E2E英文社区有TI专家进行回复,并得到全球各地工程师的支持,分享他们的知识和经验。

赞(0)
未经允许不得转载:TI中文支持网 » 程序融合,两个都有中断触发,但是运行时,一个只触发一次,另一个可以正常触发进入中断服务子程序,求指教。。。。
分享到: 更多 (0)