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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM