HAL库ADC的DMA采集

1.利用CubeMX配置ADC

(1)我这里用的是F103的芯片,配置PC4(ADC1_IN14)为检测引脚 ![](https://img2018.cnblogs.com/blog/1392333/201811/1392333-20181125164730793-951664517.jpg) (2)配置ADC时钟,要小于14MHz ![](https://img2018.cnblogs.com/blog/1392333/201811/1392333-20181125165138212-1519488127.jpg) (3)配置ADC参数,选择需要的模式,我这里只有一个通道 ![](https://img2018.cnblogs.com/blog/1392333/201811/1392333-20181125165834090-1964425162.jpg) (4)配置DMA,数据传递为外设到存储器,单次模式(转换完成后结束,再次使用需要重新开启),循环模式(连续转换),数据位选半字,外设地址不递增,内存地址看情况(这里选递增)。 ![](https://img2018.cnblogs.com/blog/1392333/201811/1392333-20181125171127915-690792802.jpg)

2.编程中用到的函数

HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length) //开启ADC的DMA转换,在这个函数里面,包含三个子函数HAL_ADC_Start,HAL_DMA_Start,SET_BIT(hadc1.Instance->CR2, ADC_CR2_DMA)(使能ADC的DMA功能,ADC_DMA_ENABLE) HAL_StatusTypeDef HAL_ADC_Stop_DMA(ADC_HandleTypeDef* hadc) //停止DMA的采集 注意:如果DMA采用的Normal模式,上面的两个函数都应该写进while里,如果采用的Circular模式,则只用在while外面写一次。另外,我用stm32l151芯片时,这两个函数必须成对出现才能采集到正确的数据,而用stm32f103时,则不需要使用HAL_ADC_Stop_DMA

3.代码实现

![](https://img2018.cnblogs.com/blog/1392333/201811/1392333-20181125194332429-1856597159.jpg)
![](https://img2018.cnblogs.com/blog/1392333/201811/1392333-20181125194341429-1684341836.jpg)

4.补充说明

如果程序阻塞在HAL_ADC_Start_DMA()里面,可能是一直再进DMA中断,可以将DMA的NVIC使能的代码注释掉,能够解决问题 ![](https://img2018.cnblogs.com/blog/1392333/201811/1392333-20181125194814512-2136130957.jpg)
原文地址:https://www.cnblogs.com/yf4695/p/10016351.html