cancel
Showing results for 
Search instead for 
Did you mean: 

Multiple adc conversions using DMA (help please)

hpark.21
Associate

1.volatile uint16_t ADC_Value[4];

-this is my array for the values to be stored

2.void ADC1_Configure(void) 

{

  ADC_InitTypeDef ADC_InitStructure;

   

  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

  ADC_InitStructure.ADC_ScanConvMode = ENABLE;

  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

  ADC_InitStructure.ADC_NbrOfChannel = 4;

  ADC_Init(ADC1, &ADC_InitStructure);

   

  ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_55Cycles5);

  ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 2, ADC_SampleTime_55Cycles5);

  ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 3, ADC_SampleTime_55Cycles5);

  ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 4, ADC_SampleTime_55Cycles5);

   

  //ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);

  ADC_DMACmd(ADC1, ENABLE);

  ADC_Cmd(ADC1, ENABLE);

   

  ADC_ResetCalibration(ADC1);

   

  while(ADC_GetResetCalibrationStatus(ADC1));

   

  ADC_StartCalibration(ADC1);

   

  while(ADC_GetCalibrationStatus(ADC1));

   

  ADC_SoftwareStartConvCmd(ADC1, ENABLE);

}

-and here i want to get 4 inputs of adc, so i made 4 config lines for the 4 adc channels

3.void DMA_Configure(void) 

{

  DMA_InitTypeDef DMA_InitStructure;

   

  DMA_DeInit(DMA1_Channel1);

  DMA_StructInit(&DMA_InitStructure);

  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR;

  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_Value;

  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

  DMA_InitStructure.DMA_BufferSize = 2;

  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;

  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;

  DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Word;

  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

  DMA_InitStructure.DMA_Priority = DMA_Priority_High;

  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

    

  DMA_Init(DMA1_Channel1, &DMA_InitStructure);

  DMA_Cmd(DMA1_Channel1, ENABLE);

}

-and this is my dma configuration code

when i show my results of the array on the lcd the lcd keeps giving weird results for ADC_Value[0] and ADC_Value[1] but 0 for ADC_Value[2] and ADC_Value[3] ....

what could be possibly wrong?

2 REPLIES 2
Javier1
Principal

Is DMA initialiced before the ADC? it should be

It is a known CUBEMX issue.

0693W00000WLWYZQA5.png 

Also check the buffer sizes you configured, they might not match with your real buffer.

Available for consulting/freelancing , hit me up in https://github.com/javiBajoCero
Piranha
Chief II
DMA_InitStructure.DMA_BufferSize = 2;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Word;

All of these are wrong.