本文直接将参考文章附上STM32 ADC多通道转换DMA模式与非DMA模式两种方法(HAL库)并对ADC DMA配置中的一些参数进行介绍 参数配置文章
说明:文章在DMA多通道采样时,DMA配置的字长可以为半字,如下
hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
但是在调用 HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&adc_data,(uint32_t)2);
时,仍需将对应的第三个参数强制转换为32位格式。
下面对一些常用的配置参数进行解释
-
Scan Conversion Mode
(扫描模式):采用多通道必须开启,比如开了ch0,ch1,ch4,ch5。Ch0转换完以后就会自动转换通道1,4,5直到0、1、4、5都转换完就停止。但是这种连续性并不是不能被打断。这就引入了间断模式
Discontinuous Conversion Mode
,可以说是对扫描模式的一种补充。它可以把0,1,4,5这四个通道进行分组。可以分成0,1一组,4,5一组。也可以每个通道配置为一组。这样每一组转换之前都需要先触发一次。Discontinuous Conversion Mode
使能后number of Discontinous Conversions
是配置间断组每个组有几个通道的,这里必须配置为1(否则在获取ad值得时候只能读取到每个间断组最后一个通道)。 -
Continuous Conversion Mode
(连续转换模式):Stm32 ADC的单次模式和连续模式。这两中模式的概念是相对应的。这里的单次模式并不是指一个通道。假如你同时开了ch0,ch1,ch4,ch5这四个通道。单次模式转换模式下会把这四个通道采集一边就停止了。而连续模式就是这四个通道转换完以后再循环过来再从ch0开始(连续转换模式一般情况下配合扫描模式工作)。 -
**
DMA Continuous Requests
(DMA连续请求模式):**在main.c
中使用HAL_ADC_START_DMA(&hadc1,(xint32_t *)butter 100)
这个语句,使用ADC1和DMA,数据放入buffer数组内,放100个数据。如果DMA连续请求模式失能,这句语句传输完100个数据后自动关闭ADC1和DMA;反之使能后,语句执行完后又会连续从头开始传输数据,即buffer数组中的值一直在更新。 -
HAL_ADC_Start(&ADC1_Handler)
(开启ADC):注意和ADC转换函数区分,ADC转换函数分为阻塞型和非阻塞型.
在adc+dma多通道采集数据时可能会出现数据错位的情况,正常情况如下
数据错位情况
可能原因是:采样周期小,而数据长度短,使得转换过快,DMA还没读取就被覆盖了,需要把采样周期变长。
如把ADC_SAMPLETIME_3CYCLES改为ADC_SAMPLETIME_84CYCLE,即可将数据位归位
。