作者:亲亲羊to | 来源:互联网 | 2022-12-07 13:09
我使用STM32F407VGT6
带CubeMX
。
因此,我从通用计时器开始,但始终陷于预分频和周期值。
基本上我想每隔n
(其中n = 1,2,3 ..)ms 生成一个计时器中断并执行一些任务。
公式中有很多变化,可以计算周期和预分摊的值
公式的某些版本是:
TIMupdateFreq(HZ)=时钟/(((PSC-1)*(Period-1))
更新事件= TIM clk /(((PSC + 1)*(ARR + 1)*(RCR + 1))
预分频器=((( (时钟速度)/((周期)/(1 /频率)))+ 0.5)-1)
因此,我的核心时钟运行在,168 MHz
但我可以看到定时器连接到APB1 Bus
,它正在运行84 MHz
。
我尝试了一个代码,该代码会产生1 ms的延迟(作者说),在使用该值进行预分频和周期后,我生成了一个代码,该代码也会产生1ms的延迟(直觉-无作用域)。
该代码使用的预分度值为41999,期限为1999。
因此,
PSC-41999
ARR-1999将
其应用于第二个公式
Update Event = TIM clk/((PSC+1)*(ARR+1)*(RCR+1))
Update Event = 84000000/(42000*2000) = 1
(这是1毫秒的延迟吗?)
行,所以我现在想了解如何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毫秒。
提前致谢
1> berendi - pr..:
TIMupdateFreq(HZ)=时钟/(((PSC-1)*(Period-1))
这显然是错误的。计数器从0到寄存器值(含),总是比寄存器值多一个周期,而不是少一个。
更新事件= TIM clk /(((PSC + 1)*(ARR + 1)*(RCR + 1))
这个比较好,但是通用定时器没有RCR
寄存器。您可以假设RCR=0
,并*(RCR+1)
从公式中省略。
预分频器=((((ClockSpeed)/((period)/(1 /频率)))+ 0.5)-1)
当没有整数解时,这将尝试舍入结果。稍后再讨论。
Update Event = 84000000/(42000*2000) = 1
(这是1毫秒的延迟吗?)
不,这是一秒(1s)延迟或1 Hz频率。
如何PSC = 41999
和Period = 1999
选择?
用简单的公式,
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
。如果所需的比率不是一个好的整数,则应采用整数分解法,或编写一个小程序以查找所有可能的除数(for(i=0;i<65536;i++) ...
)。
也有可能根本没有精确的整数解,然后您仍然可以循环遍历所有可能的预分频器值,并查看哪个误差最小。
Update Event = 84000000/(42000*1000) = 2
但是我的延迟是每秒两次。即500ms
注意尺寸。您在公式中使用频率,将84 MHz输入频率除以某些值,结果为2 Hz。2 Hz频率意味着每秒发生两个事件,因此这些事件确实相距500ms。