关于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分频,延时的效果就恢复正常了。