STM32CubeMX+HAL库+ADC采样配置详解(单通道,多通道,轮询,DMA,中断)

本文详细介绍了STM32L476开发板中使用ADC测量内部温度、内部参考值和VBAT的几种工作模式,包括单通道阻塞、DMA、中断和多通道轮询,以及相应的代码配置示例。
摘要由CSDN通过智能技术生成

工具:STM32L476开发板

测量值:内部温度,内部参考值,VBAT

一、单通道阻塞模式:

1、选择通道:

2、配置模式:(扫描模式关闭,连续转换打开,间断模式关闭,采样时间选择)

3、生成代码:

__IO uint32_t uwADCxConvertedValue = 0;

  while (1)
  {
		    if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED) != HAL_OK)//校准
			{Error_Handler();}
			if(HAL_ADC_Start(&hadc1) != HAL_OK)//开启ADC转换
			{Error_Handler();}
			HAL_ADC_PollForConversion(&hadc1, 10);
			if ((HAL_ADC_GetState(&hadc1) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC)
			{uwADCxConvertedValue = HAL_ADC_GetValue(&hadc1);}
            HAL_ADC_Stop(&hadc1);
			HAL_Delay(2000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

二、单通道多次采样DMA模式:

1、选择通道:

2、添加DMA通道,打开DMA中断:(循环模式,数据宽度WORD)

3、配置模式:(扫描模式关闭,连续转换打开,间断模式关闭,DMA连续请求打开)

4、生成代码:

__IO uint32_t ADC_ConvertedValue[3];
  while (1)
  {

		if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED) !=  HAL_OK)
		{ Error_Handler();}
		if (HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ADC_ConvertedValue,3 ) != HAL_OK)       
		{ Error_Handler();}
		  while(!(__HAL_DMA_GET_FLAG(&hdma_adc1,DMA_FLAG_TC1))){;}
	  __HAL_DMA_CLEAR_FLAG(&hdma_adc1,DMA_FLAG_TC1);
		HAL_ADC_Stop_DMA(&hadc1);
		HAL_Delay(2000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

三、单通道中断模式:

 1、选择通道

2、配置模式(扫描模式关闭,连续转换打开,间断模式关闭,打开ADC中断)

生成代码:

__IO uint32_t uwADCxConvertedValue = 0;
uint8_t ADC_flag = 0;
//单通道中断
	if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED) !=  HAL_OK)
	{ Error_Handler();}
	HAL_ADC_Start_IT(&hadc1); //开启ADC中断转换
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)//中断回调函数
{
		ADC_flag+=1;
    uwADCxConvertedValue = HAL_ADC_GetValue(hadc);    //获取ADC转换结果
    HAL_ADC_Start_IT(&hadc1); //开启ADC中断转换
}

四、多通道轮询

1、选择通道:

2、配置模式(扫描模式打开,连续转换关闭,间断模式打开,间断间隔为1,转换数量为3)

3、生成代码

__IO uint32_t ADC_ConvertedValue[3];  
while (1)
  {

		if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED) !=  HAL_OK)
		{ Error_Handler();}
		for(int i=0;i<3;i++)
		{  
			if(HAL_ADC_Start(&hadc1) != HAL_OK)
			{Error_Handler();}
			HAL_ADC_PollForConversion(&hadc1, 10);
			if ((HAL_ADC_GetState(&hadc1) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC)
			{ADC_ConvertedValue[i] = HAL_ADC_GetValue(&hadc1);}
		}
		HAL_ADC_Stop(&hadc1);
		HAL_Delay(2000);


    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

五、多通道DMA

1、选择通道

2、添加DMA(选择循环模式,数据宽度为WORD,打开DMA中断)

3、配置模式(扫描模式打开,连续转换打开,间断模式关闭,DMA连续请求打开)

4、生成代码

__IO uint32_t ADC_ConvertedValue[3]; 
while (1)
  {

		if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED) !=  HAL_OK)
		{ Error_Handler();}
		if (HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ADC_ConvertedValue,3 ) != HAL_OK)       
		{ Error_Handler();}
		  while(!(__HAL_DMA_GET_FLAG(&hdma_adc1,DMA_FLAG_TC1))){;}
	  __HAL_DMA_CLEAR_FLAG(&hdma_adc1,DMA_FLAG_TC1);
		HAL_ADC_Stop_DMA(&hadc1);
		HAL_Delay(2000);

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

六、多通道中断模式不太适用,这里我们不做介绍。

  • 9
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值