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

因为STM32CubeMX会启动SysTick作为延时(HAL_Delay)函数的时基,而SysTick作为Cortex内核的一部分,就会用到Cortex系统定时器。
那么,问题就来了SysTick时钟源来自哪里?
1、数据手册和STM32CubeMX时钟树
数据手册时钟树:

STM32CubeMX时钟树:

你会发现:数据手册中的只有『/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位来选择:

再次看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分频,为啥生成代码一样?

难道,STM32CubeMX配置Cortex系统定时器时钟是有Bug吗?
关键字:STM32 SysTick 时钟源
引用地址:
STM32的SysTick时钟源来自哪里?
推荐阅读最新更新时间:2026-03-25 11:21
STM32的SysTick时钟源来自哪里?
STM32CubeMX中Cortex系统定时器(System Timer)选择1分频和8分频,为啥生成代码一样? 因为STM32CubeMX会启动SysTick作为延时(HAL_Delay)函数的时基,而SysTick作为Cortex内核的一部分,就会用到Cortex系统定时器。 那么,问题就来了SysTick时钟源来自哪里? 1、数据手册和STM32CubeMX时钟树 数据手册时钟树: STM32CubeMX时钟树: 你会发现:数据手册中的只有『/8』分频,而STM32CubeMX除了『/8』分频,还有『/1』分频。 2、SysTick时钟初始化代码 不管是使用标准外设库,还是HAL库,你初始化SysTick,都会调
[单片机]
详解STM32中定时器的时钟源
STM32中有多达8个定时器,其中TIM1和TIM8是能够产生三对PWM互补输出的高级定时器,常用于三相电机的驱动,它们的时钟由APB2的输出产生。其它6个为普通定时器,时钟由APB1的输出产生。 定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器,图中的蓝色部分。 下面以定时器2~7的时钟说明这个倍频器的作用:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当 APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1的频率两倍。 假定AHB=36MHz,因为APB1允许的最大频率为3
[单片机]
stm32内部时钟有哪些时钟源 stm32使用内部时钟配置教程
stm32内部时钟有哪些时钟源 在STM32中,可以用内部时钟,也可以用外部时钟,在要求进度高的应用场合最好用外部晶体震荡器,内部时钟存在一定的精度误差。 内部时钟有2个时钟源可以选分别是HSI、LSI、(内部高速,内部低速,),高速时钟主要用于系统内核和总线上的外设时钟。低速时钟主要用于独立看门狗IWDG、实时时钟RTC。 1、HSI是高速内部时钟,RC振荡器,频率为8MHz,上电后默认的系统时时钟 SYSCLK = 8MHz,Flash编程时钟。 2、LSI是低速内部时钟,RC振荡器,频率为40kHz,可用于独立看门狗IWDG、实时时钟RTC。 使用时需要注意 注释掉这个SystemInit(); 时钟配置函数 //配
[单片机]
一图搞懂单片机STM32的5个时钟源知识!
众所周知STM32有5个时钟源HSI、HSE、LSI、LSE、PLL,其实他只有四个,因为从上图中可以看到PLL都是由HSI或HSE提供的。 其中,高速时钟(HSE和HSI)提供给芯片主体的主时钟.低速时钟(LSE和LSI)只是提供给芯片中的RTC(实时时钟)及独立看门狗使用,图中可以看出高速时钟也可以提供给RTC。 内部时钟是在芯片内部RC振荡器产生的,起振较快,所以时钟在芯片刚上电的时候,默认使用内部高速时钟。而外部时钟信号是由外部的晶振输入的,在精度和稳定性上都有很大优势,所以上电之后我们再通过软件配置,转而采用外部时钟信号. 高速外部时钟(HSE):以外部晶振作时钟源,晶振频率可取范围为4~16MHz,我们
[单片机]
STM32的5个时钟源知识
众所周知STM32有5个时钟源HSI、HSE、LSI、LSE、PLL,其实他只有四个,因为从上图中可以看到PLL都是由HSI或HSE提供的。 其中,高速时钟(HSE和HSI)提供给芯片主体的主时钟.低速时钟(LSE和LSI)只是提供给芯片中的RTC(实时时钟)及独立看门狗使用,图中可以看出高速时钟也可以提供给RTC。 内部时钟是在芯片内部RC振荡器产生的,起振较快,所以时钟在芯片刚上电的时候,默认使用内部高速时钟。而外部时钟信号是由外部的晶振输入的,在精度和稳定性上都有很大优势,所以上电之后我们再通过软件配置,转而采用外部时钟信号. 高速外部时钟(HSE):以外部晶振作时钟源,晶振频率可取范围为4~16
[单片机]
关于STM32时钟源及配置等相关知识笔记
1,时钟源 HSI HSE LSI LSE PLL MSI (L系列特有) 2,主要的几个时钟 SYSCLK --- 系统时钟 PLLCLK --- 锁相环时钟 HCLK --- AHB总线时钟 PCLK1 --- APB1总线时钟 PCLK2 --- APB2总线时钟 3,各时钟来源 SYSCLK,系统时钟来源,可直接选择HSI,HSE,MSI直接作为系统时钟源,也可经过PLL倍频输出后的PLL作为系统时钟。 PLLCLK,锁相环时钟,一般是HSI,HSE,MSI时钟经过锁相环倍频后的输出时钟。 HCLK, AHB总线时钟,经过SYSCLK预分频后的输出时钟。 PCLK1,外设低速时钟,经过HC
[单片机]
STM32普通定时器(TIM2-7)的时钟源
iframe id="iframe_0.9722621580585837" src="data:text/html;charset=utf8,%3Cstyle%3Ebody%7Bmargin:0;padding:0%7D%3C/style%3E%3Cimg%20id=%22img%22%20src=%22http://img.ph.126.net/Q5uD6HNVvCLylT0oKY6Z2w==/3353492872531932260.jpg?_=2389336&_=6218048%22%20style=%22border:none;max-width:1058px%22%3E%3Cscript%3Ewindow.onload%2
[单片机]
STM32 RTC时钟源LSE
一开始,所有实验都是在神舟板上去完成,根本就没有发现RTC的问题。直到我们自己画板来后调试时,才发现STM32 RTC的外部时钟源存在问题。 这也算是STM32的一个鸡肋,对于LSE外部晶振太过于苛刻,手册上要求使用6pf,这个规格的晶振市场上太少,鱼龙混杂,中招的高手菜鸟不在少数。我们自己的板也是如此,几经波折,反反复复尝试使用不同的规格的晶振,替换外部的电容,电阻都没有能让这个32.768K的LSE起振。但是又需要有RTC来提供时间,考虑的方法主要有2种,第一采用外部RTC时钟芯片,如DS1302。第二是使用内部其它的时钟源来提供RTC时钟。毫无疑问,目前板已经制好,添加时钟芯片肯定造成板上布局更改,还得重新打板,这里采用了第二
[单片机]