《嵌入式系统》知识总结12:SysTick定时器

SysTick定时器

《嵌入式系统》知识总结12:SysTick定时器_第1张图片

 系统时钟(SysTick)

Corte-M3在内核中包含的简单定时器
• 该定时器的时钟源可以来自CM3内部时钟(FCLK),或CM3外部时钟(STCLK)
• 在STM32微控制器中,SysTick的时钟源可以是:“AHB时钟”、或者“AHB时钟/8”
SysTick定时器是一个24位递减计数器
• 设置初值、允许计数后,每来一个时钟,计数值减1
• 计数值减为0时,计数器被自动载入初值、继续计数
同时内部标志COUNTFLAG被置位、并触发中断
• SysTick中断连接中断控制器NVIC,异常号为15

 《嵌入式系统》知识总结12:SysTick定时器_第2张图片

 SysTick寄存器

《嵌入式系统》知识总结12:SysTick定时器_第3张图片

 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:SysTick定时器_第4张图片

(12)STCLKAHB预分频时钟被8分频后送内核,为STCLK
(13)FCLKAHB预分频时钟不分频送内核,为FCLK
(14)APB1时钟
(16)APB2时钟
APB总线有APB1和APB2,因此有两个APB预分频器,AHB预分频时钟通过它们进行分频,当对应外设被使能的情况下,分别得到APB1时钟PCLK1和APB2时钟PCLK2

重载值寄存器(SysTick_LOAD)

《嵌入式系统》知识总结12:SysTick定时器_第5张图片

当前值寄存器(SysTick_VAL )

《嵌入式系统》知识总结12:SysTick定时器_第6张图片

 每经过一个SysTick时钟周期,VAL寄存器值-1
 读取寄存器:返回当前VAL值
写 寄 存 器 : 清 零 VAL , 还 会 使 CTRL 寄 存 器 中COUNTFLAG位清0

校准值寄存器(SysTick_CALIB)

《嵌入式系统》知识总结12:SysTick定时器_第7张图片

 SysTick寄存器编程

 《嵌入式系统》知识总结12:SysTick定时器_第8张图片

(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)

《嵌入式系统》知识总结12:SysTick定时器_第9张图片

 SysTick精确延时

软件延时

《嵌入式系统》知识总结12:SysTick定时器_第10张图片

 • 利用内核执行循环实现,延时的时间无法精确测量,有很大的局限性

可以利用SysTick timer实现基于硬件的精确延时
• 理论上它的最小计时单位为AHB的时钟周期,即1/72000000 秒,72分之一的微秒,足以满足大部分应用需求。

main函数

《嵌入式系统》知识总结12:SysTick定时器_第11张图片

 整个main函数的流程就是先初始化LED、配置SysTick定时器之后,就进入死循环,轮流点亮LED1、LED2、LED3,点亮的时间为精确的500ms。

配置并启动SysTick timer

SysTick_Init() 这个函数,是由用户在SysTick.c这个文件中实现的,其功能是启动系统滴答定时器
SysTick,并将SysTick配置为 10 us 中断一次

《嵌入式系统》知识总结12:SysTick定时器_第12张图片

SysTick应用

可用于精确延时

  • 系统时钟72MHz,最小的计时单位(时钟周期)(1/72)×10-6秒、即72分之一的微秒

使用SysTick进行时间测量

  •  当我们开启SysTick定时器后,定时器开始工作,我们可以定义一个变量a(初值为0)来对中断次数进行记录,在定时器进入中断时a++,当我们关闭定时器时,将变量a的数值乘以定时器的中断周期就等于待测时间。一般利用该功能测量程序的运行时间。

 SysTick可作为操作系统的时基

  •  例如:操作系统可以为多个任务分配不同数目的时间片,确保没有一个任务能霸占系统;或者将每个定时器周期的某个时间范围赐予特定的任务等
  • 因为SysTick为CM3的内核资源,软件在不同芯片厂商的CM3器件间的移植工作得以简化。

你可能感兴趣的:(嵌入式系统,stm32,单片机,嵌入式硬件)