»
(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函数会调用的子函数,是全局中断的回调函数,也就是ADC_DMA单次转换完成的回调函数。 总结调用过程就是:xxxxCpltCallback是单字节转换完成的钩子函数,DMAx_Channelx_IRQHandler是DMA全部传输完成(TCx时)才会中断的函数。 所以,第一,ADC与DMA通道的搭配,DMA通道可以收集多次ADC转换结果;第二、DMA通道满载中断处理函数是DMAx_Channelx_IRQHandler,在Channel满载处理函数钟,首先要做的就是拷贝走DMA通道目标存储区域的数据,其次再做数据的处理;第三、不能在中断处理函数中运行时间复杂度较高的程序代码。 ————www.v-signon.com学习者共勉