定时器配置设置

问题描述 投票:0回答:1

我在STM32中使用定时器,我的疑问在于它的设置。

已知更新事件的计算公式为:

UpdateEvent = Timerclock / (Prescaler + 1)(Period + 1)

考虑到 TimerClock 是 48MHz,我希望更新事件为 0.5s。理论上,可以通过预分频器和周期值的不同组合来实现。

我的问题是,预分频器和周期的选择如何影响系统,是预分频器越高、周期越低越好,还是反之亦然,还是根本没有相关影响?

timer stm32
1个回答
0
投票

在实际答案之前,对计时器进行一些额外的介绍:

我总是觉得这个公式违反直觉,因为它没有教给你任何东西,也没有解释STM32定时器内部的逻辑。然而,如果你理解其中的逻辑,一切都会水到渠成。

首先,我们需要定义什么是定时器时钟。定时器时钟的特征是定时器计数器频率 - 定时器计数器每秒递增(或递减)多少次,预分频器为 1。该频率不等于 CPU 时钟频率。可能是,但并非总是如此。定时器时钟频率很复杂。通常,它取决于定时器所在的 APB 总线的频率,乘以 2,但即使这样也不是固定的(对于某些 APB 预分频器,它可以是 2xAPBx 频率,对于其他预分频器,它可以是 1xAPBx,它也可以是 4xAHB 频率)。您可以在参考手册的“定时器”部分以及“RCC”部分中找到有关它的更多信息。然而,对于许多默认配置,定时器时钟只是 2xAPBx 频率,通常恰好等于 CPU 频率。如果您调试项目并发现计时器关闭了 2 倍,您应该首先检查一下。

接下来是定时器预分频器,正如您所猜测的,它只是简单地划分定时器时钟,这样定时器计数器就不会在每个定时器时钟滴答上递增/递减,而是仅在每个“预分频器”定时器时钟滴答上执行此操作。

然后是一个重载值,该值定义了多少个计数器滴答作一次完整的“旋转”,并触发更新事件,并重新启动计数器。

考虑它的直观方法是考虑定时器时钟,然后考虑预分频器(例如 2 - 每秒定时器时钟滴答增加计数器),然后设置重载值,该值简单地定义了您将有多少个计数器滴答有一段时间有。

例如:
想象一下定时器时钟是 100MHz(为了便于数学计算)。
那么一个周期就是 10ns。
我将预分频器设置为 4,因此定时器计数器以 25MHz 递增,或者每次定时器计数器递增 (25*10^6) = 40ns。
我想要一个计时器每 1us(微秒)触发一次,所以我需要 1000ns/40ns = 25 个计数器滴答声。这将是我的重载值。
或者,我可以使用 2 而不是 4 的预分频器(每个定时器计数器增量 20ns),这意味着我需要将重载值加倍到 50,并且我将获得相同的 20ns/tick*50ticks = 1000ns/计数器重载。一个减半,另一个加倍。

*我省略了所有进入寄存器的+1,这是关于逻辑的。


回答实际问题:

现在,回到如果我在保持相同计数器周期的情况下更改预分频器和重载值是否重要的问题。

首先,您必须考虑预分频器和重载值的位宽。定时器通常具有 16 位预分频器和/或 16 位重载值。这显然限制了你的范围。每个定时器都是单独的,有些具有用于这些值的 32 位寄存器,有些具有 16 位寄存器。因此,并非预分频器/重载值的每种组合都适合每个定时器。

其次,预分频器越小,计数器周期的粒度就越大。使用小的预分频器,您可以将重载值改变1,并且周期的变化将非常小,而如果您的预分频器很大,则重载值的每次变化都会使计数器周期变化更多。因此,如果您想要精细控制(例如 PWM),您需要将预分频器推得尽可能低,同时还要确保重载值仍然适合重载值寄存器。

第三,如果您只想从计时器获得固定频率的滴答声,并且不需要任何精细控制(例如每 0.5 秒一次滴答声而无需其他任何操作),那么预分频器和重载值的确切值并不重要的确。您可以将预分频器加倍,将重载值减半,您将获得完全相同的定时器计数器周期,没有实际差异。再说一遍,只要两者都适合它们的寄存器。

© www.soinside.com 2019 - 2024. All rights reserved.