HAL库DMA单通道采集电压
时间: 2025-04-27 19:23:31 浏览: 17
### 使用 HAL 库通过 DMA 单通道实现电压采集
为了使用 STM32 的 HAL 库并通过 DMA 单通道完成电压采集,可以按照如下方法配置 ADC 和 DMA。STM32 微控制器系列提供了硬件支持来简化这一过程。
#### 配置 ADC 模块
ADC 初始化设置决定了采样时间和分辨率等参数。对于单次转换模式下的电压测量,需指定要使用的通道以及相应的采样时间[^1]:
```c
static void MX_ADC_Init(void)
{
/* USER CODE BEGIN ADC_Init 0 */
/* USER CODE END ADC_Init 0 */
hadc.Instance = ADC1;
hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
hadc.Init.Resolution = ADC_RESOLUTION_12B;
hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc.Init.ScanConvMode = DISABLE;
hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc.Init.LowPowerAutoWait = DISABLE;
hadc.Init.ContinuousConvMode = ENABLE;
hadc.Init.NbrOfConversion = 1;
hadc.Init.DiscontinuousConvMode = DISABLE;
hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc.Init.DMAContinuousRequests = ENABLE;
hadc.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
if (HAL_ADC_Init(&hadc) != HAL_OK)
{
Error_Handler();
}
}
```
#### 设置 DMA 控制器
DMA 请求应与特定的 ADC 转换事件关联起来,在初始化过程中定义传输方向、缓冲区地址以及其他必要的属性[^2]:
```c
static void MX_DMA_Init(void)
{
__HAL_RCC_DMA2_CLK_ENABLE();
hdma_adc.Instance = DMA2_Channel1;
hdma_adc.Init.Request = DMA_REQUEST_ADC1;
hdma_adc.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_adc.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_adc.Init.MemInc = DMA_MINC_ENABLE;
hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_adc.Init.Mode = DMA_CIRCULAR;
hdma_adc.Init.Priority = DMA_PRIORITY_HIGH;
hdma_adc.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
if (HAL_DMA_Init(&hdma_adc) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(&hadc, DMA_Handle, hdma_adc);
}
void StartADCVoltageSampling(uint16_t *pDataBuffer, uint16_t BufferSize)
{
HAL_ADC_Start_DMA(&hadc, (uint32_t*) pDataBuffer, BufferSize);
}
```
上述代码片段展示了如何利用 HAL 函数 `HAL_ADC_Start_DMA` 来启动基于 DMA 的连续数据获取操作,并将结果存储到预分配的数据缓存中。当启用循环模式 (`DMA_MODE_CIRCULAR`) 后,一旦达到设定数量的样本数,则会自动重头开始写入新读取的结果,非常适合实时监测应用场合[^3]。
阅读全文
相关推荐


















