系统时钟滴答计时器(sysTick寄存器)相关初始化结构体即初始化固件库函数分析

时间:2021-02-28 19:48:08

系统时钟计时器–SYSTICK

sysTick工作原理:

- sysTick 中断通过获取系统时钟(AHB 或者 AHB/8),通过重装载寄存器向递减计数器中存入初值,当递减计数器值为0时,触发相关的中断,我们也可以通过访问 SysTick->CTRL寄存器的第16位来判断是否计数完成(当递减计数器当前值为0时,该位置1,当该位被读取后,会自动清0)

  • sysTick 中断属于内核层次的外设,他的库函数编写在 core_cm3.h 文件中,其中递减计数器和重载载寄存器都只有24位可以使用,即最大值为* 2^24*
  • 内核外设中断优先级并不一定比普通外设中断优先级高,如系统时钟滴答中断,在下面的函数中,设置优先级为15,即 1111,此时优先级是最低的!内核外设中断的优先级分组和普通外设中断分组相同,即只要只需要设置普通外设中断优先级分组即代表设置了内核中断优先级分组!
  • 初始化系统滴答寄存器,就是配置下面的结构体!
typedef struct
{
  __IO uint32_t CTRL;                         /*控制及状态寄存器*/
  __IO uint32_t LOAD;                         /*重装载数值寄存器*/
  __IO uint32_t VAL;                          /*当前数值寄存器*/
  __I  uint32_t CALIB;                        /*校验寄存器*/
} SysTick_Type;
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{ 
    // 判断如果传入的数值大于递减计数器的最大值,则返回1!
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */

    //设置重装载寄存器的初值!
  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */

    //设置内核中断优先级,它的分组跟外设分组一样,这里设置为15,即 1111 ,中断优先级最低!
    NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */

    //设置递减计数器当前值为0
    SysTick->VAL   = 0;                                         /* Load the SysTick Counter Value */

    // 接收时钟信号为AHB时钟信号72M
    // 使能中断,计数到0,触发中断
    // 使能sysTick寄存器中的计数位!
    SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | 
                   SysTick_CTRL_TICKINT_Msk   | 
                   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
  return (0);                                                  /* Function successful */
}
  • 系统中断滴答,计时公式为: t = reload * (1 / clk); 如果 clk = 72M,那么
    • reload = 72, t = 1us
    • reload = 72000, t = 1ms