zoukankan      html  css  js  c++  java
  • stm32f103 adc1 与DMA的结合方式应用实例

    #define		ADC1_Chanel0	0	
    #define		ADC1_Chanel1	1	
    #define		ADC1_Chanel2	2	
    #define		ADC1_Chanel3	3	
    #define		ADC1_Chanel4	4	
    #define		ADC1_Chanel5	5	
    #define		ADC1_Chanel6	6	
    #define		ADC1_Chanel7	7	
    #define		ADC1_Chanel8	8	
    #define		ADC1_Chanel9	9	
    #define		ADC1_Chanel10	10	
    #define		ADC1_Chanel11	11	
    #define		ADC1_Chanel12	12	
    #define		ADC1_Chanel13	13	
    #define		ADC1_Chanel14	14	
    #define		ADC1_Chanel15	15	
    #define		ADC1_Chanel16	16	
    
    //====AD开启通道个数======================
    #define		ADC_ENB_NUM		1
    
    #define	 ADC_CYC_Cycles5	 ADC_SampleTime_55Cycles5  //设置AD转换速率
    
    
    
    uint16_t AD_Value[ADC_ENB_NUM] ; //DMA存储数据的区域
    
    #define ADC1_DR_Address    ((uint32_t)0x4001244C)	 //ADC1数据寄存器的基地址
    
    
    //*************************************
    // 函数名称:ADC1_Config
    // 函数功能:adc1 初始化配置
    // 入口参数:无
    // 出口参数:无
    // 返 回 值:无
    //***************************************/
    void ADC1_Config(void)
    {
    	ADC_InitTypeDef ADC_InitStructure;
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE);	  //使能ADC
    	/* DMA1 channel1 configuration ----------------------------------------------*/
    	
    	RCC_ADCCLKConfig(RCC_PCLK2_Div6) ; //ADC时钟分频 72/6 = 12M
    		
    	/* ADC1 configuration ------------------------------------------------------*/
    	
    	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外部开关,关闭状态
    	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;   //对齐方式,ADC为12位中,右对齐方式
    	ADC_InitStructure.ADC_NbrOfChannel = ADC_ENB_NUM;	 //开启通道数,1个
    	ADC_Init(ADC1, &ADC_InitStructure);
    	
    	/* ADC1 regular channel9 configuration */ 
    	//ADC通道组,第9个通道 采样顺序1,转换时间  
    	ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 1, ADC_CYC_Cycles5); 
    	 
    //	ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 2, ADC_SampleTime_55Cycles5);  
    
    	
    	ADC_DMACmd(ADC1, ENABLE);	  //ADC命令,使能
    	ADC_Cmd(ADC1, ENABLE);  //开启ADC1
    	ADC_ResetCalibration(ADC1);	  //重新校准
    	while(ADC_GetResetCalibrationStatus(ADC1));  //等待重新校准完成
    	ADC_StartCalibration(ADC1);		//开始校准
    	while(ADC_GetCalibrationStatus(ADC1));	   //等待校准完成
    	ADC_SoftwareStartConvCmd(ADC1, ENABLE);	//连续转换开始,ADC通过DMA方式不断的更新RAM区。
    	//  ADC_TempSensorVrefintCmd(ENABLE);
    }
    
    //*************************************
    // 函数名称:DMA_Config_ADC1
    // 函数功能:DMA 初始化配置
    // 入口参数:无
    // 出口参数:无
    // 返 回 值:无
    //***************************************/
    void DMA_Config_ADC1(void)
    {
    	DMA_InitTypeDef DMA_InitStructure;
    	
    	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);		 //使能DMA时钟
    	DMA_DeInit(DMA1_Channel1);		  //开启DMA1的第一通道
    	DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //DMA对应的外设基地址
    	DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&AD_Value[0];//内存存储基地址 自己开僻的数组
    	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//DMA的转换模式为SRC模式,由外设搬移到内存
    	DMA_InitStructure.DMA_BufferSize = Num_Adc_Chanel; //DMA缓存大小,N个
    	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;  //DMA搬移数据尺寸,HalfWord就是为16位
    	DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;   //转换模式,循环缓存模式。
    	DMA_InitStructure.DMA_Priority = DMA_Priority_High;	//DMA优先级高
    	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;		  //M2M模式禁用
    	DMA_Init(DMA1_Channel1, &DMA_InitStructure);          
    	
    	/* Enable DMA1 channel1 */
    	DMA_Cmd(DMA1_Channel1, ENABLE);
    }
    //===ADC GPIO 初始化=======
    void ADC1_GPIOInit(void)
    {
    //-----------PB---------------------------------
    	//VR 端口 PB1
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;  //管脚1
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//50M时钟速度
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;			 //输入模式
    	GPIO_Init(GPIOB, &GPIO_InitStructure);	
    
    }
    
    
    //====实例应用=======
    
        //ADC1初始化设置
    	ADC1_GPIOInit() ;
    	ADC1_Config() ;
    	DMA_Config_ADC1() ;	//dma设置
    
    //--主程序-----
    void mian(void)
    {
    	while(1)
    	{
    		while(!F_10MS);
    		F_10MS = 0 ;
    
    		Tmp = AD_Value[0] ; //在缓存区中 读取AD结果 
    
    	}
    		
    }


  • 相关阅读:
    LightOJ 1422 Halloween Costumes(区间dp)
    zoj 3537 Cake(区间dp)
    POJ 2955 Brackets(区间dp)
    HDU 1058 Humble Numbers(dp)
    uva 10934 Dropping water balloons(转载)
    树形dp
    Manacher算法求回文半径
    poj-1236.network of schools(强连通分量 + 图的入度出度)
    hdu-2255.奔小康赚大钱(最大权二分匹配)
    poj-2289.jamies contact groups(二分答案 + 二分多重匹配)
  • 原文地址:https://www.cnblogs.com/bbsno1/p/3253516.html
Copyright © 2011-2022 走看看