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



我试图以简单的连续转换模式将ADC通过STM32F411RE配置。我使用cubemx基于HAL驱动程序生成代码,这是生成的代码的某些部分,该代码是Intialial 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 failedn";
  /* 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 OKn",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上传输类似物。但是,如果我将hal_adc_start函数放置在while循环中,则hal_adc_pollforconversion返回的值将在每个周期内为hal_ok,并且将有一个类似的报告。

我的问题是,如果我启用了连续convmode,为什么我每次都要求ADC开始?

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

您当前的选项ADC_EOC_SINGLE_CONV的作用就像单个转换的启用,但是您需要EOC_SEQ_CONV又名顺序转换。

这几乎与这里讨论的问题相同。

根据参考手册(RM0383,p。214):

通过在ADC_CR1中设置扫描位来选择扫描模式 登记。设置此位后,ADC扫描所有频道 在ADC_SQRX寄存器中选择(常规频道)或 ADC_JSQR寄存器(用于注入的通道)。一个转换是 为组的每个频道执行。转换的每一末之后, 组中的下一个通道会自动转换。如果续 设置位,常规频道转换不会停止 小组中选定的频道,但从第一个开始又继续 选定的频道

因此,您必须在ADC_SQR寄存器中声明一组频道及其数量(在您的情况下仅是一个渠道)。

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

 g_AdcHandle.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1;

,但是,我还没有在此代码的其余部分中看到计时器的初始化。

最新更新