STM32H750VBTx 多通道ADC用DMA搬运的方法运用cubemax产生

   日期:2020-09-23     浏览:553    评论:0    
核心提示:简述:运用dma搬运adc减少cpu消耗时间。Firmware Package:STM32Cube FW_H7 V1.8.0芯片:STM32H750VBT6此次,打开了adc的多个通道,使能了扫描模式。

简述:运用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 ;
//...此处省略
}

运行结果:

8个通道结果都正确。

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服