DMA在STM32中将ADC值存储在哪里?

时间:2019-03-08 07:01:12

标签: c arm embedded stm32 dma

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

4 个答案:

答案 0 :(得分:4)

DMA不管理内存,也不选择有效的地址来设置数据。一般来说,DMA允许在不使用CPU的情况下进行数据传输,但是仅此而已。


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

  • 内存记忆
  • 外设的内存
  • 外围记忆

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


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

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

答案 1 :(得分:3)

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

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

请注意,某些STM32部件的SRAM跨多个总线分配,其中一个部分比其他部分小得多。在此部分中保留DMA缓冲区会带来性能上的好处,因为它可以减少总线争用正常软件数据获取的时间。因此,您可能需要自定义链接描述文件,以创建段并将DMA缓冲区显式地放置在一个缓冲区中,同时不将应用程序数据放置在其中。

答案 2 :(得分:2)

如果您查看HAL文档和示例,会发现一个示例如何将ADC与DMA一起使用。

简而言之:

要开始转换,请使用以下功能:

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

其中pData是您的变量/数组,DMA应该将数据放在其中。

答案 3 :(得分:1)

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