»
(005) HAL Library Understanding DMA
(008) CubeIDE Implementation of USB Peripherals*
(018) C99 pointer*
(019) C99 With only value assignment*
(022) POSIX pthread multi-threads mutex*
(023) POSIX pthread multi-threads programming*
(027) C99 time and wait*
(028) High-precision calculation with GMP*
(029) Web Service Lib*
(030) International Components for Unicode (ICU)*
(031) Performance of C is higher than C++, because...*
今天开始琢磨ADC与DMA的搭配。关键函数是:DMAx_Channelx_IRQHandler与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函数会调用的子函数,是指定的数据量转换完成后的回调函数。
总结调用过程就是:xxxxCpltCallback是全部完成后的钩子函数,DMAx_Channelx_IRQHandler是DMA单次传输结束的中断调用函数。
所以,第一,ADC与DMA通道的搭配,ADC事件每一批可以收集多次ADC转换结果;第二、DMA操作单次中断处理函数是DMAx_Channelx_IRQHandler,而ADC事件完成时会调用xxxxCpltCallback。同时需要注意的是:不能在中断处理函数中运行时间复杂度较高的程序代码。
————www.v-signon.com学习者共勉