【STM32】SysTick系统滴答定时器

1.SysTick简介

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

2.寄存器介绍

位段 名称 类型 复位值 描述
16 COUNTFLAG R/W 0 如果在上次读取本寄存器后, SysTick 已经计到了0,则该位为1。
2 CLKSOURCE R/W 0 时钟源选择位, 0=AHB/8, 1=处理器时钟AHB
1 TICKINT R/W 0 1=SysTick 倒数计数到0时产生 SysTick异常请求, 0=数到0时无动作。也可以通过读取COUNTFLAG 标志位来确定计数器是否递减到0
0 ENABLE R/W 0 SysTick 定时器的使能位
  • 第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:0 RELOAD R/W 0 当倒数计数至零时,将被重装载的值
  • Systick 是一个递减的定时器,当定时器递减至0 时,重载寄存器中的值就会被重装载,继续开始递减。STK_LOAD 重载寄存器是个24 位的寄存器最大计数0xFFFFFF

SysTick 当前数值寄存器

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

3.标准库函数介绍

c 复制代码
在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;
  }
}
c 复制代码
在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 <b>__Vendor_SysTickConfig</b> is set to 1, then the
    function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>
    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 << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
  SysTick->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的输出翻转,然后使用示波器监测。

c 复制代码
	

//配置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一个中断
c 复制代码
/**
  * @brief  This function handles SysTick Handler.
  * @param  None
  * @retval None
  */
void SysTick_Handler(void)
{
   TOGGLE_PWM2_STATUS();//控制一个GPIO翻转
}

关于SystemCoreClock,定义在system_stm32f4xx.c

c 复制代码
#if defined(STM32F40_41xxx)
  uint32_t SystemCoreClock = 168000000;
#endif /* STM32F40_41xxx */
相关推荐
善 .2 小时前
单片机的内存是指RAM还是ROM
单片机·嵌入式硬件
超级码农ProMax2 小时前
STM32——“SPI Flash”
stm32·单片机·嵌入式硬件
Asa3192 小时前
stm32点灯Hal库
stm32·单片机·嵌入式硬件
end_SJ4 小时前
初学stm32 --- 外部中断
stm32·单片机·嵌入式硬件
gantengsheng5 小时前
基于51单片机和OLED12864的小游戏《贪吃蛇》
单片机·嵌入式硬件·游戏·51单片机
嵌入式小强工作室6 小时前
stm32 查找进硬件错误方法
stm32·单片机·嵌入式硬件
委员6 小时前
基于NodeMCU的物联网窗帘控制系统设计
单片机·mcu·物联网·智能家居·iot
wenchm6 小时前
细说STM32F407单片机DMA方式读写SPI FLASH W25Q16BV
stm32·单片机·嵌入式硬件
南城花随雪。6 小时前
单片机:实现自动关机电路(附带源码)
单片机·嵌入式硬件
逝灮7 小时前
【蓝桥杯——物联网设计与开发】拓展模块4 - 脉冲模块
stm32·单片机·嵌入式硬件·mcu·物联网·蓝桥杯·脉冲测量