问题描述
我有一个应用程序,它必须控制阵列 32x32 元素的 ADC 读数。 对于每个元素,我必须选择点 - 读取 ADC - 关闭 ADC。目前我正在使用像 LED 扫描这样的扫描方法。对于每次扫描,我读取 1 点。然后将该值存入数组并传输。
但是,我发现这很慢。我想用 DMA 来自动化这个读取,然后我需要做的就是传递它。 有没有办法做到这一点?
解决方法
我不太明白你的问题。
假设您想从 ADC MCU 输入引脚上的外部信号读取数据。
我首先推荐你,ADC 读取数据的两种解决方案:
- 在连续模式下配置您的 ADC。
- 在单模式下配置您的 ADC,并配置另一个外设(如定时器),该外设将触发 ADC 在每个事件中启动转换。
其次,有两种不同的方式来管理转换后的数据:
-
在 ADC 的每次转换结束中断后,您可以手动存储数据并完成您的工作。
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef AdcHandle) { / 获取常规通道的转换值 */ uhADCxConvertedValue = HAL_ADC_GetValue(AdcHandle); }
-
配置一个 DMA 处理程序,它将处理 ADC 转换的数据并将其自动存储在 RAM 中,无需 CPU 干预。 #define ADC_CONVERTED_DATA_BUFFER_SIZE ((uint32_t) 32) /* 数组大小 aADCxConvertedData[] */
静态 uint16_t aADCxConvertedData[ADC_CONVERTED_DATA_BUFFER_SIZE];
HAL_ADC_Start_DMA(&AdcHandle,uint32_t *)aADCxConvertedData,ADC_CONVERTED_DATA_BUFFER_SIZE
您会在参考手册中找到很多详细信息。