【STM32】SysTick系统滴答定时器

06-23 1153阅读

1.SysTick简介

CM4内核的处理和CM3一样,内部都包含了一个SysTick定时器,SysTick 是一个24 位的倒计数定时器,当计到0 时 ,将 从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息。

2.寄存器介绍

位段名称类型复位值描述
16COUNTFLAGR/W0如果在上次读取本寄存器后, SysTick 已经计到了0,则该位为1。
2CLKSOURCER/W0时钟源选择位, 0=AHB/8, 1=处理器时钟AHB
1TICKINTR/W01=SysTick 倒数计数到0时产生 SysTick异常请求, 0=数到0时无动作。也可以通过读取COUNTFLAG 标志位来确定计数器是否递减到0
0ENABLER/W0SysTick 定时器的使能位
  • 第0位:ENABLE,Systick 使能位 (0:关闭Systick功能;1:开启Systick功能)

  • 第1位:TICKINT,Systick 中断使能位 (0:关闭Systick中断;1:开启Systick中断)

  • 第2位:CLKSOURCE,Systick时钟源选择 (0:使用HCLK/8 作为Systick时钟;1:使用HCLK作为Systick时钟)

  • 第16位:COUNTFLAG,Systick计数比较标志,如果在上次读取本寄存器后,SysTick 已经数到了0,则该位为1。如果读取该位,该位将自动清零.

    SysTick 重装载数值寄存器

    位段名称类型复位值描述
    23:0RELOADR/W0当倒数计数至零时,将被重装载的值
    • Systick是一个递减的定时器,当定时器递减至0时,重载寄存器中的值就会被重装载,继续开始递减。STK_LOAD 重载寄存器是个24位的寄存器最大计数0xFFFFFF

      SysTick 当前数值寄存器

      位段名称类型复位值描述
      23:0CURRENTR/W0读取时返回当前倒计数的值, 写它则使之清零, 同时还会清除在 SysTick 控制及状态寄存器中的 COUNTFLAG 标志
      • 也是个24位的寄存器,读取时返回当前倒计数的值,写它则使之清零,同时还会清除在SysTick 控制及状态寄存器中的COUNTFLAG 标志。

        3.标准库函数介绍

        在misc.c文件中
        /**
          * @brief  Configures the SysTick clock source.
          * @param  SysTick_CLKSource: specifies the SysTick clock source.
          *   This parameter can be one of the following values:
          *     @arg SysTick_CLKSource_HCLK_Div8: AHB clock divided by 8 selected as SysTick clock source.
          *     @arg SysTick_CLKSource_HCLK: AHB clock selected as SysTick clock source.
          * @retval None
          */
        void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
        {
          /* Check the parameters */
          assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));
          if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
          {
            SysTick->CTRL |= SysTick_CLKSource_HCLK;
          }
          else
          {
            SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
          }
        }
        
        在core_cm4.h文件中
        /** \brief  System Tick Configuration
            The function initializes the System Timer and its interrupt, and starts the System Tick Timer.
            Counter is in free running mode to generate periodic interrupts.
            \param [in]  ticks  Number of ticks between two interrupts.
            \return          0  Function succeeded.
            \return          1  Function failed.
            \note     When the variable __Vendor_SysTickConfig is set to 1, then the
            function SysTick_Config is not included. In this case, the file device.h
            must contain a vendor-specific implementation of this function.
         */
        __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
        {
          if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) { return (1UL); }    /* Reload value impossible */
          SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */
          NVIC_SetPriority (SysTick_IRQn, (1UL VAL   = 0UL;                                             /* 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 (0UL);      /* Function successful */
        }
        

        4.滴答定时器验证

        我们可以做一个简单实验。配置好滴答定时器后,在其中断函数中控制一个GPIO的输出翻转,然后使用示波器监测。

        	
        //配置SysTick的时钟,这个没有分频,所以就是HCLK
        	SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
        	
        	//SysTick时钟是168MHz
        	//所以1个计数就是(1/168)us
        	//如果需要1us时间,则需要168个计数
        	//如果需要1ms时间,则需要168*1000个计数
        	//如果需要1s时间,则需要168*1000000个计数
        	SysTick_Config(SystemCoreClock/1000);//1ms一个中断
        
        /**
          * @brief  This function handles SysTick Handler.
          * @param  None
          * @retval None
          */
        void SysTick_Handler(void)
        {
           TOGGLE_PWM2_STATUS();//控制一个GPIO翻转
        }
        

        关于SystemCoreClock,定义在system_stm32f4xx.c

        #if defined(STM32F40_41xxx)
          uint32_t SystemCoreClock = 168000000;
        #endif /* STM32F40_41xxx */
        

        【STM32】SysTick系统滴答定时器

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]