2017-05-09 24 views
0

매우 이상한 문제가 있습니다. 나는 세 가지 프로젝트에서 같은 마이크로를 사용한다. 그 중 두 개는 HSI 클럭 소스 인 HSE를 사용합니다. 전원은 정확히 같은 방식으로 공급됩니다. HSI 제품은 아무런 문제없이 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

을 통과하지 못할 수 ADC는 확실히 작동 당신은 의미하지 않는다 :

while((ADC -> CR & ADC_CR_ADCAL)) 

대신

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

예. 잘 보였다 :) 그러나 그것은 문제가 아니었다. 문제는 PLL 및 ADC 클록 설정에있었습니다. 이 마이크로는 ADC가 듀얼 클록 도메인 아키텍처를 가지고 있기 때문에 몇 가지 추가 구성이 필요합니다. 이제 작동합니다. –