STM32的SysTick时钟源来自哪里?

STM32的SysTick时钟源来自哪里?_第1张图片

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


引伸:

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


1写在前面

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


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

STM32的SysTick时钟源来自哪里?_第2张图片


但是,我们实际应用中,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位来选择:STM32的SysTick时钟源来自哪里?_第3张图片



再次看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分频)?STM32的SysTick时钟源来自哪里?_第4张图片

(使用STM32CubeMX V5.1.0)


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


然后,我又查看手册,RCC时钟树中的这个位置是固定『/8』,也没有看到可『/1』的说明。STM32的SysTick时钟源来自哪里?_第5张图片


这里就留下一个问题:

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

640?

1.顶尖专家戳穿媒体谎言:5G宣传大部分是假的!

2.2019年3月编程语言排行榜:Java霸居榜首,Python稳住第三

3.深度学习寒冬论作者再发文:AI和区块链一样,都是死路一条!

4.用心来学习STM32CubeMX,你会有不一样的收获!

5.谁杀死了芯片?

6.STM32芯片异常复位,该怎么办?

STM32的SysTick时钟源来自哪里?_第6张图片

本文来自个人微信公众号「ID:strongerHuang」,经原作者授权发布。原文公众号由嵌入式工程师「strongerHuang」在精心整理并维护。专注分享的内容包含:Keil、IAR、STM8、STM32、μC/OS、FreeRTOS、CANOpen、ModBus...

你可能感兴趣的:(STM32的SysTick时钟源来自哪里?)