原创 STM32 ADC初始化函数,非使用STM32库方式。

2008-8-26 15:16 3551 6 6 分类: MCU/ 嵌入式

netjob @2008


http://bbs.21ic.com/club/bbs/bbsView.asp?


//=========================================================================
// ADC_Configuration(void)
//=========================================================================
void  STM32_ADC_Configuration(void)
{
 
        //ADC_InitTypeDef ADC_InitStructure;
        //GPIO_InitTypeDef GPIO_InitStructure;


   /* Configure PC.00 and PC.01 (ADC Channel10 and Channel11) as analog input */
   //GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0;//((u16)0x0010)
   //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//GPIO_Mode_AIN = 0x0,
 //GPIO_Init(GPIOC, &GPIO_InitStructure);


 STM32_Gpioc_Regs->crl.bit.CNF0=Analog_Input; // PC.0 模拟输入 ADC Channel10
 STM32_Gpioc_Regs->crl.bit.MODE0=Input_Mode; // PC.0 输入模式


 STM32_Gpioc_Regs->crl.bit.CNF1=Analog_Input; // PC.1 模拟输入 ADCChannel11
 STM32_Gpioc_Regs->crl.bit.MODE1=Input_Mode; // PC.1 输入模式



 /* Enable ADC1 clock */
   //RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
   STM32_Rcc_Regs->apb2enr.bit.ADC1EN=1;   // ADC1EN:ADC1时钟使能
   STM32_Rcc_Regs->apb2enr.bit.AFIOEN=1;


 /* reset the adc */
 // ADC_DeInit(ADC1);
   STM32_Rcc_Regs->apb2rstr.all |=  RCC_ADC1RST;
   STM32_Rcc_Regs->apb2rstr.all &= ~RCC_ADC1RST;
   
   /* Set the ADC Clock Divider */
   //RCC_ADCCLKConfig(RCC_PCLK2_Div6);
   /* ADCCLK = PCLK2/2     ADC转换速率:72M/2 = 36MHZ  */
  STM32_Rcc_Regs->cfgr.bit.ADCPRE=RCC_ADCPRE_PCLK2_DIV2_B; 


 


  /* 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_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
   //ADC_InitStructure.ADC_NbrOfChannel = 1;
   //ADC_Init(ADC1, &ADC_InitStructure);
      
   STM32_Adc1_Regs->cr1.bit.DUALMOD=0; //0000:独立模式 ADC_Mode_Independent
   STM32_Adc1_Regs->cr1.bit.SCAN=0;    //0:   关闭扫描模式 ADC_ScanConvMode = DISABLE
   
   STM32_Adc1_Regs->cr2.bit.CONTL=0; //0:单次转换模式
   STM32_Adc1_Regs->cr2.bit.CONTL=0; //0:单次转换模式  ContinuousConvMode = ENABLE
   STM32_Adc1_Regs->cr2.bit.EXTSEL=7;
   STM32_Adc1_Regs->cr2.bit.EXTTRIG=1;    //1:使用外部触发信号启动转换 ADC_ExternalTrigConv_None
   STM32_Adc1_Regs->cr2.bit.ALIGN=0;    //0:数据右对齐 ADC_DataAlign_Right   
 STM32_Adc1_Regs->sqr1.bit.L=0;    //   规则通道序列长度  0000:1个转换 ADC_NbrOfChannel = 1
 
           
   /* ADC1 regular channel10 configuration */
   //ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_55Cycles5);
 
 STM32_Adc1_Regs->sqr3.bit.SQ1=10;   // 规则序列中的第1个转换=ADC Channel11 
 STM32_Adc1_Regs->smpr1.bit.SMP10=_SampleTime_55Cycles5; // 通道11 的采样时间 
 //STM32_Adc1_Regs->sqr3.bit.SQ1=11;   // 规则序列中的第2个转换=ADC Channel14
 //STM32_Adc1_Regs->smpr1.bit.SMP11=_SampleTime_55Cycles5; // 通道14 的采样时间 


   /* Enable ADC1 DMA */
 //  ADC_DMACmd(ADC1, ENABLE);


   /* Enable ADC1 */
   //ADC_Cmd(ADC1, ENABLE);
   STM32_Adc1_Regs->cr2.bit.ADON=1;   //1:开启ADC并启动转换 当第一次设置ADON 位时,它将ADC 从断电状态下唤醒


   
   /* Enable ADC1 reset calibaration register */
   //ADC_ResetCalibration(ADC1);
   STM32_Adc1_Regs->cr2.bit.RSTCAL=1;   //复位校准 0:校准寄存器已初始化 1:初始化校准寄存器
   
   /* Check the end of ADC1 reset calibration register */
   //while(ADC_GetResetCalibrationStatus(ADC1));
   while( STM32_Adc1_Regs->cr2.bit.RSTCAL );//该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。
      
   /* Start ADC1 calibaration */
   //ADC_StartCalibration(ADC1);
   STM32_Adc1_Regs->cr2.bit.CAL=1;   //A/D校准 0:校准完成 1:开始校准
      
   /* Check the end of ADC1 calibration */
   //while(ADC_GetCalibrationStatus(ADC1));
   while(STM32_Adc1_Regs->cr2.bit.CAL);//该位由软件设置以开始校准,并在校准结束时由硬件清除
STM32_Adc1_Regs->cr2.bit.ADON=1;   //1:开启ADC并启动转换 当第一次设置ADON 位时,它将ADC 从断电状态下唤醒      
   /* Start ADC1 Software Conversion */
   //ADC_SoftwareStartConvCmd(ADC1, ENABLE);
 //STM32_Adc1_Regs->cr2.bit.SWSTART=1;// 开始转换规则通道
   
 do
        {
             //ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  STM32_Adc1_Regs->cr2.bit.SWSTART=1;// 开始转换规则通道
    
  //while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == RESET);
             while(!STM32_Adc1_Regs->sr.bit.EOC);//转换结束位  0:转换未完成 1:转换完成


            /* Get the conversion value */
           //ADC_ConvertedValue = ADC_GetConversionValue(ADC1);
           //ADC_ConvertedValue = (ADC1->DR);
           ADC_ConvertedValue =STM32_Adc1_Regs->dr.all;


            /* Clear the end of conversion flag */
            //ADC_ClearFlag(ADC1,ADC_FLAG_EOC);
            STM32_Adc1_Regs->sr.bit.EOC=0;// 上面读DR,就自动清零这位了!
 
     /* Start ADC1 Software Conversion */
      //ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    //STM32_Adc1_Regs->cr2.bit.SWSTART=1;// 开始转换规则通道
 
        }while (1);
    
}//end sub

文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /2 下一条