ADC_多通道DAM传输

一、初始化DMA传输

	DMA_InitTypeDef DMA_InitStructure;					//定义结构体
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);			//开启DMA时钟
	
	DMA_DeInit(DMA1_Channel1);
	//决定数据从哪里来到哪里去
	DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&( ADC1->DR ));    //外设地址
	DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_Value;		   	//储存器地址
	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;			    	//传输方向
	//数据要传多少,传的单位是什么
	DMA_InitStructure.DMA_BufferSize = ADC_Count	;				//传输数目
	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;		//外设地址递增模式
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;				//储存器地址递增模式
	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;		//外设数据宽度
	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;	//储存器数据宽度
	
	DMA_InitStructure.DMA_Mode = DMA_Mode_Circular ;				//传输模式是否循环
	DMA_InitStructure.DMA_Priority = DMA_Priority_High;			//通道优先级
	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;						//储存器到储存器模式
	
	DMA_Init(DMA1_Channel1, &DMA_InitStructure);				//调用库函数将值写入
	
	DMA_ClearFlag(DMA1_FLAG_TC2);					//清除标志位

	DMA_Cmd(DMA1_Channel1, ENABLE);    	    			//DMA使能

二、ADC转换配置

	//转换规则               ADC号    通道号       转换顺序   取样时间
	ADC_RegularChannelConfig(ADC_x ,  ADC_Channel_10 , 1, ADC_SampleTime_55Cycles5);
	ADC_RegularChannelConfig(ADC_x ,  ADC_Channel_11 , 2, ADC_SampleTime_55Cycles5);
	ADC_RegularChannelConfig(ADC_x ,  ADC_Channel_12 , 3, ADC_SampleTime_55Cycles5);
	ADC_RegularChannelConfig(ADC_x ,  ADC_Channel_13 , 4, ADC_SampleTime_55Cycles5);
	ADC_RegularChannelConfig(ADC_x ,  ADC_Channel_14 , 5, ADC_SampleTime_55Cycles5);
	ADC_RegularChannelConfig(ADC_x ,  ADC_Channel_15 , 6, ADC_SampleTime_55Cycles5);

三、程序源码

1、bsp_adc.h文件

#ifndef __BSP_ADC_H
#define __BSP_ADC_H

#include "stm32f10x.h"


//ADC相关GPIO 时钟  外设
#define RCC_GPIO_CLOCK   		RCC_APB2PeriphClockCmd	
#define RCC_GPIO_PERIPH   	        RCC_APB2Periph_GPIOC

#define	GPIO_PORT			GPIOC

#define	GPIO_CH0_PIN				GPIO_Pin_0
#define	GPIO_CH1_PIN				GPIO_Pin_1
#define	GPIO_CH2_PIN				GPIO_Pin_2
#define	GPIO_CH3_PIN				GPIO_Pin_3
#define	GPIO_CH4_PIN				GPIO_Pin_4
#define	GPIO_CH5_PIN				GPIO_Pin_5


#define RCC_ADC_CLOCK   		RCC_APB2PeriphClockCmd
#define RCC_ADC_PERIPH   		RCC_APB2Periph_ADC1

#define ADC_x				ADC1
#define	ADC_Count			6

#define ADC_IRQn			ADC1_2_IRQn

void ADC_Init_Config(void);

#endif /* __BSP_ADC_H  */

2、bsp_adc.c文件

#include "bsp_adc.h"

__IO uint16_t ADC_Value[ADC_Count];

static void ADC_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_GPIO_CLOCK(RCC_GPIO_PERIPH,ENABLE);
	
	GPIO_InitStructure.GPIO_Pin=GPIO_CH0_PIN;
	GPIO_InitStructure.GPIO_Pin=GPIO_CH1_PIN;
	GPIO_InitStructure.GPIO_Pin=GPIO_CH2_PIN;
	GPIO_InitStructure.GPIO_Pin=GPIO_CH3_PIN;
	GPIO_InitStructure.GPIO_Pin=GPIO_CH4_PIN;
	GPIO_InitStructure.GPIO_Pin=GPIO_CH5_PIN;
													
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;			//模拟输入
	
	GPIO_Init(GPIO_PORT,&GPIO_InitStructure);
	
}



static void ADC_Mpde_Config(void)
{
	DMA_InitTypeDef DMA_InitStructure;					//定义结构体
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);			//开启DMA时钟
	
	DMA_DeInit(DMA1_Channel1);
	//决定数据从哪里来到哪里去
	DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&( ADC1->DR ));    //外设地址
	DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_Value;		  //储存器地址
	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;			    //传输方向
	//数据要传多少,传的单位是什么
	DMA_InitStructure.DMA_BufferSize = ADC_Count	;				//传输数目
	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;		//外设地址递增模式
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;				//储存器地址递增模式
	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;		//外设数据宽度
	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;	//储存器数据宽度
	
	DMA_InitStructure.DMA_Mode = DMA_Mode_Circular ;			//传输模式是否循环
	DMA_InitStructure.DMA_Priority = DMA_Priority_High;			//通道优先级
	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;				//储存器到储存器模式
	
	DMA_Init(DMA1_Channel1, &DMA_InitStructure);				//调用库函数将值写入
	
	DMA_ClearFlag(DMA1_FLAG_TC2);						//清除标志位

	DMA_Cmd(DMA1_Channel1, ENABLE);    	    				//DMA使能


	
	
	ADC_InitTypeDef ADC_InitStructure;					//ADC初始化结构体
	RCC_ADC_CLOCK(RCC_ADC_PERIPH,ENABLE);					//ADC时钟使能
	
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;			//模式 单通道模式
	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 = ADC_Count;				//通道数  1通道
	ADC_Init(ADC_x, &ADC_InitStructure);
	
	RCC_ADCCLKConfig(RCC_PCLK2_Div8);			//ADC时钟分频 72/8=9M
	//转换规则               ADC号    通道号       转换顺序   取样时间
	ADC_RegularChannelConfig(ADC_x ,  ADC_Channel_10 , 1, ADC_SampleTime_55Cycles5);
	ADC_RegularChannelConfig(ADC_x ,  ADC_Channel_11 , 2, ADC_SampleTime_55Cycles5);
	ADC_RegularChannelConfig(ADC_x ,  ADC_Channel_12 , 3, ADC_SampleTime_55Cycles5);
	ADC_RegularChannelConfig(ADC_x ,  ADC_Channel_13 , 4, ADC_SampleTime_55Cycles5);
	ADC_RegularChannelConfig(ADC_x ,  ADC_Channel_14 , 5, ADC_SampleTime_55Cycles5);
	ADC_RegularChannelConfig(ADC_x ,  ADC_Channel_15 , 6, ADC_SampleTime_55Cycles5);
	

	//ADC_ITConfig( ADC_x, ADC_IT_EOC,  ENABLE);			//ADC中断使能
	ADC_DMACmd( ADC_x, ENABLE);
	ADC_Cmd(ADC_x, ENABLE );
	
  // ADC开始校准
	ADC_StartCalibration(ADC_x);
	// 等待校准完成
	while(ADC_GetCalibrationStatus(ADC_x));
	
	ADC_SoftwareStartConvCmd( ADC_x, ENABLE);			//软件触发使能

}


void ADC_Init_Config(void)
{
//	DMA_AtoP_Config();				//DMA配置
	ADC_GPIO_Config();				//GPIO配置
	ADC_Mpde_Config();				//模式配置
	
}


3、main.c文件

#include "stm32f10x.h"   // 相当于51单片机中的  #include <reg51.h>
#include "bsp_led.h"
#include "usart.h"
#include "bsp_adc.h"

extern __IO uint16_t ADC_Value[ADC_Count];

float Value[ADC_Count];

void delay(u32 i)
{
	while(i--);
}


int main(void)
{	
	USART_config();
	ADC_Init_Config();
	
	printf("串口初始化成功\n");

  while(1)
	{
		Value[0]=(float)ADC_Value[0]/4096*3.3;
		Value[1]=(float)ADC_Value[1]/4096*3.3;
		Value[2]=(float)ADC_Value[2]/4096*3.3;
		Value[3]=(float)ADC_Value[3]/4096*3.3;
		Value[4]=(float)ADC_Value[4]/4096*3.3;
		Value[5]=(float)ADC_Value[5]/4096*3.3;
		
		printf("\n	CH0= %f V\n",Value[0]);
		printf("	CH1= %f V\n",Value[1]);
		printf("	CH2= %f V\n",Value[2]);
		printf("	CH3= %f V\n",Value[3]);
		printf("	CH4= %f V\n",Value[4]);
		printf("	CH5= %f V\n",Value[5]);


		delay(0X8FFFFF);
	}
}




  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值