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.

再开一贴请教DMA和ADC的问题

我程序设计的目的是为了打开ADC0的SS1中四个通道同时采样四个不同的数据。然后用DMA把他们自动移动到一个数组里。每个通道各采集128个数据以后。触发中断。我来处理这些数据。然后程序如下似乎DMA的配置有问题。并不起效果。没找到任何example.

希望工程师能帮个忙。万分感谢。

四个通道是同一个FIFO的。DMA从FIFO往数组里搬运数据。应该不会有什么四个通道同时改变同一个数组的问题。

关键代码如下。

SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);//此处顺序必须不得更改。

// Enable GPIO for ADC
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_3);// Enable pin PE3 for ADC AIN0
GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_2);// Enable pin PE2 for ADC AIN1
GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_1);// Enable pin PE1 for ADC AIN2
GPIOPinTypeADC(GPIO_PORTD_BASE, GPIO_PIN_3);// Enable pin PD3 for ADC AIN4


//ADCSequenceDisable(ADC0_BASE, 1);
//SysCtlADCSpeedSet(SYSCTL_ADCSPEED_250KSPS);
ADCSequenceConfigure(ADC0_BASE, 1, ADC_TRIGGER_ALWAYS, 0);
ADCSequenceStepConfigure(ADC0_BASE, 1, 0, ADC_CTL_CH0);
ADCSequenceStepConfigure(ADC0_BASE, 1, 1, ADC_CTL_CH1| ADC_CTL_IE );
ADCSequenceStepConfigure(ADC0_BASE, 1, 2, ADC_CTL_CH2);
ADCSequenceStepConfigure(ADC0_BASE, 1, 3, ADC_CTL_CH4| ADC_CTL_IE |ADC_CTL_END);
//ADC0_CC_R=0x01;
ADCSequenceEnable(ADC0_BASE, 1);

ADCIntClear(ADC0_BASE, 1);
ADCIntRegister(ADC0_BASE,1,ADC0_ISR);
ADCIntEnable(ADC0_BASE,1);

SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA);
uDMAEnable();
uDMAControlBaseSet(sDMAControlTable);

uDMAChannelAttributeEnable(UDMA_CHANNEL_ADC1 | UDMA_PRI_SELECT,UDMA_ATTR_USEBURST|UDMA_ATTR_REQMASK|UDMA_ATTR_HIGH_PRIORITY);

uDMAChannelControlSet(UDMA_CHANNEL_ADC1 | UDMA_PRI_SELECT, UDMA_SIZE_32 | UDMA_SRC_INC_NONE |UDMA_DST_INC_32 | UDMA_ARB_2);
uDMAChannelTransferSet(UDMA_CHANNEL_ADC1 | UDMA_PRI_SELECT,UDMA_MODE_BASIC,(void *)(ADC0_BASE+ADC_O_SSFIFO0 - ADC_O_SSMUX0+ADC_O_SSMUX1),g_ulAdcBuf, ADC_DSTBUF_SIZE);

//
// Enable the DMA channel
//
uDMAChannelEnable(UDMA_CHANNEL_ADC1);
//uDMAChannelRequest(UDMA_CHANNEL_ADC1);

现在在运行起来以后能进入AD中断。但是没有搬运任何数据。