参考文档《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标志
|