STM32 ADC连续转换模式不会自动启动转换

Nix*_*xmd 4 microcontroller gcc arm stm32 adc

我试图在简单的连续转换模式下通过STM32F411RE配置ADC.我使用CubeMX生成基于HAL驱动程序的代码,这是初始化ADC的生成代码的一些部分:

/* ADC1 init function */
void MX_ADC1_Init(void)
{

    /**Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) 
    */
  hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV8;
  hadc1.Init.Resolution = ADC_RESOLUTION_8B;
  hadc1.Init.ScanConvMode = DISABLE;
  hadc1.Init.ContinuousConvMode = ENABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 1;
  hadc1.Init.DMAContinuousRequests = DISABLE;
  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }

}
Run Code Online (Sandbox Code Playgroud)

这是主要功能:

int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ADC1_Init();
  MX_USART2_UART_Init();

  /* USER CODE BEGIN 2 */
  uint8_t analogVal;
  uint8_t string[] = "Poll failed\n";

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  HAL_Delay(1000);
  if( HAL_ADC_Start(&hadc1) == HAL_OK) HAL_UART_Transmit(&huart2,(uint8_t*)"STRT OK\n",8,100);
  else HAL_UART_Transmit(&huart2,(uint8_t *)HAL_ADC_Start(&hadc1),1,100);
  while (1)
  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
    if(HAL_ADC_PollForConversion(&hadc1,1) == HAL_OK){
      analogVal = HAL_ADC_GetValue(&hadc1);
      HAL_UART_Transmit(&huart2,&analogVal,sizeof(analogVal),100);
    }
    else{
      HAL_UART_Transmit(&huart2,string,sizeof(string)-1,100);
    }
    HAL_Delay(100);
  }
  /* USER CODE END 3 */

}
Run Code Online (Sandbox Code Playgroud)

如果我编译并将此代码上传到微控制器,则只需通过UART传输一次analogVal.但是如果我将HAL_ADC_Start函数放在while循环中,则HAL_ADC_PollForConversion返回值将在每个while循环中为HAL_OK,并且将有一个analogVal报告.

我的问题是,如果我启用了ContinuousConvMode,为什么每次都要求ADC启动?

Ben*_*ics 5

我确信EOC标志设置是问题所在.hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; 应改为hadc1.Init.EOCSelection = EOC_SEQ_CONV;.

您当前的选项ADC_EOC_SINGLE_CONV就像启用单次转换一样,但您还需要EOC_SEQ_CONV顺序转换.

这与此处讨论的问题几乎相同.