关于STM32的systick定时器的详细说明

SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。

Cortex‐M3处理器内部包含了一个简单的定时器。因为所有的CM3芯片都带有这个定时器,软件在不同 CM3器件间的移植工作得以化简。该定时器的时钟源可以是内部时钟(FCLK,CM3上的自由运行时钟),或者是外部时钟( CM3处理器上的STCLK信号)。不过,STCLK的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能会大不相同,你需要检视芯片的器件手册来决定选择什么作为时钟源。(知道我为什么找ST关于systick的说明了吧)。

下面介绍STM32中的systick,Systick 部分内容属于NVIC控制部分,一共有4个寄存器,名称和地址分别是:

STK_CSR,        0xE000E010  --  控制寄存器 
STK_RELOAD,     0xE000E014  --  重载寄存器 
STK_VAL,        0xE000E018  --  当前值寄存器 
STK_CALRB,   0xE000E01C  --   校准值寄存器

首先看STK_CSR控制寄存器:寄存器内有4个位t具有意义

第0位:ENABLE,Systick 使能位 (0:关闭Systick功能;1:开启Systick功能) 
第1位:TICKINT,Systick 中断使能位 (0:关闭Systick中断;1:开启Systick中断) 
第2位:CLKSOURCE,Systick时钟源选择 (0:使用HCLK/8 作为Systick时钟;1:使用HCLK作为Systick时钟) 
第3位:COUNTFLAG,Systick计数比较标志,如果在上次读取本寄存器后,SysTick 已经数到了0,则该位为1。如果读取该位,该位将自动清零

STK_RELOAD  重载寄存器:

Systick是一个递减的定时器,当定时器递减至0时,重载寄存器中的值就会被重装载,继续开始递减。STK_RELOAD  重载寄存器是个24位的寄存器最大计数0xFFFFFF。

STK_VAL当前值寄存器:

也是个24位的寄存器,读取时返回当前倒计数的值,写它则使之清零,同时还会清除在SysTick 控制及状态寄存器中的COUNTFLAG 标志。

STK_CALRB  校准值寄存器:

这个寄存器好像目前的水平我还用不到,大体意思明白点,把英文说明放这吧:

位31 NOREF :1=没有外部参考时钟(STCLK 不可用)0=外部参考时钟可用

位30 SKEW:1=校准值不是准确的1ms 0=校准值是准确的1ms

位[23:0] :Calibration value

Indicates the calibration value when the SysTick counter runs on HCLK max/8 as external clock. The value is product dependent, please refer to the Product Reference Manual, SysTick Calibration Value section. When HCLK is programmed at the maximum frequency, the SysTick period is 1ms. If calibration information is not known, calculate the calibration value required from the frequency of the processor clock or external clock.

SysTick定时器除了能服务于操作系统之外,还能用于其它目的:如作为一个闹铃,用于测量时间等。要注意的是,当处理器在调试期间被喊停(halt)时,则SysTick定时器亦将暂停运作。

下面我们就应用SysTick定时器来裸奔,把它作为一个定时器来用,还是老一套,在寄存器头文件中添加定义寄存器:

//*****************************************************************

//* SystemTick-Register

//*******************************************************************

#define SYSTICK_TENMS (*((volatile unsigned long *)0xE000E01C))

#define SYSTICK_CURRENT (*((volatile unsigned long *)0xE000E018))

#define SYSTICK_RELOAD (*((volatile unsigned long *)0xE000E014))

#define SYSTICK_CSR (*((volatile unsigned long *)0xE000E010))

配置systick寄存器:

void SysTick_Configuration(void)

{

  SYSTICK_CURRENT=0; //当前值寄存器

  SYSTICK_RELOAD=20000; //重装载寄存器,系统时钟20M,中断一次1mS

  SYSTICK_CSR|=0x06;// HCLK作为Systick时钟,Systick中断使能位

}

中断处理:

void SysTick_Handler(void) //中断函数

{

  extern unsigned long TimingDelay; // 延时时间,注意定义为全局变量

  SYSTICK_CURRENT=0;

  if (TimingDelay != 0x00)

  TimingDelay--;

}

利用systick的延时函数:

unsigned long TimingDelay; // 延时时间,注意定义为全局变量

void Delay(unsigned long nTime) //延时函数

{

  SYSTICK_CSR|=0x07; // 使能SysTick计数器

  TimingDelay = nTime; // 读取延时时间

  while(TimingDelay != 0); // 判断延时是否结束

  SYSTICK_CSR|=0x06;// 关闭SysTick计数器

}

int main()

{

  SystemInit0(); //系统(时钟)初始化

  stm32_GpioSetup (); //GPIO初始化

  SysTick_Configuration(); //配置systick定时器

  while(1)

  {

    GPIO_PORTB_ODR|=(1<<5);

    Delay(1000); //1S

    GPIO_PORTB_ODR&=~(1<<5);

    Delay(1000); //1S

  }

}

完成!Delay(1000);实现了1S的精确延时,利用Delay(unsigned long nTime);配合systick定时器可以实现任意时间的精确延时,当然通过定时器TIMx也是可以这样做的,我只是用它来说明systick定时器的用法。

转自:http://www.cnblogs.com/hnrainll/archive/2011/01/17/1937030.html

时间: 2024-08-27 23:41:04

关于STM32的systick定时器的详细说明的相关文章

STM32学习及应用笔记一:SysTick定时器学习及应用

这几年一直使用STM32的MCU,对ARM内核的SysTick计时器也经常使用,但几乎没有仔细了解过.最近正好要在移植一个新的操作系统时接触到了这块,据比较深入的了解了一下. 1.SysTick究竟是什么? 关于SysTick在STM32的资料中并没有详细的介绍,这可能由于SysTick是ARM内核的东西.在<STM32F10xxx参考手册>.<STM32F4xx参考手册>以及<STM32F7xx参考手册>中,介绍时钟的时候仅仅是在使用树上简单的画出了HCLK时钟经过8

STM32之SysTick(系统定时器)

SysTick定时器是被捆绑在NVIC中的,用于产生SysTick异常(异常号是15).(同样,玩过51单片机的都知道定时器的作用了) 在STM32在内核部分是包含了一个简单的定时器–SysTick timer.因为在所有的Cortex-M3芯片上都有这个定时器,所以软件在不同芯片生产厂商的Cortex-M3器件间的一只工作就得以化简. 该定时器的时钟源可以是内部时钟( FCLK, CM3 上的自由运行时钟),或者是外部时钟(CM3 处理器上的 STCLK 信号).不过, STCLK 的具体来源

SysTick 定时器的使用

SysTick是STM32中的一个24位的定时器. Cortex‐M3处理器内部包含了一个简单的定时器.因为所有的CM3芯片都带有这个定时器,软件在不同 CM3器件间的移植工作得以化简.该定时器的时钟源可以是内部时钟,或者是外部时钟.不过,STCLK的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能会大不相同,你需要查找芯片的器件手册来决定选择什么作为时钟源. Cortex-M3 的内核中包含一个 SysTick 时钟.SysTick 为一个 24 位递减计数器,SysTick 设定初

STM32 的Systick操作

首先需要知道的是: 1)STM32的内核是Cortex-M3, 而Systick则是属于Cortex-M3的内核的. 2)Systick为内核提供系统时钟用,比如可以用来作为操作系统的滴答时钟.更多作用可以参考<ARM v7-M Architecture ReferenceManual> 3)Systick是个递减计数器,当计数值递减为0时可以产生Exception中断,中断号为15. 4)Systick相关的寄存器有4个. 5)Systick的控制与状态寄存器SYST_CSR的CLOCKSO

stm32的systick原理与应用

/* SysTick滴答定时器 一.功能 SysTick定时器是一个简单的定时器,CM3\CM4内核芯片都具备此定时器.SysTick定时器常用来做延时,采用实时系统时则用来做系统时钟.无论用作延时还是用作系统心跳时钟,不需要太复杂的功能,SysTick即可胜任. 二.实现原理 SysTick定时器是一个24位的倒计数,当倒计数为0时,将从RELOAD寄存器中取值作为定时器的初始值,同时可以选择在这个时候产生中断(异常号:15). 例如从RELOAD的值为999,那么当倒计数为0时,就会从复位为

关于嵌入式学习随笔-&gt;5《Systick定时器》

1.什么是Systick定时器? --->Systick定时器是一个简单的滴答定时器,对于ST的M3.M4.M7内核芯片,都有滴答定时器. --->Systick滴答定时器常常用来做延迟,或者时时操作系统的心跳时钟.这样可以节省MCU的资源,不用另外浪费一个定时器.比如UCOS系统中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick滴答定时器做UCOS的心跳时钟. --->Systick定时器就是一个系统滴答定时器,一个24位的倒计数定时器,记到0时

Systick定时器详解

Systick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有Systick定时器. Systick定时器常用来做延时,或者实时系统的心跳时钟.这样可以节省MCU资源,不用浪费一个定时器.比如UCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做UCOS心跳时钟. Systick定时器就是系统滴答定时器,一个24位的倒计数定时器,计到0时,将从RELOAD寄存器中自动重装载定时初值.只要不把它在SysTick 控制及状态寄存器中的使能位清

stm32之Systick(系统时钟)

Systick的两大作用: 1.可以产生精确延时: 2.可以提供给操作系统一个单独的心跳(时钟)节拍: 通常实现Delay(N)函数的方法为: for(i=0;i<x;i++) ; 对于STM32系统微处理器来说,执行一条指令只有几十ns(纳秒),进入for循环,要实现N毫秒的x值非常大:而由于系统频率的宽广,很难计算出延时N毫秒的精确值:针对STM32微处理器,需要重新设计一个新的方法去实现该功能,以实现在程序中使用Delay(N): cortex的内核中包含一个SysTick时钟,SysTi

Systick定时器

Systick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有Systick定时器.相当于系统的"心跳". 固件库中的Systick相关函数: SysTick_CLKSourceConfig() //Systick时钟源选择 misc.c文件中 SysTick_Config(uint32_t ticks) //初始化systick,时钟为HCLK,并开启中断 //core_cm3.h/core_cm4.h文件中 Systick中断服务函数: void SysTick_Han