关于STM32配置SysTick时钟的问题

关于STM32配置SysTick时钟的问题


编写SysTick函数的时候用到下面两个函数:

①第一条摘自core_cm3.h 第1685行代码

static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /ticks不可能超过0xFFFFFF的值/

SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /设置LOAD寄存器 /
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /设置Systick中断优先级/
SysTick->VAL = 0; /
清除VAL寄存器 /
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; /使能SysTick中断并使能Systick时钟 /
return (0); /
ojbk /
}

②第二条摘自V3.5库函数里的misc.c 第199行代码

void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
{
assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource)); //检查参数有效性
if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
{
SysTick->CTRL |= SysTick_CLKSource_HCLK; //使用FCLK时钟,即72MHZ
}
else
{
SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8; //使用AHB的时钟的8分频
}
}

在配置SysTick函数的时候,调用上面两个函数会出现一个问题,即明明我调用了8分频,但延时的出来效果是错的,频率明明还是72M,没有分频作用!

这里值得注意的是:SysTick_Config(uint32_t ticks)函数里的Bit2位是置1的,即使用了FCLK时钟(72MHZ)位在这里插入图片描述
在这里插入图片描述

如果是先调用SysTick_CLKSourceConfig函数设置8分频,再调用SysTick_Config函数,将会使CTRL寄存器的Bit2位置0之后,又置回1,等于还是使用FCLK作为SysTick的时钟源,效果是延时时间缩减了1/8!

所以正确顺序是先调用SysTick_Config函数,再调用SysTick_CLKSourceConfig函数,这样才能真正地使用了8分频,延时的效果就恢复正常了。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值