STM32 ADC Continuous Conv Mode不自动开始转换

STM32 ADC Continuous Conv Mode does not automatically start conversion

我正在尝试在简单的连续转换模式下通过 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 */

}

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

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

根据参考手册(RM0383,第 214 页):

The Scan mode is selected by setting the SCAN bit in the ADC_CR1 register. Once this bit has been set, the ADC scans all the channels selected in the ADC_SQRx registers (for regular channels) or in the ADC_JSQR register (for injected channels). A single conversion is performed for each channel of the group. After each end of conversion, the next channel in the group is converted automatically. If the CONT bit is set, regular channel conversion does not stop at the last selected channel in the group but continues again from the first selected channel.

因此,您还必须在 ADC_SQR 注册中声明一组频道及其数量(在您的情况下,它将只有一个频道)。

编辑: 请注意,在您发布的示例中 定时器每次转换都有外部触发:

 g_AdcHandle.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1;

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

我确定是 EOC 标志设置的问题。 hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; 应更改为 hadc1.Init.EOCSelection = EOC_SEQ_CONV;

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

这与 here.

讨论的问题几乎相同