cancel
Showing results for 
Search instead for 
Did you mean: 

ADC Stops in between without any error code.

TShet
Associate II

Hello,

I'm using STM32f723ZE controller & ADC configured as follow with external trigger(Timer), I verified timers works properly all the times and ADC 1 Stops after few minutes of data capture, but no error code set in Register.

ADC1 & ADC2; (External Trigger is Timer 😎

ADC1, ADC2 Configured as Dual Mode with DMA Enable (12Bit ADC) + TIM8 & ADC 3 As MultiBuffer with DMA + TIM4

ADC1: (500KHz Sampling Frequency )

 hadc1.Instance = ADC1;

 hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;

 hadc1.Init.Resolution = ADC_RESOLUTION_12B;

 hadc1.Init.ScanConvMode = DISABLE;

 hadc1.Init.ContinuousConvMode = DISABLE;

 hadc1.Init.DiscontinuousConvMode = DISABLE;

 hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;

 hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T8_TRGO;

 hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;

 hadc1.Init.NbrOfConversion = 1;

 hadc1.Init.DMAContinuousRequests = ENABLE;

 hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV;

 multimode.Mode = ADC_DUALMODE_INTERL;

 multimode.DMAAccessMode = ADC_DMAACCESSMODE_2;        

 multimode.TwoSamplingDelay = ADC_TWOSAMPLINGDELAY_7CYCLES;

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

 {

  _Error_Handler(__FILE__, __LINE__);

 }

 sConfig.Channel = ADC_CHANNEL_0;

 sConfig.Rank = 1;

 sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;

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

 {

  _Error_Handler(__FILE__, __LINE__);

 }

ADC2:

hadc2.Instance = ADC2;

 hadc2.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;

 hadc2.Init.Resolution = ADC_RESOLUTION_12B;

 hadc2.Init.ScanConvMode = DISABLE;

 hadc2.Init.ContinuousConvMode = DISABLE;

 hadc2.Init.DiscontinuousConvMode = DISABLE;

 hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT;

 hadc2.Init.NbrOfConversion = 1;

 hadc2.Init.DMAContinuousRequests = ENABLE;

 hadc2.Init.EOCSelection = ADC_EOC_SEQ_CONV;

 if (HAL_ADC_Init(&hadc2) != HAL_OK)

 {

  _Error_Handler(__FILE__, __LINE__);

 }

 sConfig.Channel = ADC_CHANNEL_1;

 sConfig.Rank = 1;

 sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;

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

 {

  _Error_Handler(__FILE__, __LINE__);

 }

ADC1 DMA:

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

  hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;

  hdma_adc1.Init.Mode = DMA_CIRCULAR;

  hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;

  hdma_adc1.Init.FIFOMode = DMA_FIFOMODE_DISABLE;

  hdma_adc1.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;

  hdma_adc1.Init.MemBurst = DMA_MBURST_SINGLE;

  hdma_adc1.Init.PeriphBurst = DMA_PBURST_SINGLE;

  if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)

  {

   _Error_Handler(__FILE__, __LINE__);

  }

  __HAL_LINKDMA(hadc,DMA_Handle,hdma_adc1);

  /* DMA2_Stream0_IRQn interrupt configuration */

  HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 1, 1);

  HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);

ADC3: (External Trigger is Timer 4)

hadc3.Instance = ADC3;

 hadc3.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;

 hadc3.Init.Resolution = ADC_RESOLUTION_12B;

 hadc3.Init.ScanConvMode = ENABLE;

 hadc3.Init.ContinuousConvMode = DISABLE; //DISABLE;

 hadc3.Init.DiscontinuousConvMode = DISABLE; 

 hadc3.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING; //ADC_EXTERNALTRIGCONVEDGE_RISING; //

 hadc3.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T4_CC4; // ADC_EXTERNALTRIGCONV_T8_TRGO;

 hadc3.Init.DataAlign = ADC_DATAALIGN_RIGHT;

 hadc3.Init.NbrOfConversion = 4;

 hadc3.Init.DMAContinuousRequests = ENABLE;

 hadc3.Init.EOCSelection = ADC_EOC_SEQ_CONV;

 if (HAL_ADC_Init(&hadc3) != HAL_OK)

 {

   _Error_Handler(__FILE__, __LINE__);

 }

 sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;

 sConfig.Channel = ADC_CHANNEL_8;      

 sConfig.Rank = ADC_REGULAR_RANK_1;

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

 {

   _Error_Handler(__FILE__, __LINE__);

 }

 sConfig.Channel = ADC_CHANNEL_9;      

 sConfig.Rank = ADC_REGULAR_RANK_2;

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

 {

   _Error_Handler(__FILE__, __LINE__);

 }

 sConfig.Channel = ADC_CHANNEL_3;          

 sConfig.Rank = ADC_REGULAR_RANK_3;

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

 {

   _Error_Handler(__FILE__, __LINE__);

 }

 sConfig.Channel = ADC_CHANNEL_15;          

 sConfig.Rank = ADC_REGULAR_RANK_4;

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

 {

   _Error_Handler(__FILE__, __LINE__);

 }

ADC3 DMA:

hdma_adc3.Instance = DMA2_Stream1; //DMA2_Stream2;

  hdma_adc3.Init.Channel = DMA_CHANNEL_2;

  hdma_adc3.Init.Direction = DMA_PERIPH_TO_MEMORY;

  hdma_adc3.Init.PeriphInc = DMA_PINC_DISABLE;

  hdma_adc3.Init.MemInc = DMA_MINC_ENABLE;

  hdma_adc3.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; //DMA_PDATAALIGN_WORD;

  hdma_adc3.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; //DMA_MDATAALIGN_WORD;

  hdma_adc3.Init.Mode = DMA_CIRCULAR;

  hdma_adc3.Init.Priority = DMA_PRIORITY_LOW;

  hdma_adc3.Init.FIFOMode = DMA_FIFOMODE_ENABLE;

  hdma_adc3.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;

  hdma_adc3.Init.MemBurst = DMA_MBURST_SINGLE;

  hdma_adc3.Init.PeriphBurst = DMA_PBURST_SINGLE;

  if (HAL_DMA_Init(&hdma_adc3) != HAL_OK)

  {

   _Error_Handler(__FILE__, __LINE__);

  }

  __HAL_LINKDMA(hadc,DMA_Handle,hdma_adc3);

  /* DMA2_Stream1_IRQn interrupt configuration */

  HAL_NVIC_SetPriority(DMA2_Stream1_IRQn, 2, 1);

  HAL_NVIC_EnableIRQ(DMA2_Stream1_IRQn);

START:

ADC1: (500KHz Sampling Frequency )

unsigned short dmaBuffer[512];

if (HAL_ADCEx_MultiModeStart_DMA(&hadc1, (uint32_t *)&dmaBuffer[0], 64) != HAL_OK)

 {

  /* Start Error */

  _Error_Handler(__FILE__, __LINE__);

 }

 /* Start ADC PWM generation */

 if(HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_4))  

 {

  /* Counter Enable Error */

  _Error_Handler(__FILE__, __LINE__);

 }

ADC3: (50KHz Sampling Frequency )

unsigned short pdmaBuffer[512];

halErr=HAL_ADC_Start_DMA(&hadc3, (uint16_t*)&pdmaBuffer[0], 256);

   if(halErr!= HAL_OK)

   {

    Error_Handler();

   }

   halErr=HAL_DMAEx_MultiBufferStart_IT(&hdma_adc3, (uint32_t)&hadc->Instance->DR, (uint32_t)&pdmaBuffer[0],(uint32_t)&pdmaBuffer[256], 256);

   if(halErr != HAL_OK)

   {

    Error_Handler();

   }

 }

 if(HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_4) != HAL_OK)

 {

  /* Counter Enable Error */

   Error_Handler();

 }

Please let me know, if any issue with following configuration and any light on "why ADC 1 stops after few minutes of data capture & ADC 3 runs as expected ?"

Thanks In Advance

0 REPLIES 0