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

2020-09-21 13:00:31

簡述:運用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之前一定要進行校準,否則測量出來的值會有很大偏差。在在這裡我用到了傳輸完成中斷,所以關閉了另外的中斷。

處理結果可以用HAL_ADC_ConvCpltCallback()進行呼叫。也可以直接查詢標誌位。HAL_ADC_ConvCpltCallback()這個函數不僅adc中斷可以用 DMA傳輸也可以用。這個是在HAL_ADC_Start_DMA中設定已經設定好了。

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個通道結果都正確。