void ADC1_Init(u8 ADC_Channel)
{
ADC_InitTypeDef ADC_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //六分频后作为AD时钟。 RCC_CFGR |= 0x00008000;
/* Enable DMA clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//开启dma时钟。 RCC_AHBENR |= 0x00000001
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //RCC_APB2ENR |= 0x00000e00;
/* Enable ADC2 clock */
ADC_DeInit(ADC1);
/* ADC2 registers reset ----------------------------------------------------*/
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE); //开启ADC1
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //转换模式,为独立转换。转换模式太多了,以后深究
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //对齐方式,ADC 结果是 12 位的,显然有个对齐左边还是右边的问题。一般是右对齐
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //连续转换模式开启
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //ADC 外部出发开关,关闭
ADC_InitStructure.ADC_NbrOfChannel = 1; //开启通道数,2 个
ADC_InitStructure.ADC_ScanConvMode = ENABLE; //扫描转换模式开启
ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_239Cycles5); //规则组通道设置,关键函数 转换器 ADC1,选择哪个通道 channel,
// ADC1 to DMA, Enable
// ADC_DMACmd(ADC1, ENABLE); //ADC 命令,和 DMA 关联。
//ADC1 Enable
ADC_Cmd(ADC1,ENABLE); //开启 ADC1
//Reset the Calibration of ADC1
ADC_ResetCalibration(ADC1);
//wait until the Calibration's fini sh
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
// NVIC_StructInit(&NVIC_InitStructure);
/* Enable the ADC Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = ADC_PRE_EMPTION_PRIORITY;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = ADC_SUB_PRIORITY;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Enable the Update Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = TIM1_UP_PRE_EMPTION_PRIORITY;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = TIM1_UP_SUB_PRIORITY;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Enable the TIM1 BRK Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM1_BRK_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = BRK_PRE_EMPTION_PRIORITY;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = BRK_SUB_PRIORITY;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //没有打开紧急停车功能
NVIC_Init(&NVIC_InitStructure);
/* Enable the DMA_CHANEL1 Interrupt */
/* NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = DMA_CH1_PRE_EMPTION_PRIORITY;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = DMA_CH1_SUB_PRIORITY;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure); */
ADC1->CR2 |= 0x00400000;
ADC1->CR1 |= 0x00000020;
// ADC_SoftwareStartConvCmd(ADC1, ENABLE); //连续转换开始,从选择开始,MCU 可以不用管了,ADC 将通过 DMA 不断刷新制定 RAM 区
// Attach them;
}
|