非精确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 振荡器校准的应用说明。
我在 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 振荡器校准的应用说明。