用dma的方式獲取adc的值,adc1,11個通道,取到的值相互干擾怎么解決,代碼下面這樣
int? length=11;
u16 ADC_ConvertedValue[11]={0,0,0,0,0,0,0,0,0,0,0};
//ADC對應(yīng)GPIO初始化配置以及ADC初始化配置
void adc_Init(void)
{
? ? GPIO_InitTypeDef GPIO_InitStructure;
? ? ADC_InitTypeDef ADC_InitStructure;
? ? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC |RCC_APB2Periph_ADC1 , ENABLE ); //使能GPIO時鐘和ADC
? ? RCC_ADCCLKConfig(RCC_PCLK2_Div6); //設(shè)置ADC時鐘分頻為6分頻
? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //GPIO模式為模擬輸入
? ? GPIO_Init(GPIOA, &GPIO_InitStructure);
? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
? ? GPIO_Init(GPIOB, &GPIO_InitStructure);
? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
? ? GPIO_Init(GPIOC, &GPIO_InitStructure);
? ? ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;? //配置ADC為獨(dú)立模式
? ? ADC_InitStructure.ADC_ScanConvMode = ENABLE;? ? ? ? //多通道模式下開啟掃描模式
? ? ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;? //設(shè)置開啟連續(xù)轉(zhuǎn)換模式
? ? ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //設(shè)置轉(zhuǎn)換不是由外部觸發(fā)啟動,軟件觸發(fā)啟動
? ? ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //設(shè)置ADC數(shù)據(jù)右對齊
? ? ADC_InitStructure.ADC_NbrOfChannel = length;? ? ? ? ? ?//規(guī)則轉(zhuǎn)換的ADC通道的數(shù)目
? ? ADC_Init(ADC1, &ADC_InitStructure);? ? ? ? ? ? ? ? ? ? //根據(jù)ADC_InitStructure中指定的參數(shù)初始化ADC1寄存器
? ? ADC_Cmd(ADC1, ENABLE);? ? ? //使能ADC1
? ? ADC_ResetCalibration(ADC1); //重置ADC1校準(zhǔn)寄存器。
? ? while(ADC_GetResetCalibrationStatus(ADC1)); //等待復(fù)位校準(zhǔn)結(jié)束
? ? ADC_StartCalibration(ADC1); //開啟AD校準(zhǔn)
? ? while(ADC_GetCalibrationStatus(ADC1));? ? ? //等待校準(zhǔn)結(jié)束
}
//ADC DMA模式配置
void DMA_Tx_Init( void )
{
? ? DMA_InitTypeDef DMA_InitStructure;
? ? RCC_AHBPeriphClockCmd( RCC_AHBPeriph_DMA1, ENABLE ); //使能開啟DMA時鐘
? ? DMA_DeInit(DMA1_Channel1); //復(fù)位DMA控制器
? ? DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->RDATAR;? //配置外設(shè)地址為ADC數(shù)據(jù)寄存器地址
? ? DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_ConvertedValue; //配置存儲器地址為讀取ADC值地址
? ? DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;? ? ? ? ? ? ? //配置數(shù)據(jù)源為外設(shè),即DMA傳輸方式為外設(shè)到存儲器
? ? DMA_InitStructure.DMA_BufferSize = length;? ? ? ? ? ? ? ? ? ? ? //設(shè)置DMA數(shù)據(jù)緩沖區(qū)大小,此處設(shè)置為length
? ? DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//設(shè)置DMA外設(shè)遞增模式關(guān)閉
? ? DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;? ? ? ? ?//設(shè)置DMA存儲器遞增模式開啟
? ? DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //設(shè)置外設(shè)數(shù)據(jù)大小為半字,即兩個字節(jié)
? ? DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;? ? ? ? ?//設(shè)置存儲器數(shù)據(jù)大小為半字,即兩個字節(jié)
? ? DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;? ? ?//設(shè)置DMA模式為循環(huán)傳輸模式
? ? DMA_InitStructure.DMA_Priority = DMA_Priority_High; //設(shè)置DMA傳輸通道優(yōu)先級為高,當(dāng)使用一 DMA通道時,優(yōu)先級設(shè)置不影響
? ? DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;? ? ? ? //因?yàn)榇薉MA傳輸方式為外設(shè)到存儲器,因此禁用存儲器到存儲器傳輸方式
? ? DMA_Init( DMA1_Channel1, &DMA_InitStructure );? ? ? //初始化DMA
? ? DMA_Cmd(DMA1_Channel1 , ENABLE);? //使能DMA
}
void ADC_DMA_CONF(void)
{
? ? adc_Init();
? ? DMA_Tx_Init();
? ? /// PA0->ADC0
? ? /// PA1->ADC1
? ? /// PA2->ADC2
? ? /// PA3->ADC3
? ? /// PA4->ADC4
? ? /// PA5->ADC5
? ? /// PA6->ADC6
? ? /// PA7->ADC7
? ? /// PB0->ADC8
? ? /// PB1->ADC9
? ? /// PC0->ADC10
? ? /// PC1->ADC11
? ? /// PC2->ADC12
? ? /// PC3->ADC13
? ? // 配置 ADC 通道轉(zhuǎn)換順序?yàn)?,第一個轉(zhuǎn)換,采樣時間為55.5個時鐘周期
? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5);
? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5);
? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_55Cycles5);
? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 5, ADC_SampleTime_55Cycles5);
? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 6, ADC_SampleTime_55Cycles5);
? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 7, ADC_SampleTime_55Cycles5);
? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 8, ADC_SampleTime_55Cycles5);
? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 9, ADC_SampleTime_55Cycles5);
? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 10, ADC_SampleTime_55Cycles5);
? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 11, ADC_SampleTime_55Cycles5);
? ? // 使能ADC DMA 請求
? ? ADC_DMACmd(ADC1, ENABLE);
? ? // 由于沒有采用外部觸發(fā),所以使用軟件觸發(fā)ADC轉(zhuǎn)換
? ? ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}