ADC采集数据(DMA模式)

ADC采集数据(DMA模式)

        写这篇文章,也是自己参考了一些书籍,加上自己的感悟总结之后写出来的。正所谓天下文章一大抄,取个文雅的名字叫模仿、借鉴、参考。不过这也是一种学习的方法,我想你看我这篇文章也是这个目的吧!但是我要说,学来的东西总要有自己的体会和感悟,不能让自己的脑袋成了别人的跑马场不是!好了,废话不多说,直接上程序(程序有注释,可以参考)。

adc.h文件

#ifndef __ADC_H
#define __ADC_H

#include "stm32f10x.h"
#define ADC1_DR_Address ((u32)0x40012400+0x4c)

void ADC_Config(void);

#endif


adc.c文件

#include "adc.h"

__IO uint16_t ADC_ConvertedValue[3];//分别存储AD三个通道的采样值
void ADC_Config()
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef  ADC_InitStructure;
DMA_InitTypeDef  DMA_Initstructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//使能DMA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC , ENABLE );
//配置外设AD对应IO
GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//模拟输入模式
GPIO_Init(GPIOA , &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC , &GPIO_InitStructure);

DMA_DeInit(DMA1_Channel1);//ADC1对应的DMA通道数
DMA_Initstructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;//外设AD的地址数据寄存器地址,数据手册上有
DMA_Initstructure.DMA_MemoryBaseAddr = (u32)ADC_ConvertedValue;//内存地址,就是你想要把采样值存在那个变量的地址
DMA_Initstructure.DMA_DIR = DMA_DIR_PeripheralSRC ;//方向(从外设到内存)
DMA_Initstructure.DMA_BufferSize = 3;//几个通道,几个开辟连续的DMA存储单元
DMA_Initstructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable ;//外设地址不变
DMA_Initstructure.DMA_MemoryInc = DMA_MemoryInc_Enable ;//内存地址自增,因为3个通道嘛
DMA_Initstructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord ;//设置外设数据长度为半字,即16位
DMA_Initstructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord ;//设置DMA存储数据长度为半字,即16位
DMA_Initstructure.DMA_Mode = DMA_Mode_Circular ;//循环模式
DMA_Initstructure.DMA_Priority = DMA_Priority_VeryHigh ;//优先级
DMA_Initstructure.DMA_M2M = DMA_M2M_Disable ;
DMA_Init(DMA1_Channel1 , &DMA_Initstructure  );
DMA_Cmd(DMA1_Channel1 , ENABLE );

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent ;//独立模式,不是多个AD共用一个通道
ADC_InitStructure.ADC_ScanConvMode = ENABLE ;//开启扫描模式,针对多通道时
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE ;//开启连续转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None ;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right ;//数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 3;//打来的ADC通道数目
ADC_Init(ADC1, &ADC_InitStructure );	

RCC_ADCCLKConfig(RCC_PCLK2_Div6);//配置ADC时钟,为PCLK2的6分频,即12Mhz
ADC_RegularChannelConfig(ADC1 , ADC_Channel_1 , 1 , ADC_SampleTime_1Cycles5 );//设置AD采集扫描顺序和采样周期为1.5ADC的时钟周期
ADC_RegularChannelConfig(ADC1 , ADC_Channel_2 , 2 , ADC_SampleTime_1Cycles5 );//所以ADC的转换速率为(1.5+12.5)/12=1.167us
ADC_RegularChannelConfig(ADC1 , ADC_Channel_15 , 3 , ADC_SampleTime_1Cycles5 );

ADC_DMACmd(ADC1 , ENABLE );//使能AD DMA
ADC_Cmd(ADC1 , ENABLE );
//AD校验
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));

ADC_SoftwareStartConvCmd(ADC1 , ENABLE );//采用软件触发方式
}

    用的时候只要在所引用的文件中声明外部变量即可,即extern  __IO uint16_t  ADC_ConvertedValue[3];
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值