stm32g4 adc dma 长度
时间: 2025-02-25 20:09:01 浏览: 52
### 配置STM32G4系列微控制器中ADC与DMA配合使用的传输长度
对于STM32G4系列微控制器,在配置ADC与DMA协同工作时,确保正确设定传输长度至关重要。这涉及到初始化结构体`ADC_HandleTypeDef`以及DMA句柄的适当配置。
#### 初始化ADC并启用DMA功能
为了使能DMA用于ADC数据传输,需在ADC初始化过程中指定DMA作为转换完成后的处理方式:
```c
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 = ENABLE; // 启用扫描模式以支持多通道
hadc.Init.EOCSelection = ADC_EOC_SEQ_CONV; // 结束序列中的每次转换触发EOC事件
hadc.Init.LowPowerAutoWait = DISABLE;
hadc.Init.ContinuousConvMode = ENABLE; // 连续转换模式
hadc.Init.NbrOfConversion = 2; // 设置要连续转换的通道数量
hadc.Init.DiscontinuousConvMode = DISABLE;
hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc.Init.DMAContinuousRequests = ENABLE; // 开启持续请求以便于DMA操作
hadc.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
if (HAL_ADC_Init(&hadc) != HAL_OK){
Error_Handler();
}
```
上述代码片段展示了如何通过修改成员变量来调整ADC的行为特性[^1]。
#### 设定DMA传输参数
接着定义DMA句柄,并指明源地址(即ADC寄存器)、目标缓冲区地址、传输方向及单次事务大小等属性:
```c
hdma_adc.Instance = DMA1_Channel1;
hdma_adc.Init.Request = DMA_REQUEST_0;
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;
hdma_adc.Init.BufferSize = 2 * sizeof(uint16_t); // 基于所选分辨率计算所需字节数量
if (HAL_DMA_Init(&hdma_adc) != HAL_OK){
Error_Handler();
}
__HAL_LINKDMA(&hadc, DMA_Handle, hdma_adc);
```
这里特别注意的是`BufferSize`字段应等于预期接收样本数目乘以每样本占用的空间尺寸。由于选择了半字宽度(`HALFWORD`)存储格式,则每个采样点占据两个字节空间[^2]。
当采用循环模式(DMA_MODE_CIRCULAR),DMA会在达到预设边界后自动重定位到起始位置继续写入新到来的数据项;而一次性模式下则仅执行固定次数转移直至全部完成为止。
最后一步是关联已创建好的DMA实例至对应的外设对象上,从而建立起两者间的联系关系。
阅读全文
相关推荐


















