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

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

3天内不再提示

STM32的SysTick时钟源来自哪里?

jf_pJlTbmA9 来源: strongerHuang 作者: strongerHuang 2023-10-26 15:58 次阅读

作者 | strongerHuang

微信公众号 | 嵌入式专栏

STM32CubeMX中Cortex系统定时器(System Timer)选择1分频和8分频,为啥生成代码一样?

wKgaomUD8sCAFtOAAAL7suZbWz8548.png

因为STM32CubeMX会启动SysTick作为延时(HAL_Delay)函数的时基,而SysTick作为Cortex内核的一部分,就会用到Cortex系统定时器。

那么,问题就来了SysTick时钟源来自哪里?

1、数据手册和STM32CubeMX时钟树

数据手册时钟树:

wKgZomUD8sOARBKbAAPKIZokRjk327.png

STM32CubeMX时钟树:

wKgaomUD8sCAFtOAAAL7suZbWz8548.png

你会发现:数据手册中的只有『/8』分频,而STM32CubeMX除了『/8』分频,还有『/1』分频。

2、SysTick时钟初始化代码

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

标准库常用初始化:

SysTick_Config(SystemCoreClock / 1000);

HAL库初始化同样也是调用底层的初始化函数:

uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb) { return SysTick_Config(TicksNumb); }

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

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

3、SysTick时钟源是来自哪里?

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

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

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

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

AHB时钟8分频

HCLK(内核)时钟

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

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

wKgZomUD8suAMwIbAAY63l3RHYg009.png

再次看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 */ } (在core_cm3.h,或者core_cm4.h等内核源码中)

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

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

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

4、最后

开篇的问题:STM32CubeMX中Cortex系统定时器(System Timer)选择1分频和8分频,为啥生成代码一样?

wKgZomUD8s-ALT2gAAMOmD7GTZo317.png

难道,STM32CubeMX配置Cortex系统定时器时钟是有Bug吗?

来源:嵌入式专栏
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理

审核编辑 黄宇


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

    关注

    2264

    文章

    10852

    浏览量

    354100
  • 时钟源
    +关注

    关注

    0

    文章

    92

    浏览量

    15915
  • Systick
    +关注

    关注

    0

    文章

    62

    浏览量

    13029
收藏 人收藏

    评论

    相关推荐

    ADuCM360 SysTick时钟怎么使能?

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

    使用FreeRTOS时Systick时钟的配置分享

    时钟会被默认选择为STM32的内核时钟,而不能选择外部时钟。原因就是当rtos启动时(vTaskStartScheduler();这个函
    发表于 07-30 11:39

    STM32SysTick时钟来自Cortex系统定时器吗

    置顶/星标公众号,不错过每一条消息!有位朋友在后台大概问了这样一个问题:STM32SysTick时钟来自Cortex系统定时器吗?引伸
    发表于 08-19 08:19

    STM32SysTick时钟

    有位朋友在后台大概问了这样一个问题:STM32SysTick时钟来自Cortex系统定时器吗?引伸:为什么
    发表于 08-19 06:47

    STM32SysTick时钟到底是从哪来呢

    STM32SysTick时钟来自哪里STM32
    发表于 11-24 08:05

    STM32SysTick时钟来自Cortex系统定时器吗

    STM32SysTick时钟来自Cortex系统定时器吗?为什么STM32CubeMX中C
    发表于 11-24 07:24

    STM32SysTick时钟来自Cortex系统定时器吗?

    初始化调用这段代码之后,SysTick将会实现1ms中断一次。这段代码实现1ms中断一次相信大家都能理解,但是这里SysTick初始化和上面说的时钟『/8』有关系吗?
    的头像 发表于 04-03 13:54 5333次阅读
    <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>Cortex系统定时器吗?

    什么是SysTick定时器?实现STM32时钟系统的详细资料说明

    什么是SysTick定时器?实现STM32时钟系统的详细资料说明主要内容包括了:Systick原理和配置方法,ALIENTEK 延时函数delay讲解
    发表于 01-02 08:00 3次下载
    什么是<b class='flag-5'>SysTick</b>定时器?实现<b class='flag-5'>STM32</b><b class='flag-5'>时钟</b>系统的详细资料说明

    STM32中的SysTick时钟来自哪里

    STM32SysTick时钟来自哪里
    的头像 发表于 03-03 14:32 7763次阅读

    STM32学习笔记:系统滴答时钟SysTick

    目录1、什么是时钟2、STM32时钟SysTick是一个系统时钟定时器,属于ARM Cortex-Mx内核的一个“内设”,所有基于此内核的
    发表于 11-29 09:51 0次下载
    <b class='flag-5'>STM32</b>学习笔记:系统滴答<b class='flag-5'>时钟</b><b class='flag-5'>SysTick</b>

    STM32—关于SYSTICK系统时钟的详解及学习笔记

    SysTick_Handler中也无需对中断标志进行清零(参考exit外部中断服务函数)2.要注意的是关于systick其实有两个关键函数,SySTick_Config,SysTick
    发表于 11-30 15:51 15次下载
    <b class='flag-5'>STM32</b>—关于<b class='flag-5'>SYSTICK</b>系统<b class='flag-5'>时钟</b>的详解及学习笔记

    STM32F103:精准延时delay——SysTick使用

    处理器的微控制器都可以由这个定时器获得一定的时间间隔。2. SysTick相关寄存器状态寄存器-CTRLSTCLK外部时钟:AHB总线时钟的 1/8FCLK 内部
    发表于 12-02 18:36 10次下载
    <b class='flag-5'>STM32</b>F103:精准延时delay——<b class='flag-5'>SysTick</b>使用

    17、STM32——SysTick详解

    。不过,STCLK 的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能会大不相同,你需要查找芯片的器件手册来决定选择什么作为时钟。Cortex-M3 的内核中包含一个 SysTic
    发表于 12-23 19:56 0次下载
    17、<b class='flag-5'>STM32</b>——<b class='flag-5'>SysTick</b>详解

    初学stm32-Systick滴答时钟定时

    系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。比如uCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做uCOS心跳时钟
    发表于 12-31 19:46 15次下载
    初学<b class='flag-5'>stm32-Systick</b>滴答<b class='flag-5'>时钟</b>定时

    一文详解STM32的嘀嗒时钟(SysTick)

    嘀嗒时钟SysTick)是一个简单的系统时钟节拍计数器,它属于Cortex-M4内核嵌套向量中断控制器(NVIC)里的一个功能单元。他是一个24位的倒计时定时器(在NVIC中),当systi
    的头像 发表于 01-19 18:11 1.3w次阅读
    一文详解<b class='flag-5'>STM32</b>的嘀嗒<b class='flag-5'>时钟</b>(<b class='flag-5'>SysTick</b>)