STM32
直播中

大彭

10年用户 1064经验值
擅长:电源/新能源 嵌入式技术
私信 关注
[问答]

STM32F0 ADC多通道单次转换,最后一个通道的EOC不置位是为什么?

STM32F030 ADC采样序列中包括IN0,IN1,IN2三个通道,采用单次转换模式,软件触发启动,但是发现采样转换到最后一个通道IN2时,EOC不会置位,程序进入超时状态。有哪位朋友碰到过此问题?主要代码如下:

uint16_t  ADCValue[3;
void MX_ADC_Init(void)
{  
  ADC_ChannelConfTypeDef sConfig;  
  hadc.Instance = ADC1;  
  hadc.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;  
  hadc.Init.Resolution = ADC_RESOLUTION_12B;  
  hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;  
  hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;  
  hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV;  
  hadc.Init.LowPowerAutoWait = DISABLE;  
  hadc.Init.LowPowerAutoPowerOff = DISABLE;  
  hadc.Init.ContinuousConvMode = DISABLE;  
  hadc.Init.DiscontinuousConvMode = DISABLE;  
  hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;  
  hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;  
  hadc.Init.DMAContinuousRequests = DISABLE;  
  hadc.Init.Overrun = ADC_OVR_DATA_PRESERVED;  
  if (HAL_ADC_Init( hadc) != HAL_OK)  
  {   
    _Error_Handler(__FILE__, __LINE__);  
  }  

  sConfig.Channel = ADC_CHANNEL_0;  
  sConfig.Rank = ADC_RANK_CHANNEL_NUMBER;  
  sConfig.SamplingTime = ADC_SAMPLETIME_7CYCLES_5;  
  if (HAL_ADC_ConfigChannel( hadc,  sConfig) != HAL_OK)  
  {
    _Error_Handler(__FILE__, __LINE__);  
  }  

  sConfig.Channel = ADC_CHANNEL_1;  
  if (HAL_ADC_ConfigChannel( hadc,  sConfig) != HAL_OK)  
  {
    _Error_Handler(__FILE__, __LINE__);  
  }  

  sConfig.Channel = ADC_CHANNEL_2;  
  if (HAL_ADC_ConfigChannel( hadc,  sConfig) != HAL_OK)  
  {
    _Error_Handler(__FILE__, __LINE__);  
  }
}

void Get_ADCVal(void)
{  
  uint8_t  i;

  if (HAL_ADC_Start( hadc) != HAL_OK)  
  {   
    _Error_Handler(__FILE__, __LINE__);  
  }  

  for ( i=0;  i<3;  i++ )   
  {   
    if (HAL_ADC_PollForConversion( hadc, 20) != HAL_OK)   
       _Error_Handler(__FILE__, __LINE__);   // ********** 当 i 递增到2时,程序执行死在这里!!!!!!!!!!   
    else   
      ADCValue[i = HAL_ADC_GetValue( hadc);   
  }
    // HAL_ADC_Stop( hadc);
}







回帖(1)

王燕

2024-4-16 14:36:22
看起来ADC的转换模式是单次的,所以第二次的转换是没有启动,也就没有EOC。 把ADC的启动放到FOR 循环里就正确了
举报

更多回帖

×
20
完善资料,
赚取积分