如题,楼主在使用stm32寄存器配置ADC电压采样,使用中断获取采样数据,实际效果中,adc配置后无法读取不到寄存器DR的值,单片机使用stm32f103vet6
单片机代码如下:
使用的gpio口是PC1,对应的adc1是通道11
引脚配置:- void ADC_GPIO_INIT(void)
- {
- SET_BIT(RCC->APB2ENR,RCC_APB2ENR_IOPCEN);//**开GPIOC端口时钟
- GPIOC->CRL &= ~(0xf<<4);//**模拟输入模式 PC1
- }
复制代码
ADC初始化配置
- void ADC_Mode_Config(void)
- {
- SET_BIT(RCC->APB2ENR,RCC_APB2ENR_ADC1EN);//**开ADC1外设时钟
- SET_BIT(RCC->CFGR,RCC_CFGR_ADCPRE_DIV6);//设置ADC分频因子,6分频,72/6=12MHZ[indent]
- ADC1->CR1=0;//**初始化
- ADC1->CR2=0;[/indent][indent]
- SET_BIT(ADC1->CR1,ADC_CR1_EOCIE);//**转换结束后产生中断
- SET_BIT(ADC1->CR2,ADC_CR2_CONT);//**配置连续转换模式
- ADC1->SMPR1|=7<<(3*1);//**采样周期为239.5个周期
- ADC1->SQR1|=0<<20;//**1个转换
- SET_BIT(ADC1->CR2,ADC_CR2_ADON);//**开启AD转换器[/indent][indent]
- SET_BIT(ADC1->CR2,ADC_CR2_RSTCAL);//**使能复位校准
- while(READ_BIT(ADC1->CR2,ADC_CR2_RSTCAL));//**等待校准结束
- SET_BIT(ADC1->CR2,ADC_CR2_CAL);//**使能A/D校准
- while(READ_BIT(ADC1->CR2,ADC_CR2_CAL));//**等待校准结束[/indent]
- ADC1->SQR3&=0XFFFFFFE0
- ADC1->SQR3|=11;//**通道配置
- NVIC_SetPriority(ADC1_2_IRQn, 1);//配置中断优先级
- NVIC_EnableIRQ(ADC1_2_IRQn);//开中断
- }
复制代码 中断函数
- void ADC_IRQHandler(void)
- {
- if (READ_BIT(ADC1->SR,ADC_SR_EOC))
- {
- // 读取ADC的转换值
- ADC_ConvertedValue = ADC1->DR;
- }
- }
复制代码
主函数:
问题出在ADC初始化函ADC_Mode_Config()上,我的想法是转换完成后EOCIE产生一个中断,在中断中读取DR寄存器的值,实际效果是读取到的dr的值始终为0:
也试图使用软件开启配置:
ADC1->CR2|=7<<17; //软件控制转换
ADC1->CR2|=1<<20; //使用外部触发(SWSTART)
SET_BIT(ADC1->CR2,ADC_CR2_SWSTAR);//**软件设置开始转换
while(!(ADC1->SR&1<<1)); //等待完成
当开启外部触发EXTTRIG,并配置EXTSEL为SWSTART,在中断优先级配置后启用SWSTART,串口接收不到任何信息。
|