#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