cancel
Showing results for 
Search instead for 
Did you mean: 

stm32f407 dual ADC Simultaneous sampling issue

xu2
Associate II
dual adc input gpio is pc4(ADC1 input)、pc5(ADC2 input).
ADC1 gpio pc4 input sine wave,ADC2 gpio pc5 input is floating.
when dma mode use ADC_DMAAccessMode_2,ADC2 last sample data is also sine wave,why?
when change dma mode is ADC_DMAAccessMode_1,ADC2 result data is correct.
my code below,pls help with me,thanks.
 
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
 
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
 
  TIM_TimeBaseInitStructure.TIM_Period = arr;
TIM_TimeBaseInitStructure.TIM_Prescaler=psc;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; 
 
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
 
//TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
TIM_SelectOutputTrigger(TIM3,TIM_TRGOSource_Update);
TIM_ARRPreloadConfig(TIM3,ENABLE);
TIM_Cmd(TIM3,ENABLE);
}
 
void dual_adc_gpio_init()
{
GPIO_InitTypeDef GPIO_InitStructure;
 
RCC_AHB1PeriphClockCmd(RHEOSTAT_ADC_GPIO_CLK1, ENABLE);
RCC_AHB1PeriphClockCmd(RHEOSTAT_ADC_GPIO_CLK2, ENABLE);
 
GPIO_InitStructure.GPIO_Pin = RHEOSTAT_ADC_GPIO_PIN1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;     
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(RHEOSTAT_ADC_GPIO_PORT1, &GPIO_InitStructure);
 
GPIO_InitStructure.GPIO_Pin = RHEOSTAT_ADC_GPIO_PIN2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;     
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(RHEOSTAT_ADC_GPIO_PORT2, &GPIO_InitStructure);
}
 
void dual_adc_init()
{
DMA_InitTypeDef DMA_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
NVIC_InitTypeDef NVIC_InitStruct;
 
  RCC_AHB1PeriphClockCmd(RHEOSTAT_ADC_DMA_CLK, ENABLE); 
  RCC_APB2PeriphClockCmd(RHEOSTAT_ADC1_CLK , ENABLE);
  RCC_APB2PeriphClockCmd(RHEOSTAT_ADC2_CLK , ENABLE);
 
#if 1
NVIC_SetPriorityGrouping(2);
  
//DMA_ITConfig( DMA2_Stream0 , DMA_IT_TC , ENABLE);
  
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannel=DMA2_Stream0_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;
NVIC_Init(&NVIC_InitStruct);
#endif
 
  DMA_InitStructure.DMA_PeripheralBaseAddr = RHEOSTAT_ADC_CDR_ADDR;
  DMA_InitStructure.DMA_Memory0BaseAddr = (u32)g_adc_dma_buf1;
  DMA_InitStructure.DMA_Memory1BaseAddr = (u32)g_adc_dma_buf2;
//  DMA_InitStructure.DMA_Memory1BaseAddr = (u32)g_adc_dma_buf2;
 
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
  DMA_InitStructure.DMA_BufferSize = 2;//SAMPLE_BUFFER_LEN;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord;
 
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular | DMA_SxCR_DBM;
 
  //DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;  
  DMA_InitStructure.DMA_Channel = RHEOSTAT_ADC_DMA_CHANNEL;
  DMA_Init(RHEOSTAT_ADC_DMA_STREAM, &DMA_InitStructure);
  DMA_ITConfig( DMA2_Stream0 , DMA_IT_TC , ENABLE);
  DMA_Cmd(RHEOSTAT_ADC_DMA_STREAM, ENABLE);
 
  ADC_CommonInitStructure.ADC_Mode = ADC_DualMode_RegSimult;
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_2;
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
  
  ADC_CommonInit(&ADC_CommonInitStructure);
 
ADC_StructInit(&ADC_InitStructure);
  
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  
  //ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  //ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T3_TRGO;
  
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfConversion = 1;
 
  //---------------------------------------------------------------------------
  ADC_Init(RHEOSTAT_ADC1, &ADC_InitStructure);
  ADC_RegularChannelConfig(RHEOSTAT_ADC1, RHEOSTAT_ADC_CHANNEL1, 1, ADC_SampleTime_3Cycles);
  //---------------------------------------------------------------------------
 
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
 
  ADC_Init(RHEOSTAT_ADC2, &ADC_InitStructure);
  ADC_RegularChannelConfig(RHEOSTAT_ADC2, RHEOSTAT_ADC_CHANNEL2, 1, ADC_SampleTime_3Cycles);
  //---------------------------------------------------------------------------
 
 
  ADC_MultiModeDMARequestAfterLastTransferCmd(ENABLE);
 
  ADC_DMACmd(RHEOSTAT_ADC1, ENABLE);
  
  ADC_Cmd(RHEOSTAT_ADC1, ENABLE);
  ADC_Cmd(RHEOSTAT_ADC2, ENABLE);   
  
  ADC_SoftwareStartConv(RHEOSTAT_ADC1);
  //ADC_SoftwareStartConv(RHEOSTAT_ADC2);
}
 
int main()
{
gpio_output_init();
Rheostat_Init();
//TIM3_Int_Init(2,42-1);
TIM3_Int_Init(2,42-1);
}

 

3 REPLIES 3
AScha.3
Chief III

1. > ADC2 gpio pc5 input is floating < floating can give any result; so put some "clear" level there, -> gnd.

2. > ADC_DMAAccessMode_1,ADC2 result data is correct < so use mode_1 , then ok ?

If you feel a post has answered your question, please click "Accept as Solution".

1、when ADC2 gpio pc5 input is sine wave or low level(ADC2 is low level), ADC1 and ADC2 sample data always is 0. 

when ADC1 gpio pc4 input is sine wave, ADC1 and ADC2 sample data is same(sine wave). 

2、use mode_1 is ok.parameter ADC_DMAAccessMode set ADC_DMAAccessMode_1,

ADC1 input sine wave,sample result data is sine wave;ADC2 input is 0,sample result is 0.

ADC2 input sine wave,sample result data is sine wave;ADC1 input is 0,sample result is 0.

attachment is my code.