我在CubeMX中为ADC1启用了DMA外设到内存传输并生成了代码。但是我对ADC的数据写入的位置感到困惑?我应该明确定义一个变量来包含这些数据吗?如何检索DMA通道1 ISR中的数据?
DMA不管理内存,也不选择有效的地址来设置数据。一般来说,DMA允许数据传输而不使用CPU,但不再需要。
STM32微控制器提供以下传输:
在所有这些中,开发人员必须了解它们的目的,以便配置(除了DMA)源和目标位置,例如外围设备的地址,保留内存(以及什么样的内存)等。
在您的特定情况下(检查RM,AN,docs等),ADC到内存(外围到内存)传输的主要参与者是:
您指示HAL DMA ADC驱动程序在开始转换时将样本数据放在何处:
volatile uint32_t adcBuffer[SAMPLE_COUNT];
HAL_ADC_Start_DMA( &hadc,
adcBuffer,
SAMPLE_COUNT );
请注意,某些STM32部件的SRAM分为多个总线,其中一个部分比其他部分小得多。在为DMA缓冲区保留此部分时,可以获得性能优势,因为它可以减少正常软件数据提取时的总线争用。因此,您可能希望自定义链接描述文件以创建节,并将DMA缓冲区显式放在一个,同时排除应用程序数据的位置。
如果您查看HAL文档和示例,可以获得如何将ADC与DMA配合使用的示例。
简而言之 :
要开始转换,请使用以下函数:
HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length);
其中pData是你的变量/数组,其中DMA应该放置数据。
DMA和uC对变量一无所知。 DMA外设有两个配置寄存器,用于存储外设地址和存储器地址。如果你从阅读uC文档而不是HAL开始,一切都会立即显现