STM32
登录
直播中
刘桂英
7年用户
1167经验值
私信
关注
[问答]
为什么STM32CubeMX中Cortex系统定时器可选择1分频
开启该帖子的消息推送
定时器
Cortex
stm32cubemx
Sys
ti
ck时钟源是来自哪里?
为什么
STM32
CubeMX中Cortex系统定时器可选择1分频(和8分频)?
回帖
(1)
武文嘉
2021-11-24 15:55:49
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』的说明。
这里就留下一个问题:
你认为STM32CubeMX配置Cortex系统定时器时钟是有Bug吗?
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』的说明。
这里就留下一个问题:
你认为STM32CubeMX配置Cortex系统定时器时钟是有Bug吗?
举报
更多回帖
rotate(-90deg);
回复
相关问答
定时器
Cortex
stm32cubemx
STM32
的SysTick时钟源是来自
Cortex
系统
定时器
吗
2021-11-24
516
学习分享
STM32
时钟
系统
小结
2018-09-25
1023
STM32
的SysTick时钟源到底是从哪来呢
2021-11-24
900
STM32CubeMX
基本
定时器
接口怎么使用?
2021-11-24
434
STM32
中
定时器
的时钟源是什么?
2021-11-24
630
STC12单片机
定时器
中断12
分频
改为
1
分频
时的问题
2015-03-07
12827
怎样使用
STM32cubemx
去配置通用
定时器
呢
2021-10-22
1359
怎样使用
Stm32CubeMx
基本
定时器
去驱动一个流水灯
定时
亮灭呢
2021-11-23
1113
STM32CubeMX
FreeRTOS的软件
定时器
如何实验
2021-10-13
799
STM32CubeMX
基础
定时器
TIM6有何功能呢
2021-11-24
800
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分