This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

STM32F746-Multi channel ADC with DMA Problem

Hello,
I am trying to implement multi-channel adc with dma. I am using STM32F746 Discovery Board.
But seems not working.
Here is my initialization functions :

First, here is my buffer that fills with ADC Channels data.

// TOTAL_TRANSFER_WORDS is defined as ((ADC_CHANNEL_COUNT) * (MOVING_AVERAGE_WINDOW_SIZE))
// and ADC_CHANNEL_COUNT defined as 5, als MOVING_AVERAGE_WINDOW_SIZE defined as 10.
uint16_t volatile total_adc_readings[TOTAL_TRANSFER_WORDS] = { 0x00 };
static void adc_initialization(void)
{
        ADC_HandleTypeDef adc_handle;
        ADC_ChannelConfTypeDef sConfig;

// USED_ADC is actually ADC3
        adc_handle.Instance = USED_ADC;
        adc_handle.Init.Resolution = ADC_RESOLUTION_12B;
        adc_handle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV8;
        adc_handle.Init.ScanConvMode = ADC_SCAN_ENABLE;
        adc_handle.Init.ContinuousConvMode = ENABLE;
        adc_handle.Init.DiscontinuousConvMode = DISABLE;
        adc_handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
        adc_handle.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1;
        adc_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
        adc_handle.Init.DMAContinuousRequests = ENABLE;
        adc_handle.Init.NbrOfDiscConversion = 0;
        adc_handle.Init.NbrOfConversion = ADC_CHANNEL_COUNT;

        if ( HAL_ADC_Init(&adc_handle) != HAL_OK )
        {
                while ( 1 )
                {
                        /* ADC INITIALIZATION FAILED */
                }
        }

        // Common channel configurations
        sConfig.Offset = 0;
        sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES;

        // channel 0 configurations
        sConfig.Rank = 1;
// SYSTEM_SUPPLY_CHANNEL is actually ADC_CHANNEL_4
        sConfig.Channel = SYSTEM_SUPPLY_CHANNEL;
        if ( HAL_ADC_ConfigChannel(&adc_handle, &sConfig) != HAL_OK )
        {
                while ( 1 )
                {
                        /* ADC INITIALIZATION FAILED */
                }
        }


        // channel 1 configurations
        sConfig.Rank = 2;
// EXT_BAT_SUPPLY_CHANNEL is actually ADC_CHANNEL_5
        sConfig.Channel = EXT_BAT_SUPPLY_CHANNEL;
        if ( HAL_ADC_ConfigChannel(&adc_handle, &sConfig) != HAL_OK )
        {
                while ( 1 )
                {
                        /* ADC INITIALIZATION FAILED */
                }
        }


        // channel 2 configurations
        sConfig.Rank = 3;
// MAIN_BAT_SUPPLY_CHANNEL is actually ADC_CHANNEL_6
        sConfig.Channel = MAIN_BAT_SUPPLY_CHANNEL;
        if ( HAL_ADC_ConfigChannel(&adc_handle, &sConfig) != HAL_OK )
        {
                while ( 1 )
                {
                        /* ADC INITIALIZATION FAILED */
                }
        }


        // channel 3 configurations
        sConfig.Rank = 4;
// this is used for internal temperature sensor.
        sConfig.Channel = ADC_CHANNEL_13;
        if ( HAL_ADC_ConfigChannel(&adc_handle, &sConfig) )
        {
                while ( 1 )
                {
                        /* ADC INITIALIZATION FAILED */
                }
        }

        // channel 18 configurations
        sConfig.Rank = 5;
// RC_BAT_SUPPLY_CHANNEL is actually ADC_CHANNEL_7
        sConfig.Channel = RC_BAT_SUPPLY_CHANNEL;
        if ( HAL_ADC_ConfigChannel(&adc_handle, &sConfig) != HAL_OK )
        {
                while ( 1 )
                {
                        /* ADC INITIALIZATION FAILED */
                }
        }

        // start dma transfer
        if ( HAL_ADC_Start_DMA(&adc_handle, (uint32_t*)&total_adc_readings, TOTAL_TRANSFER_WORDS) != HAL_OK )
        {
                while ( 1 )
                {
                        /* ADC INITIALIZATION FAILED */
                }
        }
}

And here is my msp init function :

void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        static DMA_HandleTypeDef hdma_adc;

        // Enable GPIO Clock, ADC Clock, DMA2 Clock respectively
        ADC_GPIO_PORT_CLK_ENABLE(); // this is actually __HAL_RCC_GPIOF_CLK_ENABLE()
        ADC_CLK_ENABLE(); // this is actually __HAL_RCC_ADC3_CLK_ENABLE()
        DMA_CLK_ENABLE(); // this is actually __HAL_RCC_DMA2_CLK_ENABLE()

        // Configure ADC Pins

// VSYS_LEVEL_ADC_PIN is actually GPIO_PIN_6
// VBAT_EXT_LEVEL_ADC_PIN is actually GPIO_PIN_7
// VBAT_MAIN_LEVEL_ADC_PIN is actually GPIO_PIN_8
// VBAT_RC_LEVEL_ADC_PIN is actually GPIO_PIN9
// and lastly ADC_GPIO_PORT is actually GPIOF

        GPIO_InitStructure.Pin = ( VSYS_LEVEL_ADC_PIN | VBAT_EXT_LEVEL_ADC_PIN | VBAT_MAIN_LEVEL_ADC_PIN | VBAT_RC_LEVEL_ADC_PIN );
        GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
        GPIO_InitStructure.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(ADC_GPIO_PORT, &GPIO_InitStructure);

        // Configure DMA Streams

// ADC_DMA_STREAM is actually DMA2_Stream0
// and lastly ADC_DMA_CHANNEL is DMA_CHANNEL_2

        hdma_adc.Instance = ADC_DMA_STREAM;
        hdma_adc.Init.Channel = ADC_DMA_CHANNEL;
        hdma_adc.Init.Mode = DMA_CIRCULAR;
        hdma_adc.Init.Direction = DMA_PERIPH_TO_MEMORY;
        hdma_adc.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
        hdma_adc.Init.PeriphInc = DMA_PINC_DISABLE;
  hdma_adc.Init.MemInc = DMA_MINC_ENABLE;
        hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
  hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
        hdma_adc.Init.Priority = DMA_PRIORITY_HIGH;
        hdma_adc.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_HALFFULL;
  hdma_adc.Init.MemBurst = DMA_MBURST_SINGLE;
  hdma_adc.Init.PeriphBurst = DMA_PBURST_SINGLE;
        HAL_DMA_Init(&hdma_adc);

        /* Associate the initialized DMA handle to the ADC handle */
  __HAL_LINKDMA(hadc, DMA_Handle, hdma_adc);
}

after all, when I debugging the code, total_adc_readings is always filled with 0x00.
It means that, ADC initialization is false I think.

But I can not find the problem with the initialization code.
Could you help me for finding problem in the initialization code.
Thanks for answers.
Best regards.