关于对stm32 的systick 的理解

时间:2024-04-06 08:18:58

首先看一下stm32l51的clock tree, 并且有这样一段描述:

关于对stm32 的systick 的理解

systick有两个时钟源,一个是HCLD/8(即SysTick_CLKSource_HCLK_Div8), 

                                      另一个是HCLK.(即SysTick_CLKSource_HCLK)

下图clock tree图黄色部分也标出了这两个时钟源。

关于对stm32 的systick 的理解

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);