zoukankan      html  css  js  c++  java
  • 电子设计省赛--DMA与ADC

    //2014年4月17日

    //2014年6月20日入“未完毕”

    //2014年6月21日

    DMA可实现无需cpu控制中断的传输数据保存。

    特别是ADC转换多个通道时要用到。

    关键是DMA的使用方法,学长的实践告诉我:DMA是不用开中断的,就让它不停地转换,然后我须要时去读即可了。

    注:记得开ADC中DMA的使能!


    void DMA_Configuration(void)
    {
    	DMA_InitTypeDef DMA_InitStructure  ;
    	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);	
    /*******************************************************************************/	  
    	DMA_DeInit(DMA1_Channel1);
    /****************DMA1_Channel2->CCR=0x000035a4;********************************/  
    	DMA_InitStructure.DMA_PeripheralBaseAddr =(u32)( &(ADC1->DR));  //ADC1数据寄存器
     	DMA_InitStructure.DMA_MemoryBaseAddr = (u32)(&(ADC_U));     //获取ADC的数组 u16 ADC_U[1024];
     	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;     //片内外设作源头
     	DMA_InitStructure.DMA_BufferSize = 16;        //每次DMA1024个数据
     	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_Normal;        //普通模式
     	DMA_InitStructure.DMA_Priority = DMA_Priority_High;       //高优先级
     	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;        //非内存到内存
     	DMA_Init(DMA1_Channel1, &DMA_InitStructure);   
    /*****************DMA1_Channel6->CCR|=1;*****************************************/  
    	DMA_Cmd(DMA1_Channel1, ENABLE);	
    }

    void  ADC_Configuration(void)
    { 	
    	ADC_InitTypeDef ADC_InitStructure; 
    	GPIO_InitTypeDef GPIO_InitStructure;
    /*******************************************************************************/ 
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1	, ENABLE );	  //使能ADC1通道时钟 
    	RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //72M/6=12,ADC最大时间不能超过14M
             
    /*******************************************************************************/              
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;		//模拟输入引脚
    	GPIO_Init(GPIOA, &GPIO_InitStructure);	
    /*******************************************************************************/ 
    	ADC_DeInit(ADC1);  //将外设 ADC1 的所有寄存器重设为缺省值
    /*******************************************************************************/
    	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;	//ADC工作模式:ADC1和ADC2工作在独立模式
    	ADC_InitStructure.ADC_ScanConvMode = ENABLE;   	//模数转换工作在多通道模式
    	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;	//模数转换工作在单次转换模式
    	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	//转换由软件而不是外部触发启动
    	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;	//ADC数据右对齐
    	ADC_InitStructure.ADC_NbrOfChannel = 2;	//顺序进行规则转换的ADC通道的数目
    	ADC_Init(ADC1, &ADC_InitStructure);	//依据ADC_InitStruct中指定的參数初始化外设ADCx的寄存器
    /*****************************ADC_Channel_1 = GPIO_A1******************************************/   
     	ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5 );	//设置指定ADC的规则组通道,设置它们的转化顺序和採样时间
    	ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_239Cycles5 );
    /*******DMA  DMA  DMA  DMA  DMA  DMA  DMA  DM*******************************************/ 
    	<span style="color:#ff0000;">ADC_DMACmd(ADC1, ENABLE); //ADC命令,和DMA关联。</span>
    /*******************************************************************************/ 
    	ADC_Cmd(ADC1, ENABLE);	//使能指定的ADC1
    /*******************************************************************************/ 	
    	ADC_ResetCalibration(ADC1);	//重置指定的ADC1的校准寄存器
    	 
    	while(ADC_GetResetCalibrationStatus(ADC1));	//获取ADC1重置校准寄存器的状态,设置状态则等待
    /*******************************************************************************/ 	
    	ADC_StartCalibration(ADC1);		             //開始指定ADC1的校准状态
     
    	while(ADC_GetCalibrationStatus(ADC1));		//获取指定ADC1的校准程序,设置状态则等待
    /**********ADC2->CR2|=0x00500000;********************************************************/  
    	ADC_SoftwareStartConvCmd(ADC1, ENABLE);		//使能指定的ADC1的软件转换启动功能
    }



  • 相关阅读:
    jsp 特殊标签
    poj 1753 Flip Game 高斯消元 异或方程组 求最值
    zoj 3155 Street Lamp 高斯消元 异或方程组 求方案数
    poj1222 EXTENDED LIGHTS OUT 高斯消元解异或方程组 模板
    zoj 3930 Dice Notation 模拟
    zoj 3157 Weapon 线段树求逆序对数
    hdu 1242 Rescue BFS+优先队列
    hdu 3466 Proud Merchants 贪心+01背包
    zoj 3689 Digging 贪心+01背包
    hdu 2602 Bone Collector 01背包模板
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3827303.html
Copyright © 2011-2022 走看看