STM32 ADC DMA 双/多缓冲器示例

问题描述

根据文档,许多 STM32 支持双缓冲(或也称为多缓冲)模式下的 DMA。在 HAL 中,此功能有两个函数HAL_DMAEx_MultiBufferStart 文件中的 HAL_DMAEx_MultiBufferStart_ITstm32xxxx_hal_adc_ex。但是在任何 SDK(H7、F7、F4 等)中,都没有单独使用这两个函数的示例。如何让这个双缓冲 DMA 与 ADC 一起工作?

解决方法

我从来没有使用过你提到的双缓冲技术的功能。 我只是创建了一个缓冲区,它的大小是“正常”缓冲区的两倍,并使用 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”...