[信息] STM32 的 SysTick 模块的时钟源

[复制链接]
1235|13
 楼主| 小灵通2018 发表于 2025-1-24 12:03 | 显示全部楼层 |阅读模式
STM32 的 SysTick 模块可以选择以下两种时钟源:
  • 内核时钟 (HCLK)
    • SysTick 使用 Cortex-M 内核的主时钟 (HCLK) 作为计数器的时钟源。
    • 这种模式下,SysTick 的时钟频率与系统主时钟一致,能够提供更高的计时精度。
  • 内核时钟的 8 分频 (HCLK/8)
    • SysTick 的时钟频率为 HCLK 的 1/8。
    • 这种模式下,计数器时钟速度降低,适用于较低速率的应用,特别是在低功耗模式下。





 楼主| 小灵通2018 发表于 2025-1-24 12:04 | 显示全部楼层
时钟源选择方法SysTick 时钟源通过 SysTick 控制寄存器(CTRL) 的 CLKSOURCE 位(位2)选择:
  • CLKSOURCE = 1:选择内核时钟 (HCLK)。
  • CLKSOURCE = 0:选择内核时钟的 8 分频 (HCLK/8)。
时钟源对定时的影响假设主时钟 HCLK 为 72 MHz:
  • 如果选择 HCLK 作为时钟源,则 SysTick 计数器的频率为 72 MHz。
  • 如果选择 HCLK/8,则 SysTick 计数器的频率为 9 MHz。
由于 SysTick 是 24 位计数器,最大计数值为 2^24 - 1 (16,777,215),所以最大定时周期为:
  • HCLK 模式:(2^24 - 1) / HCLK = (16,777,215) / 72,000,000 ≈ 0.23 秒
  • HCLK/8 模式:(2^24 - 1) / (HCLK / 8) = (16,777,215) / 9,000,000 ≈ 1.86 秒

 楼主| 小灵通2018 发表于 2025-1-24 12:04 | 显示全部楼层
  1. #include "stm32f4xx.h"

  2. void SysTick_ConfigWithClockSource(uint32_t ticks, uint8_t useHCLK) {
  3.     SysTick->LOAD = ticks - 1;  // 设置重装载值
  4.     SysTick->VAL = 0;           // 清零计数器

  5.     if (useHCLK) {
  6.         SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk;  // 使用 HCLK 作为时钟源
  7.     } else {
  8.         SysTick->CTRL &= ~SysTick_CTRL_CLKSOURCE_Msk; // 使用 HCLK/8 作为时钟源
  9.     }

  10.     SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk |  // 使能中断
  11.                      SysTick_CTRL_ENABLE_Msk;   // 启用 SysTick
  12. }
 楼主| 小灵通2018 发表于 2025-1-24 12:04 | 显示全部楼层
应用建议
如果需要高精度定时(如微秒级延时),推荐使用 HCLK 作为时钟源。
如果定时周期较长且精度要求不高,或系统频率较高时需节省功耗,可使用 HCLK/8。
公羊子丹 发表于 2025-3-10 08:04 | 显示全部楼层
SysTick默认用的就是HCLK/8,很多人没注意,结果定时总是偏慢。
周半梅 发表于 2025-3-10 08:11 | 显示全部楼层
如果项目对时间精度要求高,切换成HCLK模式是个不错的选择,尤其是高速任务。
帛灿灿 发表于 2025-3-10 08:12 | 显示全部楼层
HCLK/8模式挺适合低功耗应用,尤其是系统空闲时还能保持较准的定时。
童雨竹 发表于 2025-3-10 08:14 | 显示全部楼层
切换SysTick时钟源的时候,别忘了重新配置SysTick->LOAD,不然定时会乱套。
万图 发表于 2025-3-10 08:16 | 显示全部楼层
如果用的是HAL库,HAL_InitTick函数里默认配置的是HCLK/8,很多人容易忽略。
Wordsworth 发表于 2025-3-10 08:18 | 显示全部楼层
我之前做个USB项目,用HCLK/8时定时器偏差挺大,后来切到HCLK模式就准多了。
Bblythe 发表于 2025-3-10 08:19 | 显示全部楼层
在低功耗模式下,HCLK可能会关闭,所以选择HCLK/8模式更稳定些。
Pulitzer 发表于 2025-3-10 08:21 | 显示全部楼层
SysTick在RTOS里用得挺多,改时钟源时要注意和任务调度周期匹配。
Uriah 发表于 2025-3-10 08:23 | 显示全部楼层
HCLK模式下的SysTick可以精准到纳秒级,挺适合时间敏感型应用。
Clyde011 发表于 2025-3-10 08:25 | 显示全部楼层
选择时钟源时,别忘了结合电源功耗来考虑,低功耗应用HCLK/8可能更合适。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

160

主题

1735

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部