【问题标题】:Change Prescaler on the fly and use it immediately即时更改预分频器并立即使用
【发布时间】:2021-12-12 14:39:11
【问题描述】:

我设法通过使用动态更改时钟 TIM2 的预分频器

__HAL_TIM_SET_PRESCALER(&htim2,newValue);

但是,在计数器重置为零之前,它会以旧的速度计数。

我可以强制程序立即使用新的预分频器值吗?

我正在使用 STM32L052K8Tx

【问题讨论】:

  • 您正在使用 _HAL 库,所以我假设您正在使用 STM micros,但您能否提供更多有关架构的详细信息?通常预分频器是您设置的注册版本,直到下一次定时器溢出才会更新,但这非常依赖于架构。
  • edit您的问题并告诉我们您使用的是什么µC,您在其数据表的哪一章中找到了与您的问题相关的内容,以及为什么它没有帮助。
  • 尝试停止计时器,更改预分频器并重新启动计时器
  • 有什么特殊原因不能让它一直计入“快速单位”,而不是更改预分频器,而是更改延迟?

标签: c stm32 hal


【解决方案1】:

STM32F10x参考手册(大部分STM32都有相同的定时器):

PSC 包含要在每次更新事件时加载到活动预分频器寄存器中的值 (包括通过 TIMx_EGR 寄存器的 UG 位或通过触发器清除计数器时 配置为“重置模式”时的控制器)。

您必须等到计数器达到零。此事件可以通过 EGR 寄存器中的 UG 位强制执行,这将重置 CNT 并强制重新加载。如果您需要保持 CNT 值,则无法在没有更新事件的情况下使用 PSC 实时“调整”计时器速度。

但您可以尝试将一个定时器用作另一个定时器的预分频器,在主从模式下运行两个定时器。第一个定时器的 ARR 可以在没有缓冲的情况下重新加载(TIMx_CR1 中的 APRE 位 = 0),第二个定时器不会受到影响。请参阅参考手册和示例中的“定时器同步”章节,如库中的 TIM_Synchronization。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-16
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多