在void MX_ADC1_Init(void)函数中添加如下代码:
cpp
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC_Value, 3);//开启ADC_DMA//ADC_Value数据缓存buff
在DMA中断中添加如下代码 :
cpp
if(__HAL_DMA_GET_FLAG(&hdma_adc1,DMA_FLAG_TCIF0_4 ))//传输完成
{
g_adc_dma_sta = 1;//标志位置1
// printf("g_adc_dma_sta = %d\r\n",g_adc_dma_sta);
__HAL_DMA_CLEAR_FLAG(&hdma_adc1,DMA_FLAG_TCIF0_4 );//清除传输完成标志位
}
ADC数据处理
cpp
/* Includes ------------------------------------------------------------------*/
#include "adc_driver.h"
uint16_t ADC_Value[4] = {0};
uint8_t g_adc_dma_sta = 0;
/********************************************************************************************************
* 功能说明: 获取ADC的数据
* 形 参: 无
* 返 回 值: 无
**********************************************************************************************************/
void ADC_GetAdcValues(void)
{
uint16_t sum = 0;
float Vol = 0;
uint16_t percent = 0;
if (g_adc_dma_sta == 1)
{
for(int j = 0; j < 3; j++) // 遍历3个通道,轮流取值
{
sum = 0;
for(int i = 0; i < 1; i++)
{
// printf("****************sum[x] = %d\r\n",ADC_Value[j]);
sum += ADC_Value[(3 * i) + j]; // 每个通道采集i次数据,进行i次累加
}
Vol = (float)sum/4096 * 12.5;
percent = (float)sum/4096 * 100;
// sum = sum / 10; // 取平均值
printf("sum[%d] = %d\r\n",j,sum);
printf("Vol[%d] = %.2f\r\n",j,Vol);
}
// printf("sum[x] = %d\r\n",sum);
g_adc_dma_sta = 0; // 清除DMA采集完成标志位
// HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC_Value, 4); // 开启下一次ADC和DMA采集
// HAL_ADC_Start(&hadc1);//
}
}