STM32F103 ADC1 使用IN1,IN4做ADC输入,ADC工作在中断模式,没有用DMA,在回调函数里读出的数据不是预期数据,有时读入的数据IN1的,有时读入的数据IN4的,,请高手指点哪里出问题。
代码下:
void MX_ADC1_Init(void)
{
/* USER CODE BEGIN ADC1_Init 0 */
#include "Userinclude.h"
/* USER CODE END ADC1_Init 0 */
ADC_ChannelConfTypeDef sConfig = {0};
/* USER CODE BEGIN ADC1_Init 1 */
/* USER CODE END ADC1_Init 1 */
/** Common config
*/
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 2;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_1;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_55CYCLES_5;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_4;
sConfig.Rank = ADC_REGULAR_RANK_2;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN ADC1_Init 2 */
/* USER CODE END ADC1_Init 2 */
}
#define ADC1_CHANNELS 2 // ADC1通道数量
uint16_t adc1_1value=0,adc1_2value=0; //ADC转换数据存储变量
/* ADC转换完成中断回调函数 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
static uint16_t channelIndex=0;
uint16_t adc1_value;
if(hadc->Instance == ADC1)
{
/* 获取通道1和通道4的转换结果 */
adc1_value= HAL_ADC_GetValue(&hadc1); // 通道结果
//adc1_value= HAL_ADC_GetValue(&hadc1); // 通道结果
//LED1out(1);
switch (channelIndex)
{
case 0:
{
adc1_1value=adc1_value;
}
break;
case 1:
{
adc1_2value=adc1_value;
}
break;
default:
{
}
}
channelIndex = (channelIndex + 1) % ADC1_CHANNELS; // 切换到下一个通道
if (channelIndex == 0) //完成了所有通道的转换
{
// HAL_ADC_Start_IT(&hadc1); //启动ADC转换(规则组)
}
}
}
void ADC1_2Start(void) //启动ADC转换(规则组)
{
if(HAL_ADC_Start_IT(&hadc1) != HAL_OK)
{
Error_Handler(); // 错误处理
}
}
|