1

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

4

1 回答 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 回答