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.
#include "adc.h"
uint16_t adc_buff[FFT_LENGTH_ADC];//存放ADC采集的数据
volatile bool AdcConvEnd;//用来检测ADC是否采集完毕 0:没有采集完毕 1:采集完毕,在stm32f1xx_it里的DMA完成中断进行修改
uint16_t adc1_buff[FFT_LENGTH_ADC];
volatile bool AdcConvEnd1;
/* The control table used by the uDMA controller. This table must be aligned
* to a 1024 byte boundary. */
#if defined(__ICCARM__)
#pragma data_alignment=1024
uint8_t pui8ControlTable[1024];
#elif defined(__TI_ARM__)
#pragma DATA_ALIGN(pui8ControlTable, 1024)
uint8_t pui8ControlTable[1024];
#else
uint8_t pui8ControlTable[1024] __attribute__ ((aligned(1024)));
#endif
void adc0_init()
{
//GPIO
/* 使能GPIOE的时钟并等待其使能完成 */
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
while(!(MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOE)))
{
}
/* 设置PE3作为AD的输入IO */
MAP_GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_0);
//ADC
/* 使能ADC0的时钟并等待其使能完毕 */
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
while(!(MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_ADC0)))
{
}
/* 使能ADC0采样序列2通道3 */
MAP_ADCSequenceStepConfigure(ADC0_BASE, 2, 0, ADC_CTL_CH0 | ADC_CTL_IE |
ADC_CTL_END);
/* 使能ADC0为定时器触发,当定时器触发后进行单次采样 */
MAP_ADCSequenceConfigure(ADC0_BASE, 2, ADC_TRIGGER_TIMER, 2);
/* 在使能之前清除中断状态标志位,这一步是为了确保中断标志位在我们采样时是保持清除状态 */
MAP_ADCIntClearEx(ADC0_BASE, ADC_INT_DMA_SS2);
MAP_ADCIntEnableEx(ADC0_BASE, ADC_INT_DMA_SS2);
/* 使能ADC0采样序列2的DMA请求 */
MAP_ADCSequenceDMAEnable(ADC0_BASE, 2);
/* ADC0采样序列2的配置已经完成,现在进行使能 */
MAP_ADCSequenceEnable(ADC0_BASE, 2);
/* 使能ADC0采样序列2的中断 */
MAP_IntEnable(INT_ADC0SS2);
//DMA
/* 使能DMA并为其配置通道 */
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA);
while(!(SysCtlPeripheralReady(SYSCTL_PERIPH_UDMA)))
{
}
MAP_uDMAEnable();
/* 指向控制表,用于通道控制结构 */
MAP_uDMAControlBaseSet(pui8ControlTable);
/* 映射ADC0通道2到DMA上 */
MAP_uDMAChannelAssign(UDMA_CH16_ADC0_2);
/* 配置DMA属性为已知状态,默认情况下为失能 */
MAP_uDMAChannelAttributeDisable(UDMA_CH16_ADC0_2,
UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST |
UDMA_ATTR_HIGH_PRIORITY |
UDMA_ATTR_REQMASK);
/* 为ADC0采样序列2的优先级控制结构体设置控制参数,优先级控制结构体是用来从ADC0采样序列2的
FIFO中复制数据到数组srcBuffer,这个传输数据大小为16位,源地址不增加,目的地址16位步进 */
MAP_uDMAChannelControlSet(UDMA_CH16_ADC0_2 | UDMA_PRI_SELECT,
UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 |
UDMA_ARB_4);
/* 为ADC0采样序列2设置优先级控制结构体,模式为BASIC */
MAP_uDMAChannelTransferSet(UDMA_CH16_ADC0_2 | UDMA_PRI_SELECT,
UDMA_MODE_BASIC,
(void *)&ADC0->SSFIFO2, (void *)&adc_buff,
sizeof(adc_buff)/2);
/* ADC0采样序列2的uDMA已经准备就绪,当通道使能后,定时器触发ADC采样,ADC完成采样之后发送
一个DMA请求,之后数据传输就会开始 */
// MAP_uDMAChannelEnable(UDMA_CH16_ADC0_2);
}
void adc1_init()
{
//GPIO
/* 使能GPIOE的时钟并等待其使能完成 */
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
while(!(MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOE)))
{
}
/* 设置PE2作为AD的输入IO */
MAP_GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_3);
//ADC
/* 使能ADC0的时钟并等待其使能完毕 */
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC1);
while(!(MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_ADC1)))
{
}
//ADCClockConfigSet(ADC1_BASE, ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_FULL, 5);
/* 使能ADC1采样序列3通道 */
MAP_ADCSequenceStepConfigure(ADC1_BASE, 3, 0, ADC_CTL_CH0 | ADC_CTL_IE |
ADC_CTL_END);
/* 使能ADC1为定时器触发,当定时器触发后进行单次采样 */
MAP_ADCSequenceConfigure(ADC1_BASE, 3, ADC_TRIGGER_TIMER, 3);
/* 在使能之前清除中断状态标志位,这一步是为了确保中断标志位在我们采样时是保持清除状态 */
MAP_ADCIntClearEx(ADC1_BASE, ADC_INT_DMA_SS3);
MAP_ADCIntEnableEx(ADC1_BASE, ADC_INT_DMA_SS3);
/* 使能ADC1采样序列3的DMA请求 */
MAP_ADCSequenceDMAEnable(ADC1_BASE, 3);
/* ADC1采样序列3的配置已经完成,现在进行使能 */
MAP_ADCSequenceEnable(ADC1_BASE, 3);
/* 使能ADC1采样序列3的中断 */
MAP_IntEnable(INT_ADC1SS3);
//DMA
/* 使能DMA并为其配置通道 */
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA);
while(!(SysCtlPeripheralReady(SYSCTL_PERIPH_UDMA)))
{
}
MAP_uDMAEnable();
/* 指向控制表,用于通道控制结构 */
MAP_uDMAControlBaseSet(pui8ControlTable);
/* 映射ADC1通道3到DMA上 */
MAP_uDMAChannelAssign(UDMA_CH27_ADC1_3);
/* 配置DMA属性为已知状态,默认情况下为失能 */
MAP_uDMAChannelAttributeDisable(UDMA_CH27_ADC1_3,
UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST |
UDMA_ATTR_HIGH_PRIORITY |
UDMA_ATTR_REQMASK);
/* 为ADC1采样序列2的优先级控制结构体设置控制参数,优先级控制结构体是用来从ADC0采样序列2的
FIFO中复制数据到数组srcBuffer,这个传输数据大小为16位,源地址不增加,目的地址16位步进 */
MAP_uDMAChannelControlSet(UDMA_CH27_ADC1_3 | UDMA_PRI_SELECT,
UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 |
UDMA_ARB_4);
/* 为ADC1采样序列2设置优先级控制结构体,模式为BASIC */
MAP_uDMAChannelTransferSet(UDMA_CH27_ADC1_3 | UDMA_PRI_SELECT,
UDMA_MODE_BASIC,
(void *)&ADC1->SSFIFO3, (void *)&adc1_buff,
sizeof(adc1_buff)/2);
/* ADC0采样序列2的uDMA已经准备就绪,当通道使能后,定时器触发ADC采样,ADC完成采样之后发送
一个DMA请求,之后数据传输就会开始 */
// MAP_uDMAChannelEnable(UDMA_CH16_ADC0_2);
}
As you can see, I'm trying to configure ADC0 and ADC1 to downsample from the same clock source, but I can't. Please how can I configure it correctly
Here is an example CCS project for ADC with uDMA. Please reference this project for TM4C129 which is the same silicon as MSP432E. I will suggest you first try to get each ADC work with the uDMA separately. Once you get each working then you can combine both ADCs and uDMA together. It is easier to debug by starting with a simpler setup and then build a more complex setup.