Skip to main content
Emilmart
Associate III
June 1, 2022
Solved

STM32F7 ADC + DMA + multiples channels + regular conversion + continuous conversion not sampling

Hi,

I want to sample 9 channels with 1 ADC, using DMA in circular buffer mode with continuous conversion.

My callbacks of conversion (like HAL_ADC_ConvCpltCallback or HAL_ADC_ConvHalfCpltCallback) are not triggering, the sampling seems to never start.

I'm also using freeRTOS.

Am I missing something ?

Here's the code:

#define ADC3_BUF_LEN 9
uint16_t adc3_buf[ADC3_BUF_LEN];
 
/* ADC3 init function */
void MX_ADC3_Init(void)
{
 
 /* USER CODE BEGIN ADC3_Init 0 */
 
 /* USER CODE END ADC3_Init 0 */
 
 ADC_ChannelConfTypeDef sConfig = {0};
 
 /* USER CODE BEGIN ADC3_Init 1 */
 
 /* USER CODE END ADC3_Init 1 */
 /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
 */
 hadc3.Instance = ADC3;
 hadc3.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
 hadc3.Init.Resolution = ADC_RESOLUTION_12B;
 hadc3.Init.ScanConvMode = ADC_SCAN_ENABLE;
 hadc3.Init.ContinuousConvMode = DISABLE;
 hadc3.Init.DiscontinuousConvMode = DISABLE;
 hadc3.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
 hadc3.Init.ExternalTrigConv = ADC_SOFTWARE_START;
 hadc3.Init.DataAlign = ADC_DATAALIGN_RIGHT;
 hadc3.Init.NbrOfConversion = 9;
 hadc3.Init.DMAContinuousRequests = ENABLE;
 hadc3.Init.EOCSelection = ADC_EOC_SEQ_CONV;
 if (HAL_ADC_Init(&hadc3) != HAL_OK)
 {
 Error_Handler();
 }
 /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
 */
 sConfig.Channel = ADC_CHANNEL_9;
 sConfig.Rank = ADC_REGULAR_RANK_1;
 sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
 if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)
 {
 Error_Handler();
 }
 /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
 */
 sConfig.Channel = ADC_CHANNEL_14;
 sConfig.Rank = ADC_REGULAR_RANK_2;
 if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)
 {
 Error_Handler();
 }
 /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
 */
 sConfig.Channel = ADC_CHANNEL_15;
 sConfig.Rank = ADC_REGULAR_RANK_3;
 if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)
 {
 Error_Handler();
 }
 /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
 */
 sConfig.Channel = ADC_CHANNEL_4;
 sConfig.Rank = ADC_REGULAR_RANK_4;
 if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)
 {
 Error_Handler();
 }
 /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
 */
 sConfig.Channel = ADC_CHANNEL_10;
 sConfig.Rank = ADC_REGULAR_RANK_5;
 if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)
 {
 Error_Handler();
 }
 /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
 */
 sConfig.Channel = ADC_CHANNEL_11;
 sConfig.Rank = ADC_REGULAR_RANK_6;
 if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)
 {
 Error_Handler();
 }
 /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
 */
 sConfig.Channel = ADC_CHANNEL_12;
 sConfig.Rank = ADC_REGULAR_RANK_7;
 if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)
 {
 Error_Handler();
 }
 /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
 */
 sConfig.Channel = ADC_CHANNEL_13;
 sConfig.Rank = ADC_REGULAR_RANK_8;
 if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)
 {
 Error_Handler();
 }
 /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
 */
 sConfig.Channel = ADC_CHANNEL_3;
 sConfig.Rank = ADC_REGULAR_RANK_9;
 if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)
 {
 Error_Handler();
 }
 /* USER CODE BEGIN ADC3_Init 2 */
 if (HAL_ADC_Start_DMA(&hadc3, (uint32_t*)adc3_buf, ADC3_BUF_LEN) != HAL_OK)
 {
 Error_Handler();
 }
 
 /* USER CODE END ADC3_Init 2 */
 
}

Thank!

This topic has been closed for replies.
Emilmart
EmilmartBest answer
Associate III
June 3, 2022

Found the culprit. The init (done by CubeMX) should have DMA init before the ADC.

MX_DMA_Init();
MX_ADC3_Init();

To change the init generation go to MX editor, Project Manager > Advanced Settings > Generated Function Calls and move the ADC init under the DMA init

1 reply

Emilmart
EmilmartAuthorBest answer
Associate III
June 3, 2022

Found the culprit. The init (done by CubeMX) should have DMA init before the ADC.

MX_DMA_Init();
MX_ADC3_Init();

To change the init generation go to MX editor, Project Manager > Advanced Settings > Generated Function Calls and move the ADC init under the DMA init