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.
我程序设计的目的是为了打开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)
{
}
}
求个例程也好。唯一看到的例程就是固件库手册上面写的一个软件触发的。
四个数据访问同一个数组肯定是没问题的。FIFO是一个一个数据出来的。然后按顺序再丢到数组里的。