stm32f103adc多通道dma采集
时间: 2025-02-25 07:03:40 浏览: 70
### STM32F103 ADC 多通道 DMA 采集 示例代码与配置教程
#### 初始化硬件资源
为了使能多通道ADC并配合DMA工作,在初始化阶段需完成如下操作:
- 启用必要的时钟源,包括用于ADC外设及时钟树中的其他组件。
- 配置GPIO端口模式为模拟输入。
```c
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // Enable ADC clock
// Configure GPIO as analog input mode.
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; // Assuming channel 0 and 1 are used
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
```
#### 设置ADC参数
定义ADC的工作模式及其相关属性,比如扫描序列、连续转换模式等。这里采用轮询方式启动一次性的多通道读取过程[^1]。
```c
ADC_CommonInitTypeDef ADC_CommonInitStruct;
ADC_InitTypeDef ADC_InitStruct;
ADC_StructInit(&ADC_InitStruct);
ADC_InitStruct.ADC_ScanConvMode = ENABLE; // Enable scan conversion mode to read multiple channels sequentially
ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;// Disable continuous conversions initially
...
ADC_Init(ADC1, &ADC_InitStruct);
/* Common configuration */
ADC_CommonStructInit(&ADC_CommonInitStruct);
ADC_CommonInitStruct.ADC_Prescaler = ADC_Prescaler_Div2;
ADC_CommonInit(&ADC_CommonInitStruct);
```
#### 配置DMA控制器
指定DMA流的方向是从外设到内存,并设定缓冲区大小等于预期接收样本的数量;同时开启循环模式以便持续不断地获取新数据直到停止条件满足为止[^2]。
```c
DMA_InitTypeDef DMA_InitStruct;
DMA_DeInit(DMA1_Channel1);
DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&(ADC1->DR);
DMA_InitStruct.DMA_Memory0BaseAddr = (uint32_t)adcBuffer;
DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStruct.DMA_BufferSize = BUFFER_SIZE;
DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;
DMA_InitStruct.DMA.Priority = DMA_PRIORITY_HIGH;
DMA_InitStruct.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStruct.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
DMA_InitStruct.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStruct.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(DMA1_Channel1, &DMA_InitStruct);
DMA_Cmd(DMA1_Channel1, ENABLE);
```
#### 开始ADC-DMA会话
一旦上述准备工作就绪,则可以通过调用`ADC_Start_DMA()`函数来激活整个链路,从而允许自动化的数据捕获流程得以执行[^3]。
```c
ADC_DMACmd(ADC1, ENABLE);
ADC_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
```
以上即为针对STM32F103系列微控制器实施多通道ADC结合DMA技术的具体实施方案概述及相应编程接口说明[^4]。
阅读全文
相关推荐















