一.为什么使用DMA

二. 相关的函数api

三.代码的实现
1. 定义全局变量
/* USER CODE BEGIN PV */
uint32_t adc_val[2]; //存储adc数值
float voltage[2]; //存储电压值
/* USER CODE END PV */
2. 首先在main函数进行adc的校准
/* USER CODE BEGIN 2 */
HAL_ADCEx_Calibration_Start(&hadc1); //进行adc校准
/* USER CODE END 2 */
3. 在while函数里面进行dma的配置
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_ADC_Start_DMA(&hadc1,adc_val, 2); //开启adc dma转换
/* USER CODE END WHILE */
HAL_Delay(500); //延时0.5s
/* USER CODE BEGIN 3 */
}
4.完成回调函数的编写,以及重定向的函数
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
ADC_Hander(hadc);
}
void ADC_Hander(ADC_HandleTypeDef* hadc){
if(hadc->Instance == ADC1)
{
voltage[0] = (float)adc_val[0] * 3.3f / 4095;
voltage[1] = (float)adc_val[1]* 3.3f / 4095;
printf("adc_val[0] = %d, voltage[0] = %f\r\n", adc_val[0], voltage[0]);
printf("adc_val[1] = %d, voltage[1] = %f\r\n", adc_val[1], voltage[1]);
}
}
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}