stm32 读取多路SDADC
方法一:用SDADC的规则通道一个一个去读,配置SDADC如下
读入代码比较简单,依次读取SDADC1通道6、通道8和SDADC3通道0,代码如下

/* USER CODE BEGIN Header_StartDefaultTask */ volatile uint32_t SDADC_Value[10]; /** * @brief Function implementing the defaultTask thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartDefaultTask */ void StartDefaultTask(void const * argument) { /* USER CODE BEGIN StartDefaultTask */ /* Infinite loop */ for(;;) { //read SDADC1 Channel6 HAL_SDADC_ConfigChannel(&hsdadc1,SDADC_CHANNEL_6,SDADC_CONTINUOUS_CONV_OFF);// set channel HAL_SDADC_Start(&hsdadc1);//start sdadc if(HAL_SDADC_PollForConversion(&hsdadc1,HAL_MAX_DELAY)==HAL_OK)//waiting for convert complete { SDADC_Value[0] = HAL_SDADC_GetValue(&hsdadc1);// read the value of sdadc HAL_SDADC_Stop(&hsdadc1); } //read SDADC1 Channel8 HAL_SDADC_ConfigChannel(&hsdadc1,SDADC_CHANNEL_8,SDADC_CONTINUOUS_CONV_OFF); HAL_SDADC_Start(&hsdadc1); if(HAL_SDADC_PollForConversion(&hsdadc1,HAL_MAX_DELAY)==HAL_OK) { SDADC_Value[1] = HAL_SDADC_GetValue(&hsdadc1); HAL_SDADC_Stop(&hsdadc1); } //read SDADC3 Channel0 HAL_SDADC_ConfigChannel(&hsdadc3,SDADC_CHANNEL_0,SDADC_CONTINUOUS_CONV_OFF); HAL_SDADC_Start(&hsdadc3); if(HAL_SDADC_PollForConversion(&hsdadc3,HAL_MAX_DELAY)==HAL_OK) { SDADC_Value[2] = HAL_SDADC_GetValue(&hsdadc3); HAL_SDADC_Stop(&hsdadc3); } osDelay(1); } /* USER CODE END StartDefaultTask */ }
方法二:用注入通道一次读取多个转换值
配置SDADC
配置DMA
校准SDADC并启动转换

void StartDefaultTask(void const * argument) { /* USER CODE BEGIN StartDefaultTask */ static uint32_t SDADC1_DegitalValue[5]; static uint32_t SDADC3_DegitalValue[5]; HAL_StatusTypeDef status; /* 配置SDADC1 */ if(HAL_SDADC_CalibrationStart(&hsdadc1, SDADC_CALIBRATION_SEQ_1) != HAL_OK)/* 启动偏置校准 */ Error_Handler(); if(HAL_SDADC_PollForCalibEvent(&hsdadc1, 1000) != HAL_OK)/*等待校准完成 */ Error_Handler(); if(HAL_SDADC_InjectedStart_DMA(&hsdadc1,SDADC1_DegitalValue,5) != HAL_OK)/* 启动 SDADC1 注入式 DMA 转换 */ Error_Handler(); /* 配置SDADC3 */ if(HAL_SDADC_CalibrationStart(&hsdadc3, SDADC_CALIBRATION_SEQ_3) != HAL_OK)/* 启动偏置校准 */ Error_Handler(); if(HAL_SDADC_PollForCalibEvent(&hsdadc3, 1000) != HAL_OK)/*等待校准完成 */ Error_Handler(); if(HAL_SDADC_InjectedStart_DMA(&hsdadc3,SDADC3_DegitalValue,5) != HAL_OK)/* 启动 SDADC3 注入式 DMA 转换 */ Error_Handler(); /* Infinite loop */ for(;;) { osDelay(1); } /* USER CODE END StartDefaultTask */ }
转换结果如下:
可以将SDADC1_DegitalValue[5]改为SDADC1_DegitalValue[50],SDADC每次转换完后DMA都会循环追加到数组,这样就拥有了每个通道的10次数据,然后取均值得到稳定的电压值。