STM32实验及结果 —— (005)HAL库认识DMA
»
    今天开始琢磨ADC与DMA的搭配。关键函数是:HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&dma1_adc1_storage_zone, 35714/2);。
    DMA是自动的数据搬运很有印象。但,一直认为DMA做的事情是所有次数的ADC操作完成后再做一次数据的迁移。而这个认识是错误的。
    正确的理解是:ADC的电路每次完成数据读取后,就需要把数据搬运走。因为,ADC中没有内存。所以,如果配置了DMA,ADC的每一次完成数据读取都会请求DMA硬件搬运ADC硬件上的一次转换结果到内存。而,这个ADC请求DMA的过程不需要CPU参与,这就是DMA的电路做的事情。
    而咱们程序中写的HAL_ADC_ConvCpltCallback函数是ADC_DMAConvCplt函数会调用的子函数,是DMA通道全局中断的处理函数,也就是ADC批量转换全部完成回调函数,也就是DMA通道内存满载的中断函数,是用来在DMA通道的目标数据存储区域满载时通知用户让用户及时处理已经满载的数据的函数。

    总结调用过程就是:ADC不断转换并通过DMA通道填写数值到内存 -> DMA通道指向的内存满载 -> 中断、调用处理函数ADC_DMAConvCplt -> 调用HAL_ADC_ConvCpltCallback -> 让用户及时处理DMA通道已经满载的数据。

    所以,第一,ADC与DMA通道的搭配,DMA通道可以收集无数多次ADC转换结果;第二、DMA通道满载中断请求中,首先要做的就是拷贝走DMA通道目标存储区域的数据,其次再做数据的处理;第三、不能在中断处理函数中运行时间复杂度较高的程序代码。
    ————www.v-signon.com学习者共勉
                        
«
——张人杰·www.v-signon.com学习者共勉
返回上一页
工业和信息化部备案管理系统网站 京ICP备19038994号-2
个人作品网站:www.up-task.com 主办单位:个人 English