This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28379D:调试器自动跳转到默认 SR 的非法 ISR 循环。 调试代码以进行 ADC 测试。

Guru**** 2524270 points
Other Parts Discussed in Thread: CONTROLSUITE, C2000WARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1410028/tms320f28379d-debugger-automatically-jumps-to-illegal-isr-loop-of-defaultsr-c-while-debugging-code-for-adc-test

器件型号:TMS320F28379D
Thread 中讨论的其他器件:C2000WARE

工具与软件:

我正在尝试检查 ADC 是否正常工作、为此目的、我使用了 ADCA2和 DACOUTA、并使用 EPWM3来实现 SOC。 我将从 DACOUTA 中获取一个随机数(1000)、并通过将 PIN30连接到 TMS320F28309D LaunchPad 上的 PIN29将其作为 ADCINA2的输入。 现在、一旦我按运行按钮进入调试模式、调试器就会跳转到 F2837xD_DefaultISR.c 文件的非法 ISR 循环。 请获取指南以解决该问题。

#include "F28x_Project.h"

//函数原型
void GPIO_select (void);
void Setup_EPWM (void);
void ConfigureAdc (void);
void SetupADCSoftware (void);
void Initdaca (void);
void InitdacB (void);
void ConfigureADCInterrupts (void);
中断 void adca1_isr (void);

//用于存储 ADC 结果的变量
UINT16 ADCaResult0;
UINT16 ADCaResult1;
UINT16 ADCbResult0;
UINT16 ADCbResult1;

void main (void)

//初始化系统控制
InitSysCtrl();

//禁用中断
颜色;
IER = 0x0000;
IFR = 0x0000;

//将 PIE 控制寄存器初始化为默认状态
InitPieCtrl();

//使用指向默认 ISR 的指针初始化 PIE 矢量表
InitPieVectTable();

//将 ADC 中断映射到 ISR
EALLOW;
PieVectTable。 ADCA1_INT =&ADCA1_ISR;
EDIS;

//初始化外设
GPIO_SELECT();
setup_ePWM ();
ConfigureAdc();
SetupADCSoftware();
Initdaca();
InitdacB();
ConfigureADCInterrupts ();

//启用 PIE 和 CPU 中断
IER |= M_INT1;//启用组1的 CPU 中断(ADCINT)
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;// Enable PIE group 1 interrupt (ADC A)(启用 ADC 组1中断(ADC A))

//启用全局中断和实时中断
EINT;
ERTM;

//主循环
while (1)

//在 ADC ISR 中更新 ADC 结果
}
}

void GPIO_SELECT (void)

EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 1;// GPIO4作为 EPWM3A
GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 1;// GPIO5作为 EPWM3B
EDIS;
}

void Setup_EPWM (void)

EPwm3Regs.TBCTL.bit.CLKDIV = 0;
EPwm3Regs.TBCTL.bit.HSPCLKDIV = 0;
EPwm3Regs.TBCTL.bit.CTRMODE = 2;//向上-向下计数模式
EPwm3Regs.TBPRD = 6944;//设置 PWM 周期
EPwm3Regs.AQCTLA.all = 0x0090;//设置 PWM 操作
EPwm3Regs.CMPA.bit.CMPA = 6944/2;//设置比较值

EPwm3Regs.ETSEL.bit.SOCAEN = 1;// Enable SOCA (ADC 的转换开始)
EPwm3Regs.ETSEL.bit.SOCASEL = 1;// Trigger on TBCTR = 0
EPwm3Regs.ETPS.bit.SOCAPRD = 1;//针对每个事件触发
EPwm3Regs.ETCLR.bit.SOCA = 1;// Clear any pending SOCA events.
}

空 Initdaca (空)

EALLOW;
DacaRegs.DACCTL.bit.DACREFSEL = 1;// Use internal VDAC as reference (使用内部 VDAC 作为基准)
DacaRegs.DACCTL.bit.LOADMODE = 0;// Load on next SYSCLK
DacaRegs.DACOUTEN.bit.DACOUTEN = 1;// Enable DAC output
DacaRegs.DACVALS.bit.DACVALS = 1000;//设置 DAC 输出值
DELAY_US (10);
EDIS;
}

void InitdacB (void)

EALLOW;
DacbRegs.DACCTL.bit.DACREFSEL = 1;
DacbRegs.DACCTL.bit.LOADMODE = 0;
DacbRegs.DACOUTEN.bit.DACOUTEN = 1;
DacbRegs.DACVALS.bit.DACVALS = 1000;
DELAY_US (10);
EDIS;
}

void ConfigureAdc (void)

EALLOW;
CpuSysRegs.PCLKCR13.bit.ADC_A = 1;// Enable ADC_A clock
CpuSysRegs.PCLKCR13.bit.ADC_B = 1;// Enable ADC_B clock

AdcaRegs.ADCCTL2.bit.prescale = 6;// Set ADC clock (设置 ADC 时钟)
AdcSetMode (ADC_ADCA、ADC_Resolution_12bit、ADC_SIGNALMODE_SINGLE);
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;//加电 ADC_A

AdcbRegs.ADCCTL2.bit.prescale = 6;
AdcSetMode (ADC_ADCB、ADC_Resolution_12bit、ADC_SIGNALMODE_SINGLE);
AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;//加电 ADC_B
EDIS;

DELAY_US (1000);//等待 ADC 稳定
}

void SetupADCSoftware (void)

uint16 acqps;

//根据分辨率设置采集窗口
acqps =(ADC_Resolution_12bit == AdcaRegs.ADCCTL2.bit.Resolution)? 14:63;

EALLOW;
//为 ADCA 配置 SOC0和 SOC1
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 2;//从通道2采样
AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps;
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 9;//由 ePWM3 SOCA 触发

AdcaRegs.ADCSOC1CTL.bit.CHSEL = 3;// Sample from channel 3
AdcaRegs.ADCSOC1CTL.bit.ACQPS = acqps;
AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 9;

//为 ADCB 配置 SOC0和 SOC1
AdcbRegs.ADCSOC0CTL.bit.CHSEL = 2;//从通道2采样
AdcbRegs.ADCSOC0CTL.bit.ACQPS = acqps;
AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 9;

AdcbRegs.ADCSOC1CTL.bit.CHSEL = 3;//从通道3采样
AdcbRegs.ADCSOC1CTL.bit.ACQPS = acqps;
AdcbRegs.ADCSOC1CTL.bit.TRIGSEL = 9;
EDIS;
}

void ConfigureADCInterrupts (void)

EALLOW;

//在 ADC 模块中启用 ADC 中断
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;// Enable ADCINT1
AdcaRegs.ADCINTSEL1N2.bit.INT1CONT = 0;// Disable continuous mode
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// EOC0 TRIGGERS ADCINT1

PieCtrlRegs.PIEIER1.bit.INTx1 = 1;// Enable PIE group 1 interrupt for ADC A (为 ADC A 启用 ADC 组1中断)
IER |= M_INT1;//启用组1的 CPU 中断
EDIS;
}

// ADC a interrupt service routine
中断 void adca1_ISR (void)

//从 SOC0和 SOC1中读取 ADC 结果
ADCaResult0 = AdcaResultRegs。 ADCRESULT0;//从 ADCA0读取 ADC 结果
ADCaResult1 = AdcaResultRegs。 ADCRESULT1;//从 ADCA1读取 ADC 结果
ADCbResult0 = AdcbResultRegs。 ADCRESULT0;//从 ADCB0读取 ADC 结果
ADCbResult1 = AdcbResultRegs。 ADCRESULT1;//从 ADCB1读取 ADC 结果

//清除 ADC 中断标志
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

//确认 PIE 中断
PieCtrlRegs.PIEACK.all = PIEACK_Group1;
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    现在、一俟我按下运行按钮进入调试模式、调试器便跳转到 F2837xD_DefaultISR.c 文件的非法 ISR 循环。 请参考指南以解决此问题。

    您能否逐步浏览您的代码以准确找到故障发生的时间?

    谢谢!

    Ben Collier

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我通过在调试期间使用断点进行检查,一旦调用 ConfigurationAdc ()函数,它就会跳转到非法 ISR。 是由硬件问题引起的吗? 我已经尝试过、但我找不到它跳转到非法 ISR 循环的确切原因。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您是否尝试过步入该函数、以查看是否有特定行导致非法 ISR?  

    谢谢!

    Ben Collier

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    实际上、一旦调用函数、调试器就会跳转到非法 ISR。 因此、我无法逐步进入该函数来检查导致问题的函数的哪一行。 如果可能、您能检查一下吗?

    我还尝试了控制套件 ADC_SoC_EPWM 提供的示例代码、它显然面临相同的问题。

    谢谢!

    Krunal Shah

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我还尝试了 controlsuite ADC_SoC_ePWM 中提供的示例代码。它同样面临同样的问题。

    您能否尝试 C2000WARE 或 C2000 Academy 中的示例?  

    谢谢!

    Ben Collier

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    是的、我也尝试了 C2000WARE 的示例、但仍然存在同样的问题。 您能不能看一下、为什么即使使用示例代码也会出现问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我不在办公室,直到9月19日,我将尝试尽快回到你回来。

    谢谢!

    Ben Collier

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您是否检查过非法 ISR 问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    那么、您加载到器件的任何代码都会导致非法 ISR?

    您是否还有可以尝试的其他电路板? 您是否还可以尝试通过调整 PLL 设置来降低 SYSCLK 速度?

    谢谢!

    Ben Collier

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我已经尝试过正弦 PWM 和空间矢量 PWM 等 PWM 代码、现在运转良好。

    我也尝试在其他电路板上使用相同代码、但问题仍然存在。 一旦 ADC 到达代码、就会出现非法 ISR 的问题。  

    我将通过降低 SYSCLK 速度进行检查。 我们很快就会与您联系。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    此外、您是否可以尝试使用[C2000WARE]/driverlib/[device]/examples/中的 driverlib 示例  ?  

    我不确定您是使用的是 driverlib 还是 bitfield 示例、因为在上面看来您使用的是 bitfield。  

    谢谢!

    Ben Collier