学习笔记——STM32中什么是预分频

本文详细介绍了STM32定时器中的预分频器(PSC)如何工作,用于降低定时器时钟频率,实现更精确的定时。通过举例STM32F103的TIM1,说明了预分频器设置对定时精度的影响,并解释了如何通过预分频器获取期望的定时器时钟频率。预分频器的值由TIMx_PSC寄存器设定,其更新遵循特定时序,且在更新事件触发时生效。预分频器的正确配置对于实现精确的定时中断至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在STM32的定时器中,预分频器(Prescaler-PSC)用来将定时器时钟源进行分频输出。

预分频器的值由寄存器TIMx_PSC设定,是一个16位正整数值。

STM32CubeMX中的TIM预分频设置


在STM32系统中,定时器的时钟源为内部时钟时,其频率一般都比较高,以STM32F103的TIM1为例,其总线时钟最大为72MHz,体现在16位的定时器上的效果就是从0计数到65535上溢只需要0.9毫秒。如果我们需要更长时间的定时间隔,那么就需要预分频器对时钟进行分频处理,以降低定时器时钟(CK_CNT)的频率。

除此之外,也可以通过配置预分频器,来获取想要的定时器时钟频率。依然以上边的TIM1为例,如果我们想获取一个精确的1ms中断,如果不分频,72MHz的时钟对应每周期1/72us,十分不利于计算。这时候使用预分频器将其72分频后为1MHz,每周期1us,1000个计时周期即为1ms,这样既便于计算,定时也更加精确。

预分频器的工作的工作原理是,定时器时钟源每tick一次,预分频器计数器值+1,直到达到预分频器的设定值,然后再tick一次后计数器归零,同时,CNT计数器值+1。

由此可以看出,因为达到最大值后还要再tick一次才归零,所以定时器时钟频率应该为Fosc/(PSC+ 1)。其中Fosc是定时器的时钟源。比如想对时钟源进行72分频,那么预分频器的值就应该设置为71。

预分频器值寄存器TIMx_PSC存在影子寄存器(官方翻译为缓冲功能),所以在定时器启动后更改TIMx_PSC的值并不会立即影响当前定时器的时钟频率。要等到下一个更新事件(UEV)发生时才会生效。比如下边这张图就体现了将分频系数由1修改为2(即TIMx_PSC由0更改为1)时整个定时器的时序图。

预分频器值更改时的定时器时序图



更新事件(UEV)则由TIMx_CR1寄存器中的UDIS位控制,在启用时,会通过以下两种方式触发 :

  • 计数器上溢
  • 手动将 TIMx_EGR 寄存器中的UG 位置 1
### STM32 HAL_RCC_ClockConfig 函数作用 `HAL_RCC_ClockConfig` 函数用于配置系统的时钟源及其分频系数,从而设置系统的工作频率。通过此函数可以初始化PLL(锁相环)、AHB、APB1 和 APB2 总线的预分频器以及闪存等待周期等参数[^1]。 具体来说,该函数允许开发者指定不同的时钟源来驱动系统时钟SYSCLK,并调整各个总线上的时钟分配情况。这有助于优化性能并满足特定应用场景下的需求。此外,在调用 `HAL_RCC_ClockConfig` 前通常还需要先完成振荡器配置工作,即使用 `HAL_RCC_OscConfig()` 来设定外部/内部高速低速振荡器的相关属性。 当执行 IAP 跳转前遇到因 PLL 锁定而导致程序卡死的情况时,可以通过对 RCC 进行 DeInit 操作后再重新初始化的方式来解决问题[^3]。 下面是一个简单的代码示例展示如何使用 `HAL_RCC_ClockConfig`: ```c // 定义结构体变量存储所需配置信息 RCC_ClkInitTypeDef clkInitStruct; uint32_t flLAtency; // 设置 SYSCLK 为 HSE 并使能自动校准功能 clkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; clkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 使用 PLL 输出作为系统时钟源 clkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // AHB 预分频因子设为 1 clkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; // APB1 预分频因子设为 4 clkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; // APB2 预分频因子设为 2 if(HAL_RCC_ClockConfig(&clkInitStruct, FLATENCY) != HAL_OK){ // 如果配置失败则处理错误... } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Obito_TXP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值