DCMI_DMA无异常时中断回调顺序
DCMI_DMA无异常时中断回调顺序
文章目录
DCMI_DMA无异常时中断回调顺序single buffer mode:double buffer mode:注意事项DCMI_DMA无异常时中断回调顺序
single buffer mode:
1)DMA传输一半中断回调:XferCpltCallback
需要在HAL_DCMI_Start_DMA()后手动添加赋值,HAL库HAL_DCMI_Start_DMA()中只初始化了传输完成回调XferCpltCallback = ADC_DMAConvCplt,在DMAx_Streamx_IRQHandler中调用
2)DMA传输完成中断回调:XferCpltCallback
HAL库HAL_DCMI_Start_DMA()中默认初始化了传输完成回调XferCpltCallback = ADC_DMAConvCplt,在DMAx_Streamx_IRQHandler中调用
3)DCMI帧中断:HAL_DCMI_FrameEventCallback
在2)中断处理完后,即刻在HAL_DCMI_IRQHandler中调用该回调
double buffer mode:
当传输的数据量 > 0xFFFFU时,HAL库中HAL_DCMI_Start_DMA()将使用double buffer mode:
1)DMA传输1/4中断回调:XferHalfCpltCallback
需要在HAL_DCMI_Start_DMA()启动后手动添加赋值,在DMAx_Streamx_IRQHandler中调用,此时所用buffer为buffer 0
2)DMA传输一半中断回调:XferCpltCallback
HAL库HAL_DCMI_Start_DMA()中默认初始化了传输完成回调XferCpltCallback = ADC_DMAConvCplt,在DMAx_Streamx_IRQHandler中调用,此时所用buffer为buffer 0,注意虽然此时调用XferCpltCallback,但是实际数据只传输了一半,剩下一半数据的传输将使用buffer 1
3)DMA传输3/4中断回调:XferM1HalfCpltCallback
需要在HAL_DCMI_Start_DMA()启动后手动添加赋值,在DMAx_Streamx_IRQHandler中调用,此时所用buffer为buffer 1
4)DMA传输完成中断回调:XferM1CpltCallback
HAL库HAL_DCMI_Start_DMA()中默认初始化了传输完成回调XferM1CpltCallback = ADC_DMAConvCplt,在DMAx_Streamx_IRQHandler中调用,使用双buffer时,XferM1CpltCallback才是传输完成中断回调,而不是XferCpltCallback
5)DCMI帧中断:HAL_DCMI_FrameEventCallback
在4)中断处理完后,即刻在HAL_DCMI_IRQHandler中调用该回调
注意事项
1)无论哪种buffer mode:XferCpltCallback和XferCpltCallback这两个回调都是代表buffer 0的回调,不同的是在不同的buffer mode中,使用buffer 0所传输的数据量:在single buffer mode中,所有数据均使用buffer 0传输,因此XferCpltCallback和XferCpltCallback就代表了传输所有数据的一半以及传输所有数据完成;而在double buffer mode中,仅使用buffer 0传输所有数据的一半,因此XferCpltCallback和XferCpltCallback代表传输所有数据的1/4以及传输所有数据的1/2,数据传输是先使用buffer 0;
2)如果应用程序中传输的数据量是需要修改,比如说你想采集的图片大小可调,则需要注意DMA需要传输的数据量是否需要使用双buffer,如果需要,则应注意是否需要修改相关回调。
如果觉得《STM32H7 DCMI DMA调试记录》对你有帮助,请点赞、收藏,并留下你的观点哦!