STM32 H7系列ADC DMA模式过采样设置详解 cubeMX

最近做项目需要用H743的ADC采样,发现和M3及M4的差别还是蛮多的,MPU的配置对DMA读取数据的影响、过采样机制等,其中H7的硬件过采样是个很实用的东西,硬汉大佬也进行了测试:

STM32H7的ADC过采样功能立竿见影,效果的确不错 - STM32H7 - 硬汉嵌入式论坛 - Powered by Discuz! (armbbs.cn)

看了硬汉大佬的教程发现H7的ADC过采样讲的不多,我这里完善一下吧。其中很多都是我自己看cubeMX生成的工程源码中的注释和H7官方手册自己理解的,或许会有错误的地方,还请大佬们及时更正。废话不多说,直接上cubeMX。

1、配置RCC,这里有个注意的点,如果你要想将H7的主频提高到200MHZ以上要将Power Regulator Voltage Scale改成Scale 0,这个去看下手册就行,没什么可说的。

STM32 H7系列ADC DMA模式过采样设置详解 cubeMX_第1张图片

2、配置时钟树,项目使用12M的晶振,我配置的满频480MHZ。这里提一下,ADC可以有两个时钟源,具体看硬汉大佬的教程,我这里用的默认AHB,就什么也不用动。

STM32 H7系列ADC DMA模式过采样设置详解 cubeMX_第2张图片

3、MPU的配置,这里是按照硬汉大佬的教程中最适合新手的Normal模式来配置,如果使用了读写Cache性能会提升但是会出现DMA从SRAM中读出的ADC数据与Cache中的数据不一致,需要软件处理,我这里也是刚学H7,一知半解的状态,所以就直接使用了这种配置关闭了读写Cache。需要进一步研究的异步硬汉大佬的H7教程。

【安富莱】STM32H7用户手册发布,重在BSP驱动包设计方法,HAL库的框架学习,授人以渔,更新至95章(2022-04-11) - STM32H7 - 硬汉嵌入式论坛 - Powered by Discuz! (armbbs.cn)

STM32 H7系列ADC DMA模式过采样设置详解 cubeMX_第3张图片

4、开始配置ADC ,使用了ADC1的3、4、7三个通道,都是单端模式。

STM32 H7系列ADC DMA模式过采样设置详解 cubeMX_第4张图片

 5、一些基本配置,和F1、F4差不很多。

STM32 H7系列ADC DMA模式过采样设置详解 cubeMX_第5张图片

6、 这里就是我要讲的重点,过采样的设置。先看配置

STM32 H7系列ADC DMA模式过采样设置详解 cubeMX_第6张图片

使能过采样,没什么好说的。 

先说这个过采样率,手册上有说明H7系列支持2到1024倍的过采样,这个过采样率一定要设置成偶数,原因下一条讲,我是用的16倍过采样。

重点:过采样数据右移,这个就是最容易让人困惑的地方,过采样率的设置和数据的右移有什么关系呢?我们查看手册,发现H7的硬件过采样就是将每次过采样的数据累加起来,每一次的数据最大是2的16次方(16位ADC),如果采用最大的过采样率既1024倍过采样那么这些数值累加最大可以是2的16次方乘以1024,等于2的26次方,即占了存放数据寄存器从25到0的26个bit(原本一个数据15到0的16个bit),这里存放的是所有过采样数据的和,如何把这些和求平均数呢,当然就是除以过采样倍数,如何实现呢?数据右移!数据每右移一个bit,就相当于除以2,如果要除以16倍过采样,16是2的4次方,所以就是过采样数据之和右移4个bit,是不是很巧妙?此外手册中还指明所得的结果并不是直接舍弃最后一位,而是过采样数据之和除以过采样倍数后四舍五入的整数。

STM32 H7系列ADC DMA模式过采样设置详解 cubeMX_第7张图片

STM32 H7系列ADC DMA模式过采样设置详解 cubeMX_第8张图片 

再后面:规则组采样模式,选择连续模式, 连续模式是指如果有注入组ADC触发规则组过采样累加数据还是继续保留,等注入通道结束后继续过采样并计算。如果选择不连续模式,就是当有注入通道触发时原来规则组的过采样累加数据不再保留,等注入通道结束后重新开始过采样。这里没有用到注入通道,应该不影响。

已触发规则过采样这个选项设置选触发一次就进行全部的过采样,这里我也有一些困惑,看了手册大概意思应该是该通道每触发一次是进行这一次全部的过采样还是每触发一次就只进行一次过采样,意思就是说如果选择触发一次就进行全部的过采样那么这个通道的采样周期是不会变化的,原来1秒采集一个数据的话开了过采样还是一秒采集一个数据,只是这一秒内实际上是采集了16次的,而如果选择了每次过采样都需要一次触发那就成了本来1秒采集一个数据开了过采样后就变成了16秒采集一个数据。

7、后面就是和F1、F4同样的配置

STM32 H7系列ADC DMA模式过采样设置详解 cubeMX_第9张图片

STM32 H7系列ADC DMA模式过采样设置详解 cubeMX_第10张图片 

STM32 H7系列ADC DMA模式过采样设置详解 cubeMX_第11张图片 

STM32 H7系列ADC DMA模式过采样设置详解 cubeMX_第12张图片 

8、生成代码后和F1、F4系列一样直接调用函数 HAL_ADC_Start_DMA()可直接将数据存储到缓存区。

	//H7系列支持ADC校准,这里采用偏移校准(还可以选择线性校准,线性校准需要特定条件且
	//出厂时已校准过),单端输入(还可以选择差分输入)
	if(HAL_ADCEx_Calibration_Start(&hadc1,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED)!=HAL_OK)
	{
	  while(1);
	}

	//开启ADC的DMA,开启后会将各通道ADC原始值填充到对应数组中
	HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ADC_ROSA_Raw,3); 

你可能感兴趣的:(stm32,单片机,arm)