工具: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 */
}
六、多通道中断模式不太适用,这里我们不做介绍。