STM32H750VBTx 多通道ADC用DMA搬運的方法運用cubemax產生

簡述:運用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

相關文章
相關標籤/搜索