首先看一下stm32l51的clock tree, 并且有这样一段描述:
systick有两个时钟源,一个是HCLD/8(即SysTick_CLKSource_HCLK_Div8),
另一个是HCLK.(即SysTick_CLKSource_HCLK)
下图clock tree图黄色部分也标出了这两个时钟源。
SysTick_Config(uint32_t ticks); 里面的参数是定义Number of ticks between two interrupts
假如时钟是16MHz, 即SystemCoreClock= 16 000 000,SysTick_Config(SystemCoreClock/1000) ,也就是two interrupts之间是16000个tick, 而时钟频率是16 000 000Hz, 即要16000 个T=(1/ 16000000)s 中断一下,即 1/1000秒后中断一下,也就是1ms中断一下。这样就是1ms的定时器。
另外,关于systick时钟源的配置,还参考了下面的文章才看懂的。
https://bbs.csdn.net/topics/370042452
看一下这个函数的原型定义:
tatic __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */
SysTick->VAL = 0; /* 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 (0); /* Function successful */
}
/*********************************************************************************/
说明:
(1)控制寄存器 SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk;
此时SysTick时钟为系统时钟即SysTick_CLKSource_HCLK;
(2)控制寄存器 SysTick->CTRL =
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk;
此时SysTick时钟为系统时钟8分频即SysTick_CLKSource_HCLK_Div8
SysTick_Config(uint32_t ticks)此函数应经对时钟进行了选择,固定为系统时钟 。
如果想让自己对systick的时钟源定义有效,需要按照下面的顺序进行定义:
SysTick_Config(16000);
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);