»
(005)HAL库认识DMA
(008)CubeIDE实现USB外设*
(018)C99 的指针*
(019)C99 只有值赋值,没有move*
(022)POSIX线程库pthread的同步锁*
(023)POSIX线程库pthread的多线程*
(027)C99标准库中的计时与等待 *
(028)C语言中的高精度计算库GMP *
(029)C语言中的Web服务*
(030)C语言中的字符转码ICU*
(031)从几个方面显然C语言比C++效率高*
今天开始琢磨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学习者共勉