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.

TM4C123GH6PM中的ADC和DMA

Other Parts Discussed in Thread: TM4C123GH6PM

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

#include <stdbool.h>
#include <stdint.h>
#include "inc/TM4C123GH6PM.H"
#include "inc/hw_memmap.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/pwm.h"
#include "driverlib/sysctl.h"
#include "driverlib/timer.h"
#include "mydefine.h"
#include "driverlib/adc.h"
#include "driverlib/udma.h"
#include "inc/hw_adc.h"
#include "stdio.h"


#define ADC_DSTBUF_SIZE 256
static unsigned long g_ulAdcBuf[ADC_DSTBUF_SIZE];


static volatile unsigned long g_ulIntCount;


#pragma DATA_ALIGN(sDMAControlTable, 1024)
tDMAControlTable sDMAControlTable[64];

void ADC0_ISR(void)
{
unsigned int a=400;

ADCIntClear(ADC0_BASE, 1);

while (a)a--;

}


void
InitADC0Transfer(void)
{
unsigned int uIdx;

for(uIdx = 0; uIdx < ADC_DSTBUF_SIZE; uIdx++)
{
g_ulAdcBuf[uIdx] = 0;
}

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

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

}
int main(void)
{


SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ);

g_ulIntCount = 0;
InitADC0Transfer();
ADCProcessorTrigger(ADC0_BASE, 1);

while(1)
{
}
}