2017-05-09 94 views
0

我有一個很奇怪的問題。我在三個項目中使用相同的微觀。其中兩個使用HSI時鐘源,一個HSE。電力供應方式完全相同。 HSI通過ADC校準沒有任何問題,HSE卡住了。完全相同的初始化過程。 ADC肯定能行,我可以閱讀和,我得到ADC讀數寄存器寫的,但我不能經過校準STM32F303 ADC卡在校準中

static inline void ADCCalibration(ADC_TypeDef *ADC) { 
    uint32_t start = HAL_GetTick(); 
    ADC -> CR |= ADC_CR_ADCAL; 
    while((ADC1 -> CR & ADC_CR_ADCAL)) { 
     if((HAL_GetTick() - start) > ADC_CAL_TIMEOUT) { 
      __BKPT(); 
     } 
    } 
} 

__HAL_RCC_ADC12_CLK_ENABLE(); 
__HAL_RCC_ADC34_CLK_ENABLE(); 

ADC1 -> DIFSEL = 0; 
ADC2 -> DIFSEL = 0; 
ADC3 -> DIFSEL = 0; 
ADC4 -> DIFSEL = 0; 
while(ADC1 -> DIFSEL || ADC2 -> DIFSEL || ADC3 -> DIFSEL || ADC4 -> DIFSEL); 
ADC1 -> CR &= ~(ADC_CR_ADVREGEN_Msk); 
ADC1 -> CR |= ADC_CR_ADVREGEN_0; 
ADC2 -> CR &= ~(ADC_CR_ADVREGEN_Msk); 
ADC2 -> CR |= ADC_CR_ADVREGEN_0; 
ADC3 -> CR &= ~(ADC_CR_ADVREGEN_Msk); 
ADC3 -> CR |= ADC_CR_ADVREGEN_0; 
ADC4 -> CR &= ~(ADC_CR_ADVREGEN_Msk); 
ADC4 -> CR |= ADC_CR_ADVREGEN_0; 
__ADC_Delay(); 

ADCCalibration(ADC1); 
ADCCalibration(ADC2); 
ADCCalibration(ADC3); 
ADCCalibration(ADC4); 

ADC1 -> CR |= ADC_CR_ADEN; 
ADC2 -> CR |= ADC_CR_ADEN; 
ADC3 -> CR |= ADC_CR_ADEN; 
ADC4 -> CR |= ADC_CR_ADEN; 

回答

1

在你的while循環,不要你的意思是:

while((ADC -> CR & ADC_CR_ADCAL)) 

而不是

while((ADC1 -> CR & ADC_CR_ADCAL)) 
+0

是的。那麼發現:)但這不是問題。問題出在PLL和ADC時鐘設置上。由於ADC具有雙時鐘域架構,因此該微型器件需要額外的配置。現在它可以工作。 –