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