STM32:DMA 如何将具有 3 个通道的 ADC 的值作为半字保存到缓冲区中?

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

我有一个配置了 1 个 ADC 和 2 个通道的 STM32L151RBT6。 ADC 配置为“扫描模式”和“连续模式”。 ADC 的分辨率为 12 位。 ADC 值保存在缓冲区中,其中数组的每个元素的大小都是 32 位。 DMA 将 ADC 值保存为半字,因此数组的每个元素都包含 2 个 ADC 值。所以,如果你放大一个元素,它看起来像这样:

MSB 0000 0000 0000 0000 0000 0000 0000 0000 LSB
    |--| |------------| |--| |------------|
    |    |              |    |
    |    |              |    |ADC CH0 Value
    |    |              |
    |    |              |Filler Bits
    |    |
    |    |ADC CH1 Value
    |
    | Filler Bits

请注意,每个值的大小只有 12 位,因为 ADC 分辨率为 12 位。

现在我的问题来了:如果我配置 3 个 ADC 通道而不降低分辨率,DMA 如何将 ADC 值保存到数组中?

这是我的 DMA 配置:

static uint32_t ADC_ConvertedValue[16];

HAL_ADC_Start_DMA(&hadc, ADC_ConvertedValue, 32);
embedded buffer stm32 dma adc
1个回答
0
投票

ADC/DMA 不关心您将数组定义为

uint32_t
的数组。它只需要一个内存地址(可能在 16 位边界上对齐),它就会将数据写入。你可以将它定义为一个
char
的数组,它同样会很高兴,只要对齐和大小还好。

由于您在 12 位模式下运行 ADC,并将样本存储为 16 位值,因此将数组定义为:

static uint16_t ADC_ConvertedValue[32];

然后您可以使用简单的数组索引访问样本,而不必手动从 32 位值中提取它们。

如果你坚持使用

uint32_t
,那么第一个数组成员将有来自通道0和1的样本,然后下一个数组成员将有来自通道2和0的样本,然后下一个将有1和2,等等。

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