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.

we dont need to firmware by ourselves, lets talk
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.