问题描述
我正在使用STM32F407VGT6
和CubeMX
。
所以我从通用计时器开始使用,但我遇到了预定标和周期值的问题。
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 = 41999
和Period = 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
时,这将不起作用。PSC
和ARR
必须介于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毫秒延迟的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!