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

6

我正在尝试在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();
  }

}

以下是主函数:

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 */

}

如果我将这段代码编译并上传到微控制器中,只会一次传输analogVal。但是如果我将HAL_ADC_Start函数放在while循环内部,那么每个循环周期中HAL_ADC_PollForConversion返回的值都将是HAL_OK,并且会有一个analogVal要报告。
我的问题是,如果我已经启用了ContinuousConvMode,为什么每次都要请求ADC开始?
2个回答

9
我相信EOC标志位的设置是问题所在。需要将 hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; 改为 hadc1.Init.EOCSelection = EOC_SEQ_CONV;
你当前选项 ADC_EOC_SINGLE_CONV 的作用类似于单次转换的启用,但你需要 EOC_SEQ_CONV,即顺序转换。
这基本上是在此处讨论过的相同问题。 请参考这里

0
根据参考手册(RM0383,第214页):
ADC扫描模式是通过设置ADC_CR1寄存器中的SCAN位来选择的。一旦设置了此位,ADC将扫描ADC_SQRx寄存器(对于常规通道)或ADC_JSQR寄存器(对于注入通道)中选择的所有通道。每个组的每个通道执行单次转换。在每个转换结束后,组中的下一个通道将自动转换。如果设置了CONT位,则常规通道转换不会停止在组中最后选择的通道处,而是从第一个选择的通道重新开始。
因此,您还需要在ADC_SQR寄存器中声明通道组和数量(在您的情况下,只有一个通道)。
编辑: 请注意,在您发布的示例中,每次转换都由定时器进行外部触发。
 g_AdcHandle.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1;

但是我还没有在这段代码的其他部分看到计时器的初始化。


1
感谢您回复我的问题。但是根据这篇文章(https://visualgdb.com/tutorials/arm/stm32/adc/),由于我们不会使用多个ADC通道,因此不需要使用ScanMode。 - Nixmd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接