簡述:運用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個通道結果都正確,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/108687.html
標籤:其他
