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

F28027 LED例程与ADC采样例程融合

芯片:F28027  仿真器:XDS100V2

我在将LED例程与ADC采样例程写入一个项目,编译成功后;

1,debug模式下只有LED灯闪烁,监视采样结果存储变量无变化(未采样到数据)?

2,几次之后直接进不去DEBUG模式,报错如下:

Error connecting to the target:(Error -1041 @ 0xFFFFFF66)
The emulator reported an error. Confirm emulator configuration and connections, reset the emulator, and retry the operation.
(Emulation package 5.1.450.0)

程序如下:

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

//程序结束

user6102121:

回复 Green Deng:

首先谢谢
其次运行之后没有采样结果,本来打算在DEBUG中单步执行观察是否有进入ADC中断服务子程序,结果现在仿真器与目标板链接不上
换仿真器后依旧链接不上,现在要确认是否是板子烧坏了

芯片:F28027  仿真器:XDS100V2

我在将LED例程与ADC采样例程写入一个项目,编译成功后;

1,debug模式下只有LED灯闪烁,监视采样结果存储变量无变化(未采样到数据)?

2,几次之后直接进不去DEBUG模式,报错如下:

Error connecting to the target:(Error -1041 @ 0xFFFFFF66)
The emulator reported an error. Confirm emulator configuration and connections, reset the emulator, and retry the operation.
(Emulation package 5.1.450.0)

程序如下:

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

//程序结束

user6102121:

回复 Green Deng:

谢谢,我进入您提供的网站,看到有提示重启 CCS6.0,重启后链接上了

芯片:F28027  仿真器:XDS100V2

我在将LED例程与ADC采样例程写入一个项目,编译成功后;

1,debug模式下只有LED灯闪烁,监视采样结果存储变量无变化(未采样到数据)?

2,几次之后直接进不去DEBUG模式,报错如下:

Error connecting to the target:(Error -1041 @ 0xFFFFFF66)
The emulator reported an error. Confirm emulator configuration and connections, reset the emulator, and retry the operation.
(Emulation package 5.1.450.0)

程序如下:

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

//程序结束

user6102121:

回复 Green Deng:

您好,我在DEBUG模式下监控,可以确定用于LED灯的CPU定时器中断响应并可以进入其对应的中断服务子函数,用于ADC采样的中断只触发了一次,服务子函数进去一次,之后就只有CPU定时器中断响应了,ADC中断不在响应,请问这是什么原因??(是中断优先级的问题吗??)

赞(0)
未经允许不得转载:TI中文支持网 » F28027 LED例程与ADC采样例程融合
分享到: 更多 (0)