根据文档,许多 STM32 支持双缓冲区(或也称为多缓冲区)模式下的 DMA。在 HAL 中,这个特性有两个函数:HAL_DMAEx_MultiBufferStart
和HAL_DMAEx_MultiBufferStart_IT
在stm32xxxx_hal_adc_ex
文件中。但在任何 SDK(H7、F7、F4 等)中,都没有使用这两个功能的单一示例。如何让这个双缓冲 DMA 与 ADC 一起工作?
问问题
1954 次
1 回答
0
我从来没有使用过你提到的双缓冲技术的功能。我只是创建一个缓冲区,它的大小是“正常”缓冲区的两倍,并使用 DMA 回调函数 HAL_ADC_ConvCpltCallback 和 HAL_ADC_ConvHalfCpltCallback 来决定需要处理缓冲区的哪一半。
在“HAL_ADC_ConvCpltCallback”中断上,处理双缓冲区的上半部分,而 ADC 在下半部分写入数据,反之亦然......
所以:如果我想以 100 个样本块的形式处理我的数据,我创建一个包含 200 个样本的缓冲区
uint32_t ADC_DMABuffer[ADC_DMABufferSize * 2];
并启动 ADC
HAL_ADC_Start_DMA(&hadc1, ADC_DMABuffer, ((uint32_t)(ADC_DMABufferSize * 2))); // Double Buffer
为了处理下半部分的数据,起始指针是
ADC_DMABuffer[0]
对于上半部分,开始指针是
ADC_DMABuffer[ADC_DMABufferSize]
需要处理的数据数量当然是“ADC_DMABufferSize”......
于 2021-01-30T21:28:12.123 回答