如題,樓主在使用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,串口接收不到任何信息。
|