我在CubeMX中为ADC1的内存传输启用了DMA外设,并生成了代码。但是,我对来自ADC的数据写入何处感到困惑?我应该明确定义一个变量来包含此数据吗?如何在DMA通道1 ISR中检索数据?
答案 0 :(得分:4)
DMA不管理内存,也不选择有效的地址来设置数据。一般来说,DMA允许在不使用CPU的情况下进行数据传输,但是仅此而已。
STM32微控制器提供以下方面的传输:
在所有这些产品中,开发人员必须了解它们的用途,以便配置(除了DMA之外)源和目标位置,例如外围设备的地址,备用内存(以及哪种内存)等
在您的特定情况下(检查RM,AN,docs等),ADC到内存(外围到内存)传输的主要参与者是:
答案 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开始,一切将立即清除