2017-05-09 4 views
0

Ich habe ein ziemlich seltsames Problem. Ich benutze das gleiche Mikro in drei Projekten. Zwei von ihnen verwenden eine HSI-Taktquelle, eine HSE. Die Stromversorgung erfolgt auf genau die gleiche Weise. HSI-Geräte durchlaufen die ADC-Kalibrierung ohne Probleme, HSE bleibt hängen. Genau das gleiche Initialisierungsverfahren. ADC funktioniert auf jeden Fall, wie ich aus den Registern lesen und schreiben, ich ADC Lesungen bin immer, aber ich kann die Kalibrierung durchSTM32F303 ADC bleibt in der Kalibrierung stecken

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; 

Antwort

1

In Sie while-Schleife, oder nicht bedeuten:

while((ADC -> CR & ADC_CR_ADCAL)) 

statt

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

Ja. Gut entdeckt :) Aber es war nicht das Problem. Das Problem lag in den PLL- und ADC-Uhreinstellungen. Dieses Mikro erfordert eine zusätzliche Konfiguration, da der ADC eine Dual-Clock-Domänenarchitektur aufweist. Jetzt funktioniert es. –

Verwandte Themen