cancel
Showing results for 
Search instead for 
Did you mean: 

Question about Multi Channel ADC read with DMA

to_sam_kim
Associate II
Posted on April 27, 2015 at 18:57

Hello,

I'm working on multi channel ADC reading with DMA. But I'm not clear how coverted ADC data of each channel transfer to the assigned memory location. 

I used STcubeMX to set two input channels of ADC1 with DMA request.

However, my setting read only one channel.

I attaced my code below. Please take a look and help me if anyone knows what is the problem.

Thank you in advance.

/* I used these three HAL_API func. in main func. to initialize and start adc with DMA */

 

HAL_ADC_MspInit(&hadc1);

HAL_ADC_Init(&hadc1);

HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&adc1Buf[0],2);

/* ADC1 init function: I enabled scan mode, continuouse mode and DMA request.

 

   Also,  I configured each channel's rank and sample time*/

 

void MX_ADC1_Init(void)

{

  ADC_ChannelConfTypeDef sConfig;

    /**Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)

    */

  hadc1.Instance = ADC1;

  hadc1.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV6;

  hadc1.Init.Resolution = ADC_RESOLUTION12b;

  hadc1.Init.ScanConvMode = ENABLE;

  hadc1.Init.ContinuousConvMode = ENABLE;

  hadc1.Init.DiscontinuousConvMode = DISABLE;

  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;

  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;

  hadc1.Init.NbrOfConversion = 2;

  hadc1.Init.DMAContinuousRequests = ENABLE;

  hadc1.Init.EOCSelection = EOC_SINGLE_CONV;

  HAL_ADC_Init(&hadc1);

    /**Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.

    */

  sConfig.Channel = ADC_CHANNEL_5;

  sConfig.Rank = 1;

  sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;

  HAL_ADC_ConfigChannel(&hadc1, &sConfig);

    /**Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.

    */

  sConfig.Channel = ADC_CHANNEL_13;

  sConfig.Rank = 2;

  HAL_ADC_ConfigChannel(&hadc1, &sConfig);

}

/*Below code is setting GPIO and DMA */ 

 

/* Peripheral clock enable */

HAL_ADC_MspInit()

{

    __ADC1_CLK_ENABLE();

 

    /**ADC1 GPIO Configuration   

    PC3     ------> ADC1_IN13

    PA5     ------> ADC1_IN5

    */

    GPIO_InitStruct.Pin = GPIO_PIN_3;

    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;

    GPIO_InitStruct.Pull = GPIO_NOPULL;

    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_5;

    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;

    GPIO_InitStruct.Pull = GPIO_NOPULL;

    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* Peripheral DMA init*/

 

    hdma_adc1.Instance = DMA2_Stream0;

    hdma_adc1.Init.Channel = DMA_CHANNEL_0;

    hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;

    hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;

    hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;

    hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;

    hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;

    hdma_adc1.Init.Mode = DMA_CIRCULAR; //DMA_NORMAL;

    hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;

    hdma_adc1.Init.FIFOMode = DMA_FIFOMODE_DISABLE;

    HAL_DMA_Init(&hdma_adc1);

    __HAL_LINKDMA(hadc,DMA_Handle,hdma_adc1);

}

#adc #stm32f4
1 REPLY 1
to_sam_kim
Associate II
Posted on April 27, 2015 at 19:39

Hi,

I found my problem. Actually, I couldn't understand how adc data transfered to the assigned memory. 

 I figured out, each adc channel's halfword data goes to upper and lower 16bit of my uint32_t adc data buffer.