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