cancel
Showing results for 
Search instead for 
Did you mean: 

Adc continuous mode problem

Hasan Sabri
Associate
Posted on March 30, 2018 at 17:23

Hello,

I'am getting the data from adc using dma and adc is triggered by timer1s update event. My purpose is sampling the input continuously via adc to a circular buffer at background.

Problem is adc is working as in on one shot mode. After starting adc with HAL_ADC_Start_DMA function adstart bit becomes 0 and adc not restarts itself.

adc init

static void MX_ADC1_Init(void)

{

  ADC_MultiModeTypeDef multimode;

  ADC_ChannelConfTypeDef sConfig;

    /**Common config

    */

  hadc1.Instance = ADC1;

  hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;

  hadc1.Init.Resolution = ADC_RESOLUTION_8B;

  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;

  hadc1.Init.ContinuousConvMode = ENABLE;

  hadc1.Init.DiscontinuousConvMode = DISABLE;

  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;

  hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_TRGO;

  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;

  hadc1.Init.NbrOfConversion = 1;

  hadc1.Init.DMAContinuousRequests = DISABLE;

  hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV;

  hadc1.Init.LowPowerAutoWait = DISABLE;

  hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;

  if (HAL_ADC_Init(&hadc1) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }

    /**Configure the ADC multi-mode

    */

  multimode.Mode = ADC_MODE_INDEPENDENT;

  if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }

    /**Configure Regular Channel

    */

  sConfig.Channel = ADC_CHANNEL_1;

  sConfig.Rank = ADC_REGULAR_RANK_1;

  sConfig.SingleDiff = ADC_SINGLE_ENDED;

  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;

  sConfig.OffsetNumber = ADC_OFFSET_NONE;

  sConfig.Offset = 0;

  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }

}

Timer init

static void MX_TIM1_Init(void)

{

  TIM_ClockConfigTypeDef sClockSourceConfig;

  TIM_MasterConfigTypeDef sMasterConfig;

  htim1.Instance = TIM1;

  htim1.Init.Prescaler = 0;

  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;

  htim1.Init.Period = 150;

  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

  htim1.Init.RepetitionCounter = 0;

  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

  if (HAL_TIM_Base_Init(&htim1) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;

  if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;

  sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;

  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

  if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }

}

Msp_Init

void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)

{

  GPIO_InitTypeDef GPIO_InitStruct;

  if(hadc->Instance==ADC1)

  {

  /* USER CODE BEGIN ADC1_MspInit 0 */

  /* USER CODE END ADC1_MspInit 0 */

    /* Peripheral clock enable */

    __HAL_RCC_ADC12_CLK_ENABLE();

 

    /**ADC1 GPIO Configuration    

    PA0     ------> ADC1_IN1

    */

    GPIO_InitStruct.Pin = GPIO_PIN_0;

    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;

    GPIO_InitStruct.Pull = GPIO_NOPULL;

    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* ADC1 DMA Init */

    /* ADC1 Init */

    hdma_adc1.Instance = DMA1_Channel1;

    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_BYTE;

    hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;

    hdma_adc1.Init.Mode = DMA_CIRCULAR;

    hdma_adc1.Init.Priority = DMA_PRIORITY_LOW;

    if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)

    {

      _Error_Handler(__FILE__, __LINE__);

    }

    __HAL_LINKDMA(hadc,DMA_Handle,hdma_adc1);

    /* ADC1 interrupt Init */

    HAL_NVIC_SetPriority(ADC1_2_IRQn, 0, 0);

    HAL_NVIC_EnableIRQ(ADC1_2_IRQn);

  /* USER CODE BEGIN ADC1_MspInit 1 */

  /* USER CODE END ADC1_MspInit 1 */

  }

}

#adc #circular-buffer #stm32f3 #dma
2 REPLIES 2
Posted on March 30, 2018 at 20:01

Dear Hasan

I produced a complete tutorial about that :

https://community.st.com/0D50X00009bMM4uSAG

 

your feedback would be most welcomed.

Bye

JC

Dominik Dráb
Associate II
Posted on March 30, 2018 at 20:13

I think the problem is:

hadc1.Init.DMAContinuousRequests = DISABLE;�?

Try changing it to ENABLE