stm32CubeMx 实现单通道ADC DMA采集

 今天要做的是ADC单通道DMA采集实验

MCU : STM32F429

开发工具:STM32CubeMx 版本号 5.0.0

实验目的:实现ADC1 13通道 DMA采集

一 :简介

  首先,我们来看一下STM32F4XX参考手册里关于该芯片的ADC功能介绍

  stm32CubeMx 实现单通道ADC DMA采集_第1张图片

 

stm32CubeMx 实现单通道ADC DMA采集_第2张图片

 

 

二:STM32CubeMx 配置

 

配置RCC 

 stm32CubeMx 实现单通道ADC DMA采集_第3张图片

 

 配置时钟,硬件使用了25MHz无源晶振

stm32CubeMx 实现单通道ADC DMA采集_第4张图片

配置ADC

 

stm32CubeMx 实现单通道ADC DMA采集_第5张图片

数据对齐方式 为 右对齐

stm32CubeMx 实现单通道ADC DMA采集_第6张图片

 

使能 连续转换模式,DMA连续请求

stm32CubeMx 实现单通道ADC DMA采集_第7张图片

 

设置采样次数 为 3个周期

 stm32CubeMx 实现单通道ADC DMA采集_第8张图片

 

配置 DMA

stm32CubeMx 实现单通道ADC DMA采集_第9张图片

Mode设置为Circular模式,数据宽度设置为Half Word  2个字节

 配置Project Manager

stm32CubeMx 实现单通道ADC DMA采集_第10张图片

设置好之后,点击GENERATE CODE 生成代码

 

定义变量

__IO uint16_t ADC_ConvertedValue[20];
__IO float ADC_Volt;

 

启动DMA数据传输 

HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_ConvertedValue[0], 20);

 

读取ADC数据

unsigned int i = 0, ADC_Value = 0;
for(i = 0; i < 20; ++i)
{
  ADC_Value += ADC_ConvertedValue[i];
}
ADC_Value = ADC_Value / 20;
printf("ADC Value %d\r\n",ADC_Value);
printf("vol %f\r\n", ADC_Value * 3.3 / 4096);

 三 :实验结果

 串口输出结果

stm32CubeMx 实现单通道ADC DMA采集_第11张图片

四: 实验中遇到的问题

  1 

 

 

最后一个参数一开始的时候写1,程序就出现了阻塞的现象。我分析可能是因为DMA选择的是Circular模式,会一直产生中断,从而使得CPU都被中断抢占了,因此将数据传输长度改为了20,每次对20个数据进行求均值计算,然后测试没有问题。

  2  关于采样周期

     采样周期 是否是越大越精准呢?  我把采样周期改大了之后,再进行测试,实验有待验证

    

转载于:https://www.cnblogs.com/birdBull/p/10792423.html

你可能感兴趣的:(stm32CubeMx 实现单通道ADC DMA采集)