簡述:運用dma搬運adc減小cpu消耗時間。
IDE: KEILv5.27
Firmware Package:STM32Cube FW_H7 V1.8.0
芯片:STM32H750VBT6
主要配置Data Management Mode爲DMA Circular Mode。對於STM32H7的DMA能夠自主選擇通道。
DMA配置循環模式 內存地址增長 數據長度半字(只開起ADC1)
中斷配置能夠不用改變
函數
//在主函數內加入以下語句打開ADC 開始DMA傳送 HAL_ADCEx_Calibration_Start(&hadc1,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED); HAL_ADCEx_Calibration_Start(&hadc1,ADC_CALIB_OFFSET_LINEARITY,ADC_SINGLE_ENDED); HAL_ADC_Start_DMA(&hadc1,(uint32_t *)adcbuffer,ADC_CHANNEL_NUM*ADC_TIMES); __HAL_DMA_ENABLE_IT(&hdma_adc1,DMA_IT_TC); __HAL_DMA_DISABLE_IT(&hdma_adc1,DMA_IT_TE); __HAL_DMA_DISABLE_IT(&hdma_adc1,DMA_IT_HT); __HAL_DMA_DISABLE_IT(&hdma_adc1,DMA_IT_DME);
在開啓adc以前必定要進行校準,不然測量出來的值會有很大誤差。在在這裏我用到了傳輸完成中斷,因此關閉了另外的中斷。ui
處理結果能夠用HAL_ADC_ConvCpltCallback()進行調用。也能夠直接查詢標誌位。HAL_ADC_ConvCpltCallback()這個函數不只adc中斷能夠用 DMA傳輸也能夠用。這個是在HAL_ADC_Start_DMA中配置已經配置好了。spa
HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef *hadc, uint32_t *pData, uint32_t Length) { //...此處省略 hadc->DMA_Handle->XferCpltCallback = ADC_DMAConvCplt; //...此處省略 } //在ADC_DMAConvCplt()中調用了HAL_ADC_ConvCpltCallback() void ADC_DMAConvCplt(DMA_HandleTypeDef *hdma) { //...此處省略 #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1) hadc->ConvCpltCallback(hadc); #else HAL_ADC_ConvCpltCallback(hadc); #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */; //...此處省略 }
運行結果:
8個通道結果都正確。
3d