首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DMA将ADC值存储在STM32中的什么位置?

DMA将ADC值存储在STM32中的什么位置?
EN

Stack Overflow用户
提问于 2019-03-08 15:01:12
回答 4查看 2K关注 0票数 2

我在CubeMX中启用了DMA外设对ADC1的内存传输,并生成了代码。然而,我对ADC中的数据将写入何处感到困惑?我应该显式定义一个变量来包含这个数据吗?如何检索DMA通道1 ISR中的数据?

EN

回答 4

Stack Overflow用户

发布于 2019-03-08 20:38:05

DMA既不管理内存,也不选择有效地址来设置数据。一般而言,DMA允许在不使用CPU的情况下进行数据传输,但不会更多。

STM32微控制器提供以下传输:

  • memory to memory
  • memory to peripheral
  • peripheral to memory

在所有这些配置中,开发人员必须了解它们的用途,以便配置(除DMA之外)源位置和目标位置,例如外围设备的地址、保留内存(以及哪种内存)等。

在您的特定情况下(检查RMANdocs等),模数转换器到存储器(外设到存储器)传输中的主要因素是:

DMA源: ADC外设,开发人员必须知道ADC外设的位置,并根据ADC参数配置(除ADC外)作为information.

  • Destination:内存的来源,开发人员必须预留一堆内存(堆/栈/全局/等),并根据已分配的内存空间配置
  • 。这样做,DMA将允许您以不同的方式设置值(取决于设备),例如连续环形缓冲区,一个周期,乒乓缓冲区(stm32使用术语“循环双缓冲区”)等。
  • DMA和模数转换器配置:有大量的因素,为了简单起见,我不打算包括,通常由制造商的硬件抽象层简化(它由你来使用它)。
票数 5
EN

Stack Overflow用户

发布于 2019-03-08 22:59:44

您指示HAL DMA ADC驱动程序在开始转换时将样本数据放在何处:

代码语言:javascript
复制
volatile uint32_t adcBuffer[SAMPLE_COUNT]; 
HAL_ADC_Start_DMA( &hadc, 
                   adcBuffer, 
                   SAMPLE_COUNT ); 

请注意,一些STM32部件将静态随机存储器划分为多条总线,其中一条总线的部分比其他总线小得多。将此部分保留给DMA缓冲区具有性能优势,因为它减少了与正常软件数据获取的总线争用。因此,您可能希望定制您的链接器脚本以创建节,并显式地将DMA缓冲区放入其中,同时排除应用程序数据在其中的放置。

票数 3
EN

Stack Overflow用户

发布于 2019-03-08 20:14:08

如果你看过HAL文档和例子,你会发现一个如何使用DMA的ADC的例子。

简而言之:

要开始转换,可以使用以下函数:

代码语言:javascript
复制
HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length);

其中pData是你的变量/数组,它应该把数据放在那里。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55058248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档