打印
[技术问答]

SysTick定时器的理解

[复制链接]
111|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
belindagraham|  楼主 | 2024-6-28 09:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

参考文档《Cortex-M3权威指南(中文).pdf》

什么是systick?

手册解释:

       RCC通过AHB时钟(HCLK)8分频后作为Cortex系统定时器(SysTick)的外部时钟。通过对SysTick 控制与状态寄存器的设置,可选择上述时钟或Cortex(HCLK)时钟作为SysTick时钟。

         系统滴答定时器是一个非常基本的倒计时定时器,用于在每隔一 定的时间产生一个中断,即使是系统在睡眠模式下也能工作,并且在向量表中有它的一 席之地。。它使得 OS 在各 CM3 器件之间的移植中不必修改系统定时器的代码,移植工作一下子容易多了。 SysTick 定时器也是作为 NVIC 的一部分实现的

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

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

个人理解:

        systick就是一个基于M3、M4内核的一个简单的24bit,倒计时,自动重装载定时器,倒计时结束会产生一个中断。常用于做延时,在实时系统中做心跳时钟,用于任务的切换。

简述:

1、systick定时器,就是系统滴答定时器

2、24位自动重装载倒计时定时器

3、当倒计时到0时,将从RELOAD寄存器中自动重装载初值

4、只要不清除SysTick控制及状态寄存器的使能位,就永不停息,在睡眠模式下也能工作

5、systick倒计时结束,会产生一个中断,且中断优先级可以设置

四个寄存器:

1、SysTick控制和状态寄存器——CTRL

2、SysTick重装载数值寄存器——LOAD

3、SysTick当前值寄存器 ——VAL

4、SysTick校准值寄存器——CALIB

在core_cm3.h中可以看到定义

/** @addtogroup CMSIS_CM3_SysTick CMSIS CM3 SysTick  memory mapped structure for SysTick  @{ */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;

/--------------------------SysTick控制和状态寄存器:-------------------------------------------/

        位0:ENABLE=1 //使能滴答定时器

        位1:TICKINT=0 //当SysTick倒数到0时候,无动作

                 TICKINT=1 //当SysTick倒数到0时候,会产生一个SysTick异常请求

        位2:CLKSOURCE=0 //选择时钟源为外部时钟源(STCLK)——AHB总线时钟HCLK的1/8

                CLKSOURCE=1 //选择时钟源为内核时钟源(FCLK)——AHB总线时钟HCLK=内核时钟

        位16:COUNTFLAG:如果倒计时为0,该位自动置1,读取该位,自动清0(如果读取该位时未倒计时到0,则该位为0)

/---------------------------SysTick重装载数值寄存器------------------------------------------/

RELOAD[23:0]

        倒数至0时,将会被重装载的值。

/------------------------------------SysTick当前值寄存器-------------------------------------------/

CURRENT[23:0]

        会在一个自动重装载周期不断变化,读取该寄存器时,返回当前倒计时的值;写该寄存器时,会使该寄存器清0,同时还会清除SysTick控制及状态寄存器中的COUNTFLAG标志


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

1251

帖子

0

粉丝