非精确STM32F303VC定时器时钟

Non-precise STM32F303VC Timer Clock

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

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 命令检查)。

有人知道这是从哪里来的吗?

如果您使用 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 振荡器校准的应用说明。