|
如題,樓主在使用stm32寄存器配置ADC電壓采樣,使用中斷獲取采樣數(shù)據(jù),實(shí)際效果中,adc配置后無(wú)法讀取不到寄存器DR的值,單片機(jī)使用stm32f103vet6
單片機(jī)代碼如下:
使用的gpio口是PC1,對(duì)應(yīng)的adc1是通道11
引腳配置:- void ADC_GPIO_INIT(void)
- {
- SET_BIT(RCC->APB2ENR,RCC_APB2ENR_IOPCEN);//**開(kāi)GPIOC端口時(shí)鐘
- GPIOC->CRL &= ~(0xf<<4);//**模擬輸入模式 PC1
- }
復(fù)制代碼
ADC初始化配置
- void ADC_Mode_Config(void)
- {
- SET_BIT(RCC->APB2ENR,RCC_APB2ENR_ADC1EN);//**開(kāi)ADC1外設(shè)時(shí)鐘
- SET_BIT(RCC->CFGR,RCC_CFGR_ADCPRE_DIV6);//設(shè)置ADC分頻因子,6分頻,72/6=12MHZ[indent]
- ADC1->CR1=0;//**初始化
- ADC1->CR2=0;[/indent][indent]
- SET_BIT(ADC1->CR1,ADC_CR1_EOCIE);//**轉(zhuǎn)換結(jié)束后產(chǎn)生中斷
- SET_BIT(ADC1->CR2,ADC_CR2_CONT);//**配置連續(xù)轉(zhuǎn)換模式
- ADC1->SMPR1|=7<<(3*1);//**采樣周期為239.5個(gè)周期
- ADC1->SQR1|=0<<20;//**1個(gè)轉(zhuǎn)換
- SET_BIT(ADC1->CR2,ADC_CR2_ADON);//**開(kāi)啟AD轉(zhuǎn)換器[/indent][indent]
- SET_BIT(ADC1->CR2,ADC_CR2_RSTCAL);//**使能復(fù)位校準(zhǔn)
- while(READ_BIT(ADC1->CR2,ADC_CR2_RSTCAL));//**等待校準(zhǔn)結(jié)束
- SET_BIT(ADC1->CR2,ADC_CR2_CAL);//**使能A/D校準(zhǔn)
- while(READ_BIT(ADC1->CR2,ADC_CR2_CAL));//**等待校準(zhǔn)結(jié)束[/indent]
- ADC1->SQR3&=0XFFFFFFE0
- ADC1->SQR3|=11;//**通道配置
- NVIC_SetPriority(ADC1_2_IRQn, 1);//配置中斷優(yōu)先級(jí)
- NVIC_EnableIRQ(ADC1_2_IRQn);//開(kāi)中斷
- }
復(fù)制代碼 中斷函數(shù)
- void ADC_IRQHandler(void)
- {
- if (READ_BIT(ADC1->SR,ADC_SR_EOC))
- {
- // 讀取ADC的轉(zhuǎn)換值
- ADC_ConvertedValue = ADC1->DR;
- }
- }
復(fù)制代碼
主函數(shù):
問(wèn)題出在ADC初始化函ADC_Mode_Config()上,我的想法是轉(zhuǎn)換完成后EOCIE產(chǎn)生一個(gè)中斷,在中斷中讀取DR寄存器的值,實(shí)際效果是讀取到的dr的值始終為0:
也試圖使用軟件開(kāi)啟配置:
ADC1->CR2|=7<<17; //軟件控制轉(zhuǎn)換
ADC1->CR2|=1<<20; //使用外部觸發(fā)(SWSTART)
SET_BIT(ADC1->CR2,ADC_CR2_SWSTAR);//**軟件設(shè)置開(kāi)始轉(zhuǎn)換
while(!(ADC1->SR&1<<1)); //等待完成
當(dāng)開(kāi)啟外部觸發(fā)EXTTRIG,并配置EXTSEL為SWSTART,在中斷優(yōu)先級(jí)配置后啟用SWSTART,串口接收不到任何信息。
|
|