나는 DAC 사인파 발생을 운전하는 STM32f3 발견 널에 타이머 8을 사용하고있다. 다음은 타이머 구성입니다.STM32F303VC 부정확 한 타이머 시계
TIM_TimeBaseInitTypeDef timer;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
TIM_TimeBaseStructInit(&timer);
timer.TIM_CounterMode = TIM_CounterMode_Up;
//Setting prescaler so that timer clock will be only 64000Hz
timer.TIM_Prescaler = 1125;
//Setting period so Timer will give signal of frequency 1000Hz
timer.TIM_Period = 10;
TIM_TimeBaseInit(TIM6, &timer);
//generate event when counter hits TIM_period value
TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);
/* TIM2 enable counter */
TIM_Cmd(TIM6, ENABLE);
클럭이 72MHz라고 가정합니다. I가 정현파 frequeency 측정하면
는 대신 100Hz에서의 90 Hz의를 나타낸다. 내가 다시 APB1 클럭의 클록 주파수를 계산할 때, 그것은 매우 이상하게 보이는 64.8MHz와 동일하다는 것을 알 수있다. lcock 구성 설정과 관련하여 아무 것도 변경하지 않았으며 모든 것이 기본값입니다.
시스템 클럭의 코어 (RCC_GetClocksFreq 명령을 사용하여 검사)는 Crystal 같습니다.
어디에서 발생했는지 알 수 있습니까?
_ "클럭이 72MHz와 같다고 가정합니다."_ 정말로 알아야 할 필요가 있습니다. PLL을 이와 같이 구성한 경우 72MHz _only_이고 정확한 외부 발진기를 사용하는 경우 _only_입니다. 내부 HSE RC 발진기는 폭이 다양하며 온도 안정성이 없습니다. 표준 CMSIS 시작 코드를 사용하는 경우, PLL은 system_stm32f3xx.c'SystemInit()'에 구성됩니다. 그리고 _nominal_ 클럭 주파수는 전역'SystemCoreClock'에 저장 될 것입니다. – Clifford
다른 클록 구성으로의 이식성을 위해 ABP1 클럭 주파수보다 더 나은 "SystemCoreClock"또는 더 나은 점으로 프리스케일러를 계산하는 것이 좋습니다. – Clifford