HAL_ADC_Start_DMA_NoIT
时间: 2025-05-22 22:35:46 浏览: 18
### 使用 HAL 库通过 DMA 启动 ADC 转换而不依赖中断
为了实现不使用中断而仅依靠 DMA 来启动 ADC 的转换,可以按照以下方法完成配置:
#### 配置 ADC 和 DMA
在初始化阶段,需要正确设置 ADC 和 DMA 参数。以下是主要的配置要点:
- **ADC 初始化**
设置 ADC 的工作模式为连续转换模式,并启用扫描功能以便支持多个通道的数据采集[^1]。
- **DMA 初始化**
将 DMA 配置为循环模式 (Circular Mode),这样可以在每次转换完成后自动将数据写入指定缓冲区并重新开始下一次传输[^3]。
```c
// 定义用于存储 ADC 数据的数组
uint16_t aADCDMAConvertedData[BUFFER_SIZE];
// 创建 DMA 句柄结构体实例
static DMA_HandleTypeDef hdma_adc;
void MX_ADC_Init(void)
{
// 初始化 ADC 结构体参数...
hadc.Instance = ADCx;
// 配置 ADC 工作于连续转换模式以及扫描序列下的多通道采样
hadc.Init.ContinuousConvMode = ENABLE;
hadc.Init.ScanConvMode = ENABLE;
// 更多其他必要的初始化选项...
if(HAL_ADC_Init(&hadc)!=HAL_OK){
Error_Handler();
}
__HAL_LINKDMA(&hadc,DMA_Handle,&hdma_adc);
}
void MX_DMA_Init(void)
{
// 配置 DMA 控制器句柄
hdma_adc.Instance = DMA_STREAM_CHANNEL;
hdma_adc.Init.Request = DMA_REQUEST_ADC;
hdma_adc.Init.Direction = MEMORY_TO_PERIPH;
hdma_adc.Init.PeriphInc = DISABLE;
hdma_adc.Init.MemInc = 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;
if(HAL_DMA_Init(&hdma_adc) != HAL_OK ){
Error_Handler();
}
}
```
上述代码片段展示了如何定义一个 `aADCDMAConvertedData` 数组来保存由 DMA 自动获取到的 ADC 值,并设置了相应的 DMA 流程控制属性以匹配目标硬件需求[^2]。
#### 开始 ADC 并绑定 DMA
一旦完成了以上两步的基础设定之后,则可以通过调用函数 `HAL_ADC_Start_DMA()` 方法正式启动 ADC 进行测量操作:
```c
if(HAL_ADC_Start_DMA(&hadc, (uint32_t*)aADCDMAConvertedData,BUFFER_SIZE)!=HAL_OK){
Error_Handler();
}
```
此命令会触发第一次 ADC 转化请求并通过预先建立好的 DMA 渠道把结果传送到内存中的特定位置上去.
需要注意的是,在这种情况下由于启用了 circular mode 所以只要电源供应正常那么这个过程就会一直持续下去直到手动停止它为止.
#### 处理接收到的数据
因为没有采用任何形式的 interrupt service routine(ISR),所以应用程序必须定期轮询或者利用某种同步机制去检查是否有新的样本可供处理.一种简单的方式就是维护一个全局标志位指示当前批次是否已经被完全填充完毕然后再做进一步分析计算等工作.
---
###
阅读全文
相关推荐


















