gpt4 book ai didi

timer - STM32F4 定时器 - 计算周期和预分频,以生成 1 ms 延迟

转载 作者:行者123 更新时间:2023-12-02 06:21:06 25 4
gpt4 key购买 nike

我将 STM32F407VGT6CubeMX 结合使用。因此,我从通用定时器开始,但我被预分频值和周期值困住了。

基本上我想每n(其中n=1,2,3..)毫秒生成一个计时器中断并执行一些任务。计算周期和预分频值的公式有很多变化。

公式的一些版本是:

TIMupdateFreq(HZ) = Clock/((PSC-1)*(Period-1))
Update Event = TIM clk/((PSC+1)*(ARR+1)*(RCR+1))
Prescaler = ((((ClockSpeed) / ((period) / (1 / frequency))) + 0.5) - 1)

说到这个问题,我的核心时钟运行在 168 MHz,但我可以看到定时器连接到运行在 84 MHz 的 APB1 总线。

我尝试过生成 1 毫秒延迟的代码(根据作者的说法),在使用预分频值和周期值后,我生成了也生成 1 毫秒延迟的代码(凭直觉 - 无范围)。

该代码使用预分频值 41999 和周期 1999。

所以,
PSC - 41999
ARR - 1999
将此应用于第二个公式

更新事件 = TIM clk/((PSC+1)*(ARR+1)*(RCR+1))

更新事件 = 84000000/(42000*2000) = 1(这是 1 毫秒的延迟吗?)

好的,现在我想了解如何选择 PSC = 41999Period = 1999?它纯粹基于假设吗?无论我使用什么公式,我都必须假设一个变量?如果我想要 1.5 或 2.3 或 4.9 之类的精确计时,如何计算预分频和周期?

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

更新事件 = 84000000/(42000*1000) = 2

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

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

更新事件 = 84000000/(40000*4200) = 0.5

我的延迟为 2 毫秒。

最佳答案

TIMupdateFreq(HZ) = Clock/((PSC-1)*(Period-1))

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

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

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

Prescaler = ((((ClockSpeed) / ((period) / (1 / frequency))) + 0.5) - 1)

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

Update Event = 84000000/(42000*2000) = 1 (Is this 1ms Delay??)

不,这是一秒 (1s) 延迟,或 1 Hz 频率。

how this PSC = 41999 and Period = 1999 are selected?

采用简单的公式,

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

重新排列

(PSC+1)*(ARR+1) = TIMclk/Updatefrequency

那么右侧有一个已知值,但左侧有两个未知值。最简单的解决方案是设置其中之一,例如PSC0 ,和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++) ... )。

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

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

But my delay is twice in every sec. i.e 500ms

注意尺寸。您在公式中使用频率,将 84 MHz 输入频率除以一些值,并得到2 Hz 结果。 2 Hz 频率意味着每秒发生两个事件,因此这些事件确实相隔 500 毫秒。

关于timer - STM32F4 定时器 - 计算周期和预分频,以生成 1 ms 延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51906691/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com