本文介绍了STM32F4定时器-计算周期和预缩放,并生成1毫秒延迟的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用STM32F407VGT6CubeMX
所以我从通用计时器开始使用,但我遇到了预定标和周期值的问题。

基本上,我希望每隔n(其中n=1,2,3.)生成一个计时器中断并执行一些任务。
计算周期和定标前的值的公式有很多变化

公式的某些版本包括:

问题是,我的核心时钟在168 MHz运行,但我可以看到计时器已连接到84 MHz运行。

我试过一个代码,它会产生1毫秒的延迟(作者说),在使用预分频和周期的值之后,我生成了一个代码,它也会产生1毫秒的延迟(凭直觉--没有范围)。

代码使用的预缩放值为41999,周期为1999。

So,
PSC-41999
ARR-1999
将其应用到第二个公式

Update Event = TIM clk/((PSC+1)*(ARR+1)*(RCR+1))

Update Event = 84000000/(42000*2000) = 1(这是1ms延迟吗?)

好的,现在我正在尝试了解PSC = 41999Period = 1999是如何选择的??这纯粹是基于假设,因为在我使用的任何公式中,我都必须假设一个变量。如果我想要,比如1.5或2.3或4.9这样精确时间,如何计算预定标和周期。

编辑

此外,当我使用PSC=41999 and Period =999时,更新事件值为2。

Update Event = 84000000/(42000*1000) = 2

但我的延迟是每秒两次。即500ms

当我使用PSC=39999 and Period =4199时,更新事件值为0.5。

Update Event = 84000000/(40000*4200) = 0.5

和我的延迟2毫秒。

提前谢谢

推荐答案

这显然是错误的。计数器从0到寄存器值(含),始终比寄存器值多一个周期,而不是少一个。

这个更好,但通用计时器没有RCR寄存器。您可以假定RCR=0,在公式中省略*(RCR+1)

当不可能有整数解时,这会尝试对结果进行舍入。稍后详细说明。

否,这是一秒(1s)延迟,或1赫兹频率。

取简单的公式

Updatefrequency = TIM clk/((PSC+1)*(ARR+1))

将其重新排列为

(PSC+1)*(ARR+1) = TIMclk/Updatefrequency
在右手边有一个已知值,在左手边有两个未知数。简单的解决方案是将其中一个设置为PSC设置为0,将ARR设置为右侧值-1。

不幸的是,大多数定时器只有16位寄存器,因此当TIMclk/Updatefrequency > 65535时,这将不起作用。PSCARR必须介于0和65535之间。您必须找到满足这些约束的因子分解。

让我们看一个例子,您需要2.3秒的延迟。请注意,2.3s是周期,而不是频率,因此您需要将其倒数放入公式中。

(PSC+1) * (ARR+1) = 84000000 / (1 / 2.3) = 84000000 * 2.3 = 193200000

幸运的是,末尾有许多零,您只需选择例如10000作为预分频器(PSC=9999),ARR就会变成19320-1 = 19319。如果期望的比率不是一个很好的整数,那么您应该求助于integer factorization,或者编写一个小程序来查找所有可能的除数(for(i=0;i<65536;i++) ...)。

也可能根本没有精确的整数解,那么您仍然可以遍历所有可能的预分频值,并查看哪个值的误差最小。

请注意尺寸。您在公式中使用频率,将84 MHz输入频率除以一些值,结果是2赫兹。2赫兹频率表示每秒发生两个事件,因此这两个事件实际上相隔500毫秒。

这篇关于STM32F4定时器-计算周期和预缩放,并生成1毫秒延迟的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-12 18:47