微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

STM32 ADC DMA 双/多缓冲器示例

如何解决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”...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。