0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32中的SysTick时钟源来自哪里?

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 2020-03-03 14:32 次阅读

有位朋友在后台大概问了这样一个问题:STM32的SysTick时钟源是来自Cortex系统定时器吗?

引伸:

为什么STM32CubeMX中Cortex系统定时器可选择1分频(和8分频)?

1写在前面

看到这个问题,我在想,这位朋友可能没有认真看手册,同时也存在一个误区。

我顺便也搜索了一下,网上很多文章都说到:SysTick时钟源是来自Cortex系统定时器,就是那个有8分频的时钟

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

2

SysTick时钟初始化代码

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

比如:

SysTick_Config(SystemCoreClock / 1000);

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

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

3

SysTick时钟源是来自哪里?

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

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

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

--来自参考手册

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

AHB时钟8分频

HCLK(内核)时钟


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

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

再次看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 << __NVIC_PRIO_BITS) - 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(内核)时钟。

4

STM32CubeMX...可选择1分频

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

(使用STM32CubeMX V5.1.0)

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

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2240

    文章

    10674

    浏览量

    348826
  • 时钟
    +关注

    关注

    10

    文章

    1480

    浏览量

    130306
  • Cortex
    +关注

    关注

    2

    文章

    194

    浏览量

    45758
  • Systick
    +关注

    关注

    0

    文章

    62

    浏览量

    12951
收藏 人收藏

    评论

    相关推荐

    STM32F030C8T6进入停止模式后所有时钟都停止了,为何SysTick还能工作?

    我在使用STM32F030C8T6,按照参考手册的说法,在停止模式全部时钟停止。没有了时钟SysTick应该也不再工作,但实际上SysTick
    发表于 04-16 07:22

    STM32CubeMX 6.5.0时钟配置页面的ADC时钟无法配置怎么解决?

    最新版STM32CubeMX 6.5.0,启动ADC功能后,时钟配置页面的ADC时钟仍无法配置。STM32CubeMX 6.4.0使用正常
    发表于 03-25 07:04

    STM32H723进不了systick中断的原因?怎么解决?

    STM32H723ZGT6使用时,无法进入systick中断,导致HSE时钟配置不成功,进入硬件故障
    发表于 03-12 07:11

    使用stm32l072cbt6作为系统时钟,为什么生成的代码对于systick的重装载值是按MSI计算的?

    首先说一下,我使用的是stm32l072cbt6这款芯片 我的时钟设置如图 但是生成后,我查代码发现systick重装载值是这样的 这样是代表我的系统时钟实际上是MSI吗,这个HA
    发表于 03-12 06:55

    ADuCM360 SysTick时钟怎么使能?

    使用SysTick做定时器,实际貌似SysTick不能运行,估计是没有提供时钟,ADuCM360时钟树如下图所示,找不到怎么打开内核
    发表于 01-12 06:05

    个人对STM32 SysTick的总结(寄存器操作)

    时钟一直递减,当他减到0的时候,重装载寄存器就会重新装载这只的值,计数器继续从这个值递减。二、相关寄存器:2.1SysTick->CTRL状态和控制寄存器位16:
    的头像 发表于 01-06 08:00 432次阅读
    个人对<b class='flag-5'>STM32</b> <b class='flag-5'>SysTick</b>的总结(寄存器操作)

    FreeRTOS中Systick的问题

    在Cortex-M内核中,系统节拍由Systick时钟提供,当配置好系统滴答时钟后,每次时钟中断就会触发中断处理数xPortSysTickHandler
    的头像 发表于 12-15 08:00 262次阅读
    FreeRTOS中<b class='flag-5'>Systick</b>的问题

    systick_handler无法进入怎么解决

    种情况下,我们需要采取一些措施来解决这个问题。 在解决这个问题之前,我们需要了解一下SysTick模块和其相关概念。 首先,SysTick是一个与外设模块时钟频率相对应的计数器,它通过加载一个初始值和递减计数来实现定时功能。当计
    的头像 发表于 12-01 15:36 1383次阅读

    STM32SysTick时钟来自哪里

    STM32SysTick时钟来自哪里
    的头像 发表于 10-26 15:58 977次阅读
    <b class='flag-5'>STM32</b>的<b class='flag-5'>SysTick</b><b class='flag-5'>时钟</b>源<b class='flag-5'>来自</b><b class='flag-5'>哪里</b>?

    如何使用来自LIRC的计时钟并每1秒产生中断

    应用程序:本文件描述如何使用来自LIRC的计时钟并每1秒产生中断。 BSP 版本:NANO100系列 BSP CMISIS V3.02.000 硬件
    发表于 09-01 06:13

    STM32L053R8T6TR在cubenxtim6无法选择时钟是为什么?

    使用的是STM32L053R8T6TR,再利用定时器触发ADC采样时选用tim6,但在cubenxtim6无法选择时钟,那他的时钟
    发表于 08-07 06:50

    STM32 SysTick配置函数

    之前使用SysTick滴答定时器都是通过查找内核编程手册配置寄存器让SysTick滴答定时器工作的。
    的头像 发表于 07-22 10:21 1139次阅读
    <b class='flag-5'>STM32</b> <b class='flag-5'>SysTick</b>配置函数

    STM32 SysTick中断使用方法

    SysTick中断属于核内外设中断器,中断号为-1。
    的头像 发表于 07-22 10:18 2038次阅读
    <b class='flag-5'>STM32</b> <b class='flag-5'>SysTick</b>中断使用方法

    浅析STM32 Systick查询定时的处理过程

    STM32处理器有一个24位的系统滴答定时器SysTick,它从重新加载值开始倒数到0,然后在下一个时钟边缘重新加载(包装到)STK_LOAD寄存器中的值,然后在随后的时钟上倒数。
    的头像 发表于 07-21 17:47 1175次阅读
    浅析<b class='flag-5'>STM32</b> <b class='flag-5'>Systick</b>查询定时的处理过程

    STM32时钟系统中的SysTick、FCLK、SYSCLK、PCLK和HCLK

    时钟信号好比是单片机的脉搏,了解STM32时钟系统是必要的,下图是STM32F1xx用户手册中的时钟系统结构图。
    发表于 06-15 17:07 3845次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>时钟</b>系统中的<b class='flag-5'>SysTick</b>、FCLK、SYSCLK、PCLK和HCLK