DMA在STM32中存储ADC值的位置在哪里?

问题描述 投票:1回答:4

我在CubeMX中为ADC1启用了DMA外设到内存传输并生成了代码。但是我对ADC的数据写入的位置感到困惑?我应该明确定义一个变量来包含这些数据吗?如何检索DMA通道1 ISR中的数据?

c arm embedded stm32 dma
4个回答
4
投票

DMA不管理内存,也不选择有效的地址来设置数据。一般来说,DMA允许数据传输而不使用CPU,但不再需要。


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

  • 记忆到记忆
  • 记忆到外围
  • 记忆的外围

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


在您的特定情况下(检查RMANdocs等),ADC到内存(外围到内存)传输的主要参与者是:

  • 来源:ADC外设,开发人员必须知道ADC外设的位置,并根据ADC参数配置(除ADC之外)DMA作为信息源。
  • 目标:内存,开发人员必须保留一堆内存(堆/堆栈/全局/等)并根据已分配的内存空间配置DMA。这样做,DMA将允许您以不同的方式设置值(取决于设备),例如连续环形缓冲区,一个周期,乒乓缓冲区(stm32使用术语“循环双缓冲区”)等。
  • DMA和ADC配置:有很多因素为了简单起见我不打算包括,通常由制造商的HAL简化(由您来决定)。

3
投票

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

volatile uint32_t adcBuffer[SAMPLE_COUNT]; 
HAL_ADC_Start_DMA( &hadc, 
                   adcBuffer, 
                   SAMPLE_COUNT ); 

请注意,某些STM32部件的SRAM分为多个总线,其中一个部分比其他部分小得多。在为DMA缓冲区保留此部分时,可以获得性能优势,因为它可以减少正常软件数据提取时的总线争用。因此,您可能希望自定义链接描述文件以创建节,并将DMA缓冲区显式放在一个,同时排除应用程序数据的位置。


2
投票

如果您查看HAL文档和示例,可以获得如何将ADC与DMA配合使用的示例。

简而言之 :

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

HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length);

其中pData是你的变量/数组,其中DMA应该放置数据。


1
投票

DMA和uC对变量一无所知。 DMA外设有两个配置寄存器,用于存储外设地址和存储器地址。如果你从阅读uC文档而不是HAL开始,一切都会立即显现

© www.soinside.com 2019 - 2024. All rights reserved.