打印
[技术问答]

SysTick定时器的理解

[复制链接]
2823|38
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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标志


使用特权

评论回复
沙发
loutin| | 2024-7-4 19:35 | 只看该作者
SysTick定时器是ARM Cortex-M系列处理器中的一个系统定时器,它是一个24位的倒计数器,可以用来产生周期性的中断或者提供一个时间基准

使用特权

评论回复
板凳
ulystronglll| | 2024-7-4 20:21 | 只看该作者
SysTick定时器通常用于实现操作系统的节拍定时器,或者在裸机编程中作为一个简单的延时功能。例如,在FreeRTOS这样的实时操作系统中,SysTick定时器被用作系统节拍定时器,负责产生周期性的中断,从而驱动操作系统的任务调度。

使用特权

评论回复
地板
biechedan| | 2024-7-4 21:53 | 只看该作者
硬件内置:SysTick定时器是ARM Cortex-M处理器内部集成的计时器,几乎所有Cortex-M系列处理器都支持它,无需额外的硬件组件。
简单性:SysTick定时器的设计相对简单,易于配置和使用。通常只需编写少量的寄存器配置代码,就可以启用和控制定时器的基本功能。
低功耗:SysTick定时器通常设计成具有低功耗特性,可以在不需要时进入低功耗模式,以降低功耗。
通用性:虽然SysTick定时器的具体实现可能因处理器型号而异,但它遵循ARM Cortex-M处理器的通用规范,因此可以在不同的Cortex-M处理器上使用相似的代码,增加了代码的可移植性。
高精度:SysTick定时器的计时精度通常与处理器的时钟频率相关,因此可以根据需要选择合适的时钟源,以实现所需的计时精度。

使用特权

评论回复
5
jackcat| | 2024-7-7 15:04 | 只看该作者
SysTick(System Tick)定时器是ARM Cortex-M系列处理器内置的一个24位递减计数器,主要用于提供系统滴答(system tick),实现延时和调度任务等功能。

使用特权

评论回复
6
cemaj| | 2024-7-9 20:29 | 只看该作者
当SysTick定时器的计数器达到预设的值时,将产生一个中断。这个中断可以用于执行特定的任务,例如,更新系统时间,执行定时操作,或者作为看门狗定时器来监控系统的正常运行。

使用特权

评论回复
7
benjaminka| | 2024-7-10 00:03 | 只看该作者
SysTick定时器 是 ARM Cortex-M 系列微控制器(包括51内核的单片机,如 STC89C5x、STC15F2Kxx 等)中的一个核心组件。它提供了一个简单的定时功能,主要用于系统时序控制、延时任务以及时间测量等应用。

使用特权

评论回复
8
kmzuaz| | 2024-7-10 04:30 | 只看该作者
SysTick定时器是一个24位的递减计数器,最大计数值为2^24-1(即16,777,215)。当计数器的值减到0时,会产生一个中断请求,这个中断被称为SysTick中断。

使用特权

评论回复
9
ulystronglll| | 2024-7-11 01:30 | 只看该作者
在编写单片机程序时,可以使用汇编语言或 C 语言来配置和控制 SysTick 定时器。大多数情况下,C 语言更为方便,因为它提供了更高级别的抽象和更好的可读性。

使用特权

评论回复
10
可怜的小弗朗士| | 2024-7-11 10:13 | 只看该作者
SysTick中断的默认优先级是最高还是最低

使用特权

评论回复
11
pl202| | 2024-7-12 14:28 | 只看该作者
SysTick定时器在实时系统中非常有用,因为它可以提供一个稳定的时钟基准,用于任务调度、定时器管理和实现精确的延迟。在许多Cortex-M微控制器上,SysTick定时器是实现RTOS的关键组件之一。

使用特权

评论回复
12
alvpeg| | 2024-7-12 19:10 | 只看该作者
计数方式:SysTick定时器是一个24位递减计数器。设置初值后,每来一个时钟脉冲,计数值减1。当计数值减为0时,计数器被自动载入初值并继续计数,同时内部标志位(如COUNTFLAG)被置位,并可能触发中断。
中断服务:SysTick中断连接中断控制器NVIC,异常号为15。当计数器值减为0时,如果使能了中断,则会触发SysTick中断,并在中断服务函数中处理定时事件。

使用特权

评论回复
13
chenci2013| | 2024-7-12 22:17 | 只看该作者
SysTick定时器可以提供精确的定时功能,适用于需要精确计时的场合,如操作系统的心跳时钟、时间片轮转调度等。

使用特权

评论回复
14
小灵通2018| | 2024-7-12 22:51 | 只看该作者
所有的ARM单片机都有这个吗

使用特权

评论回复
15
phoenixwhite| | 2024-7-13 13:03 | 只看该作者
在使用SysTick定时器时,需要配置它的控制与状态寄存器(STK_CTRL)、重装载值寄存器(STK_LOAD)、当前值寄存器(STK_VAL)和校准值寄存器(STK_CALIB)。通过这些寄存器的配置,可以设置定时器的溢出时间、使能中断、启动和停止定时器等。

使用特权

评论回复
16
jackcat| | 2024-7-13 18:10 | 只看该作者
SysTick定时器是属于CM3内核的外设,因此所有基于CM3内核的单片机都具有这个系统定时器,使得软件在CM3单片机中可以很容易地移植。

使用特权

评论回复
17
jackcat| | 2024-7-13 23:00 | 只看该作者
确保不要在中断服务程序中修改定时器的配置,以免引发不可预测的行为。
在使用 SysTick 定时器进行精确延时时,应考虑系统时钟的稳定性和晶振的误差。
如果同时使用其他定时器,应注意避免资源冲突。

使用特权

评论回复
18
kkzz| | 2024-7-14 12:36 | 只看该作者
当SysTick定时器倒数到0时,它可以产生一个中断信号,这个中断可以用来触发定时任务或者操作系统的心跳。

使用特权

评论回复
19
ccook11| | 2024-7-14 15:40 | 只看该作者
为了使用 SysTick 定时器进行延时,你需要根据所需延时时间计算出计数器的设定值。这通常涉及到将所需延时时间除以系统时钟周期(或定时器时钟周期),然后将该值加载到当前值寄存器(SYST_RVR)。

使用特权

评论回复
20
louliana| | 2024-7-15 11:46 | 只看该作者
SysTick定时器结构简单,易于使用,不需要额外的硬件支持。

使用特权

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

本版积分规则

25

主题

1453

帖子

0

粉丝