良许Linux教程网 干货合集 STM32的SysTick时钟源来自哪里?

STM32的SysTick时钟源来自哪里?

在后台有位朋友提出了一个问题:“STM32的SysTick时钟源是来自Cortex系统定时器吗?”

同时,这个问题引出了一个更深入的讨论:为什么在STM32CubeMX中Cortex系统定时器可以选择1分频(和8分频)?

引言

当我看到这个问题时,我想到了一个可能是因为这位朋友没有仔细阅读相关文档,同时也可能存在一些误解。

我还特意进行了一番搜索,发现网上有许多文章都提到:“SysTick时钟源来自Cortex系统定时器”,而这个定时器有一个8分频的设置选项。这似乎进一步加深了一些误解。

image-20231228181637068
image-20231228181637068

但是,我们实际应用中,SysTick时钟源真的是来自这个Cortex系统定时器吗?

2SysTick时钟初始化代码

不管是使用标准外设库,还是HAL库,你初始化SysTick,都会调用内核中的SysTick_Config函数。

比如:

SysTick_Config(SystemCoreClock / 1000);

初始化调用这段代码之后,SysTick将会实现1ms中断一次。

这段代码实现1ms中断一次相信大家都能理解,但是这里SysTick初始化和上面说的时钟『/8』有关系吗?

3SysTick时钟源是来自哪里?

这个问题只要认真看参考手册都能找到答案。

RCC通过AHB时钟(HCLK)8分频后作为Cortex系统定时器(SysTick)的外部时钟。

通过对SysTick控制与状态寄存器的设置,可选择上述时钟或Cortex(HCLK)时钟作为SysTick时钟。

–来自参考手册

也就是说SysTick时钟源可以来自两个地方:

  • AHB时钟8分频
  • HCLK(内核)时钟

通过SysTick控制与状态寄存器的设置进行选择时钟源。

具体就是通过CLKSOURCE(时钟源)这一Bit位来选择:image-20231228181642555

再次看SysTick_Config函数源码:

__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
  {
    return (1UL);                                                   /* Reload value impossible */
  }

  SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1UL set Priority for Systick Interrupt */
  SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                   SysTick_CTRL_TICKINT_Msk   |
                   SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */
  return (0UL);                                                     /* Function successful */
}

你会发现,其实源码已经默认使用HCLK(内核)时钟。

而SysTick_Config函数属于内核(如core_cm3.h)已经写好源码,一般我们不去修改。

所以,到这里,你会明白:SysTick时钟源其实就是用的HCLK(内核)时钟

4STM32CubeMX…可选择1分频

分析上面问题的时候,我突然发现一个问题:为什么STM32CubeMX中Cortex系统定时器可选择1分频(和8分频)?image-20231228181654646

(使用STM32CubeMX V5.1.0)

我通过配置1分频和8分频,各自生成代码,进行对比,发现生成的代码完全一样

然后,我又查看手册,RCC时钟树中的这个位置是固定『/8』,也没有看到可『/1』的说明。image-20231228181658860

这里就留下一个问题:

你认为STM32CubeMX配置Cortex系统定时器时钟是有Bug吗? (欢迎留言讨论)

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部