stm32 ADC多通道 dma 传输标准库函数代码 并注释
时间: 2023-08-18 10:05:22 浏览: 107
STM32Cubemx配置ADC多通道DMA转换,平均滤波算法
5星 · 资源好评率100%
好的,下面是 STM32 ADC 多通道 DMA 传输标准库函数代码及注释:
```c
#include "stm32f10x.h"
#include "stdio.h"
#include "stm32f10x_adc.h"
#include "stm32f10x_dma.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#define ADC1_DR_Address ((u32)0x4001244C) // 定义ADC1数据寄存器地址
__IO uint16_t ADC_ConvertedValue[3]; // 存储ADC转换后的值
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
RCC_ADCCLKConfig(RCC_PCLK2_Div6); // ADC时钟设置为PCLK2的6分频,即72/6=12MHz
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); // 使能DMA1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE); // 使能ADC1和GPIOA时钟
// 配置ADC1通道8、9和10的对应GPIO引脚为模拟输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// DMA1通道1配置
DMA_DeInit(DMA1_Channel1); // 将DMA1通道1的所有寄存器重置为缺省值
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; // DMA外设ADC数据寄存器地址
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_ConvertedValue; // DMA内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; // 数据传输方向,从外设到内存
DMA_InitStructure.DMA_BufferSize = 3; // DMA通道的DMA缓存大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 外设地址寄存器不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // 内存地址寄存器递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; // 数据宽度为半字,即16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; // 数据宽度为半字,即16位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // 工作在循环缓存模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High; // DMA通道 x拥有高优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // DMA通道x没有设置为内存到内存传输
DMA_Init(DMA1_Channel1, &DMA_InitStructure); // 根据DMA_InitStruct中指定的参数初始化DMA的通道x
// ADC1配置
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // ADC工作在独立模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE; // 扫描模式使能,扫描模式下,ADC可以转换多个通道
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; // 连续转换模式使能,即不停地转换多个通道
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 3; // 一共有3个通道需要转换
ADC_Init(ADC1, &ADC_InitStructure); // 根据ADC_InitStruct中指定的参数初始化ADCx
// ADC1通道0、1、2配置
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); // ADC1通道0、采样时间为55.5周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5); // ADC1通道1、采样时间为55.5周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5); // ADC1通道2、采样时间为55.5周期
ADC_DMACmd(ADC1, ENABLE); // 使能ADC1的DMA传输
ADC_Cmd(ADC1, ENABLE); // 使能ADC1
DMA_Cmd(DMA1_Channel1, ENABLE); // 使能DMA1通道1
while (1)
{
printf("ADC1_Channel_0=%d", ADC_ConvertedValue[0]);
printf("ADC1_Channel_1=%d", ADC_ConvertedValue[1]);
printf("ADC1_Channel_2=%d", ADC_ConvertedValue[2]);
}
}
```
注释已经在代码中添加,主要包括以下几个部分:
1. 定义 ADC1 数据寄存器地址 `ADC1_DR_Address`;
2. 定义存储 ADC 转换后的值的数组 `ADC_ConvertedValue`;
3. 初始化 ADC1、GPIOA 和 DMA1;
4. 配置 DMA1 通道1;
5. 配置 ADC1;
6. 配置 ADC1 的通道0、1和2;
7. 使能 ADC1 和 DMA1;
8. 循环读取 ADC 转换后的值并打印输出。
需要注意的是,该代码是基于 STM32F10x 标准库进行开发的,如果您使用的是其他型号的 STM32 微控制器或者使用的是 HAL 库或其他库,则需要根据具体情况进行修改。
阅读全文