Systick定时器详解

发布时间 2023-09-20 14:25:31作者: 一步一磕头的菜鸡

一.SysTick简介

1. SysTick概念

  • Systick属于系统内核中的外设, 其详细使用说明和寄存器介绍都在M3权威指南手册中.
  • Systick内嵌在NVIC中, 系统定时器是一个24bit的向下递减的计数器, 计数器每计数一次的时间为1/SYSCLK,一般我们设置系统时钟SYSCLK等于72M。

2. Systick寄存器

  • 如图蓝色标记的为SysTick中比较重要的寄存器, 对应校准数值的不常用.

二. 代码详解

1. 寄存器方式驱动

  • 值得注意的是系统这里将优先级设置为15, 这里可以根据我们的分组设置来对其进行拆分, 进而判断其优先级. 假如我们分组为2, 那么Systick为(11:11即3:3)在同分组下优先级最低.
/*
核心结构体
typedef struct
{
  __IO uint32_t CTRL;                         /*!< Offset: 0x00  SysTick Control and Status Register */
  __IO uint32_t LOAD;                         /*!< Offset: 0x04  SysTick Reload Value Register       */
  __IO uint32_t VAL;                          /*!< Offset: 0x08  SysTick Current Value Register      */
  __I  uint32_t CALIB;                        /*!< Offset: 0x0C  SysTick Calibration Register        */
} SysTick_Type;

*/


__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
    // 不可能的重装载值,超出范围
    if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) {
        return (1UL);
    }

    // 设置重装载寄存器
    SysTick->LOAD  = (uint32_t)(ticks - 1UL);

    // 设置中断优先级
    NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL);

    // 设置当前数值寄存器
    SysTick->VAL   = 0UL;

    // 设置系统定时器的时钟源为AHBCLK=72M
    // 使能系统定时器中断
    // 使能定时器
    SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                    SysTick_CTRL_TICKINT_Msk   |
                    SysTick_CTRL_ENABLE_Msk;
    return (0UL);
}

2. 固件库方式驱动

  • 值得注意的是, 这里两个配置的先后顺序不能乱, 要先配置计数初值再配置时钟源. 否则如果先配置时钟源, 再配置初值时候内部会将时钟源重新初始化为72M.
  • 多长时间进一次中断: 1/(时钟频率/计数初值). 1/(900000/720000) = 0.08s = 80ms进一次中断. 80 * 100 = 8000ms = 8s闪一次灯.
#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_key.h"

int main()
{
    Led_GPIO_Config();
    
    SysTick_Config(720000); //每1s进一次中断
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
}


void SysTick_Handler(void)
{
    static uint16_t count = 0;
    count ++;
    if(count >= 100)
    {
        LED_TOGGLE;
        count = 0;
    }
    
}