STM32的Systick时钟

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27312943/article/details/80225088

参考资料:《零死角玩转STM32F103-霸道》

1 Systick时钟简介

 SysTick—系统定时器是属于CM3内核中的一个外设,内嵌在NVIC中。系统定时器是
一个
24bit 的向下递减的计数器,计数器每计数一次的时间为1/SYSCLK,一般我们设置系
统时钟
SYSCLK 等于 72M。当重装载数值寄存器的值递减到 0 的时候,系统定时器就产生
一次中断,以此循环往复。

 SysTick是属于CM3内核的外设,所以所有基于CM3内核的单片机都具有这个系
统定时器,使得软件在
CM3 单片机中可以很容易的移植。系统定时器一般用于操作系统,
用于产生时基,维持操作系统的心跳

2 Systick寄存器介绍

 SysTick系统定时器有4个寄存器

寄存器名称 寄存器描述
CTRL Systick控制及状态寄存器
LOAD Systick重装载数值寄存器
VAL Systick当前数组寄存器
CALIB Systick校准寄存器

3 软件设计 

  SysTick属于内核的外设,有关的寄存器定义和库函数都在内核相关的库文件core_cm3.h 

static __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 */
}

  形参 ticks 用来设置重装载寄存器的值,最大不能超过重装载寄存器的值2的24次方,当重装载寄存器的值递减到0的时候产生中断,然后重装载寄存器的值又重新装载往下递减计数,以此循环往复。紧随其后设置好中断优先级,最后配置系统定时器的时钟等于 AHBCLK=72M,使能定时器和定时器中断,这样系统定时器就配置好了,一个库函数搞定。


4 Systick定时时间的计算

 SystemFrequency /1000     1ms中断一次
 SystemFrequency / 100000   10us中断一次
 SystemFrequency / 1000000  1us中断一次 

5 使用Systick编写简单的延时函数

  延时微秒级函数

void SysTick_us( __IO uint32_t us)
{
    uint32_t i;
	  SysTick_Config(SystemCoreClock/1000000);
    for(i=0;i<us;i++)
		{
		    while( !((SysTick->CTRL)&(1<<16)) );
		}
    //关闭Systick定时器
   SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}

      延时毫秒级函数

void SysTick_ms(__IO uint32_t ms)
{
    uint32_t i;
	  SysTick_Config(SystemCoreClock/1000);
    for(i=0;i<ms;i++)
		{
		    while( !((SysTick->CTRL)&(1<<16)) );
		}
    //关闭Systick定时器
		SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}

  注意,由于Systick时钟设置了中断,所以要在stm32f10x_it.c中添加Systick的中断响应函数

void SysTick_Handler(void)
{
	
}
  在中断响应函数中什么也不用做即可

6 小结

  之前一直不知道Systick时钟在初始化的时候配置了中断,没有添加中断响应函数。






猜你喜欢

转载自blog.csdn.net/qq_27312943/article/details/80225088