我现在想要采集ADCINA0-ADCINA7的输入电压,通过DMA传输,一直连续不断采集,我的配置代码如下
https://e2echina.ti.com/question_answer/microcontrollers/c2000/f/56/p/192910/595361#595361此帖中,Green Deng:并未解决我的问题,因为我就是按照例程配置修改的
EALLOW;
SysCtrlRegs.HISPCP.all = ADC_MODCLK; // 150 / (2*3) = 25M
EDIS;
InitAdc();
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; // Sequential mode: Sample rate = 1/[(2+ACQ_PS)*ADC clock in ns]
// = 1/(2*40ns) =12.5MHz (for 150 MHz SYSCLKOUT)
AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS; // ADC module clock = HSPCLK/1 = 25.5MHz/(1) = 25.0 MHz
AdcRegs.ADCTRL1.bit.CPS = 0;
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; // 级联操作模式
AdcRegs.ADCTRL1.bit.CONT_RUN = 1; // 连续模式
AdcRegs.ADCTRL3.bit.SMODE_SEL = 0; // 顺序采样
AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1; // Enable Sequencer override feature
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 7; // 8个转换通道
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0x1; // 中断启用
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 0x1;
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 7; // 8个转换通道
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; //ADCINA0
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1; //ADCINA1
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2;
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x3;
AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x4;
AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x5;
AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x6;
AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x7;
dmadest = dma_adcbuf;
dmasource = &AdcMirror.ADCRESULT0; //Point DMA source to ADC result register base
DMACH1AddrConfig(dmadest, dmasource);
DMACH1BurstConfig(7, 1, 10);
DMACH1TransferConfig(9, 1, 1);
DMACH1WrapConfig(1, 0, 80, 0);
DMACH1ModeConfig(DMA_SEQ1INT, PERINT_ENABLE,ONESHOT_DISABLE, CONT_DISABLE,SYNC_DISABLE, SYNC_SRC,OVRFLOW_DISABLE, SIXTEEN_BIT,CHINT_END, CHINT_ENABLE);
StartDMACH1();
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 0x1;
并配置了相应的中断函数,但是我发现,传输完成进入到中断函数之后,貌似不会再继续采集转换了,并且发现每次采集到的值并不是那么准确,请问是我的配置有问题吗
Green Deng:
你说的
Tony Liu4传输完成进入到中断函数之后,貌似不会再继续采集转换了
是不是指运行完一次之后程序就一直在这个语句中循环?
__asm ("ESTOP0");for(;;);这个的话例程中就是这么设计的,你的运行结果应该是跟例程一致的。
至于 采样结果不准确,你得描述一下具体怎么个不准确?或者是否跟你的输入信号有关?
Tony Liu4:
回复 Green Deng:
当然,在中断里面我肯定没有写for(;;);这种操作,中断里面我做了取平均值的操作,然后出中断之后,就进不来中断了,而且,您可以看一下我的代码吗,我使能了连续转换
Green Deng:
回复 Tony Liu4:
例程中对这两行代码有解释:
// Next two lines for debug only to halt the processor here// Remove after inserting ISR Code这两行代码只是为了调试,你可以注释/删除这两行代码,然后添加你想要的代码。
“ESTOP0”是一个软件断点指令,它将在代码执行时停止处理器。它们仅用于调试。
Tony Liu4:
回复 Green Deng:
您是否能看一下我的回答再做回答,我在中断里面,没有写停止这两句,我都改掉了,改成我对AD值的操作,然后出了中断之后,不会再次进入中断,而不是在中断里面停止这种状态
Green Deng:
回复 Tony Liu4:
你可以试一下通过在RUNSTS位中写入“ 1”来重新启用ISR中的DMA
DMACH1ModeConfig(DMA_SEQ1INT,PERINT_ENABLE,ONESHOT_DISABLE,CONT_ENABLE,SYNC_DISABLE,SYNC_SRC,OVRFLOW_DISABLE,SIXTEEN_BIT,CHINT_END,CHINT_ENABLE);