非精确STM32F303VC定时器时钟

时间:2017-03-27 08:38:45

标签: c timer embedded clock stm32

我在STM32f3发现板上使用定时器8来驱动DAC正弦波生成。这是我的Timer配置:

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。

当我测量正弦波频率时,它显示90Hz而不是100Hz。当我计算回APB1时钟的时钟频率时,它会等于64.8MHz,这看起来很奇怪。我没有改变有关lcock配置设置的任何内容,一切都是默认的。

系统时钟内核等于72MHz(使用RCC_GetClocksFreq命令检查它)。

任何人都知道这是从哪里来的?

1 个答案:

答案 0 :(得分:1)

如果您使用HSI时钟作为源,这就是问题所在。

HSI时钟不准确,至少可以变化+ - 10%。

顺便看看你的评论。

Timer count clock = timer_input_clock / (prescaler_value + 1)

你的案子

72000000 / 1126 = 63943Hz

期限为10,你得到:

tim_overflow_period = tim_clock / (period + 1)

在你的情况下

63943 / 11 = 5813

如果将预分频器设置为1124,将周期设置为9,则会得到更好的结果。

timer_clock = 72000000 / (1124 + 1) = 64000
timer_overflow = 64000 / (9 + 1) = 6400

您的DAC输出信号有64个样本吗? 我相信你会使用DMA。

如果有的话,如果你有外部振荡器,你应该得到100Hz,否则你可能没有。查看有关HSI振荡器校准的应用说明。