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条评论)
登录后参与讨论