2017-05-09 8 views
0

私は非常に奇妙な問題があります。私は3つのプロジェクトで同じマイクロを使用します。それらのうちの2つは、HSIクロックソース、1つの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((ADC -> CR & ADC_CR_ADCAL)) 

ではなく、

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

はい。まあ見つけました:)しかしそれは問題ではありませんでした。問題はPLLとADCのクロック設定にありました。このマイクロは、ADCがデュアルクロックドメインアーキテクチャを備えているため、いくつかの追加設定が必要です。今それは動作します。 –

関連する問題