您现在的位置是:首页 >技术交流 >《嵌入式系统》知识总结12:SysTick定时器网站首页技术交流
《嵌入式系统》知识总结12:SysTick定时器
SysTick定时器
系统时钟(SysTick)
Corte-M3在内核中包含的简单定时器
• 该定时器的时钟源可以来自CM3内部时钟(FCLK),或CM3外部时钟(STCLK)
• 在STM32微控制器中,SysTick的时钟源可以是:“AHB时钟”、或者“AHB时钟/8”
SysTick定时器是一个24位递减计数器
• 设置初值、允许计数后,每来一个时钟,计数值减1
• 计数值减为0时,计数器被自动载入初值、继续计数
同时内部标志COUNTFLAG被置位、并触发中断
• SysTick中断连接中断控制器NVIC,异常号为15
SysTick寄存器
SysTick timer工作分析
SysTick是一个24位的定时器,即一次最多可以计数224 个时钟脉冲,这个脉冲计数值被保
存 到 当 前 计 数 值 寄 存 器 VAL (SysTick current value register) 中,只能减计数,每接收到一个时钟脉冲VAL的值就减1,直至0,当VAL的值被减至0时,由硬件自动把重载 寄 存 器 LOAD ( SysTick reload valueregister)中保存的数据加载到VAL,重新向下计数。当VAL的值被计数至0时,触发异常,就可以在中断服务函数中处理定时事件了。
要 使 SysTick 进 行 以 上 工 作 必 须 要 进 行SysTick进行配置。它的控制配置很简单,只有三个控制位和一个标志位,都位于寄存器SysTick_CTRL ( SysTick control andstatus register )中
控制和状态寄存器(SysTick_CTRL)
(12)STCLKAHB预分频时钟被8分频后送内核,为STCLK
(13)FCLKAHB预分频时钟不分频送内核,为FCLK
(14)APB1时钟
(16)APB2时钟
APB总线有APB1和APB2,因此有两个APB预分频器,AHB预分频时钟通过它们进行分频,当对应外设被使能的情况下,分别得到APB1时钟PCLK1和APB2时钟PCLK2
重载值寄存器(SysTick_LOAD)
当前值寄存器(SysTick_VAL )
每经过一个SysTick时钟周期,VAL寄存器值-1
读取寄存器:返回当前VAL值
写 寄 存 器 : 清 零 VAL , 还 会 使 CTRL 寄 存 器 中COUNTFLAG位清0
校准值寄存器(SysTick_CALIB)
SysTick寄存器编程
(1)禁止SysTick定时器
(因为SysTick可能已经被允许了)
SysTick->CTRL = 0; // 关闭SysTick
(2)写入重载值
SysTick->LOAD = 256-1; // 假设计数值为256
(3)清除当前值为0
(向当前值寄存器SysTick_VAL写入任何值)
SysTick->VAL = 0;
(4)允许SysTick定时器
SysTick->CTRL = 1; // 打开SysTick
SysTick结构定义
SysTick结构定义
系统时钟SysTick属于Cortex内核部件
驱动程序定义在core_cm3.h(不是core_cm3.c)文件
SysTick寄存器的结构类型
typedef struct
{ __IO uint32_t CTRL;
__IO uint32_t LOAD;
__IO uint32_t VAL;
__I uint32_t CALIB;
} SysTick_Type;
有关地址定义的语句如下:
#define SCS_BASE (0xE000E000)
#define SysTick_BASE (SCS_BASE + 0x0010)
#define SysTick ((SysTick_Type *) SysTick_BASE)
SysTick精确延时
软件延时
• 利用内核执行循环实现,延时的时间无法精确测量,有很大的局限性
可以利用SysTick timer实现基于硬件的精确延时
• 理论上它的最小计时单位为AHB的时钟周期,即1/72000000 秒,72分之一的微秒,足以满足大部分应用需求。
main函数
整个main函数的流程就是先初始化LED、配置SysTick定时器之后,就进入死循环,轮流点亮LED1、LED2、LED3,点亮的时间为精确的500ms。
配置并启动SysTick timer
SysTick_Init() 这个函数,是由用户在SysTick.c这个文件中实现的,其功能是启动系统滴答定时器
SysTick,并将SysTick配置为 10 us 中断一次
SysTick应用
可用于精确延时
- 系统时钟72MHz,最小的计时单位(时钟周期)(1/72)×10-6秒、即72分之一的微秒
使用SysTick进行时间测量
- 当我们开启SysTick定时器后,定时器开始工作,我们可以定义一个变量a(初值为0)来对中断次数进行记录,在定时器进入中断时a++,当我们关闭定时器时,将变量a的数值乘以定时器的中断周期就等于待测时间。一般利用该功能测量程序的运行时间。
SysTick可作为操作系统的时基
- 例如:操作系统可以为多个任务分配不同数目的时间片,确保没有一个任务能霸占系统;或者将每个定时器周期的某个时间范围赐予特定的任务等
- 因为SysTick为CM3的内核资源,软件在不同芯片厂商的CM3器件间的移植工作得以简化。