我有一个配置了 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);
ADC/DMA 不关心您将数组定义为
uint32_t
的数组。它只需要一个内存地址(可能在 16 位边界上对齐),它就会将数据写入。你可以将它定义为一个 char
的数组,它同样会很高兴,只要对齐和大小还好。
由于您在 12 位模式下运行 ADC,并将样本存储为 16 位值,因此将数组定义为:
static uint16_t ADC_ConvertedValue[32];
然后您可以使用简单的数组索引访问样本,而不必手动从 32 位值中提取它们。
如果你坚持使用
uint32_t
,那么第一个数组成员将有来自通道0和1的样本,然后下一个数组成员将有来自通道2和0的样本,然后下一个将有1和2,等等。