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

再次提出DMA_ADC的问题

我将ADC_DMA例程修改修改如下

InitAdc();

AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;

AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;
AdcRegs.ADCTRL1.bit.SEQ_CASC = 0; // 0 Non-Cascaded Mode
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0x1;
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 0x1;
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1;
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2;
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x3;
AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x0;
AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x1;
AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x2;
AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x3;
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 3; 

DMAInitialize();

DMADest = &DMABuf1[0]; //Point DMA destination to the beginning of the array
DMASource = &AdcMirror.ADCRESULT0; //Point DMA source to ADC result register base
DMACH1AddrConfig(DMADest,DMASource);
DMACH1BurstConfig(3,1,10);
DMACH1TransferConfig(9,1,0);
DMACH1WrapConfig(1,0,0,1);
DMACH1ModeConfig(DMA_SEQ1INT,PERINT_ENABLE,ONESHOT_DISABLE,CONT_DISABLE,SYNC_DISABLE,SYNC_SRC,
OVRFLOW_DISABLE,SIXTEEN_BIT,CHINT_END,CHINT_ENABLE);

StartDMACH1();

// Start SEQ1
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 0x1;

while(1)
{
for(i=0;i<10;i++)
{
for(j=0;j<1000;j++){}
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1; //Normally ADC will be tied to ePWM, or timed routine
}
}

中断代码如下

__interrupt void local_DINTCH1_ISR(void) // DMA Channel 1
{
PieCtrlRegs.PIEACK.all = PIEACK_GROUP7;

}
中断中我并未将程序停下,但是只会进入一次中断,之后就不会进入了,这是为什么,需要重新配置DMA或者ADC吗

Susan Yang:

请问您使用的是哪款芯片和哪个例程?C200ware下的?

单从您的代码看,没有什么问题。另外可以参考下类似问题

e2e.ti.com/…/683810

Tony Liu4:

回复 Susan Yang:

我自己发现的解决方法是,在进入一次中断之后,在中断中,需要再次执行StartDMACH1();语句,开启DMA传输,这样后续才会继续进入DMA中断,请问解决方法是这样的吗

Susan Yang:

回复 Tony Liu4:

很抱歉,之前漏掉了您的回复

一般芯片都是有ADC DMA例程的,如C2000Ware_3_02_00_00\device_support\f2837xd\examples\cpu1\adc_soc_continuous_dma\cpu01

Tony Liu4:

回复 Susan Yang:

例程我参考过得,我现在需要的就是进入中断之后需要再次启动DMA的传输

赞(0)
未经允许不得转载:TI中文支持网 » 再次提出DMA_ADC的问题
分享到: 更多 (0)