4633|2

72

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

stm32学习(1)--SysTick [复制链接]

1. systick介绍
Systick 就是一个定时器而已,只是它放在了NVIC 中,主要的目的是为了
给操作系统提供一个硬件上的中断(号称滴答中断)。没有学过操作系统的同学,
可能会很郁闷,啥叫滴答中断?这里来简单地解释一下。操作系统进行运转的时
候,也会有“心跳”。它会根据“心跳”的节拍来工作,把整个时间段分成很多
小小的时间片,每个任务每次只能运行一个“时间片”的时间长度就得退出给别
的任务运行,这样可以确保任何一个任务都不会霸占整个系统不放。这个心跳,
可以通过定时器来周期性触发,而这个定时器就是systick。很明显,这个“心跳”
是不允许任何人来随意地访问和修改的。只要不把它在SysTick 控制及状态寄
存器中的使能位清除,就永不停息。
它有四个寄存器: 
STK_CSR, 0xE000E010 -- 控制寄存器
STK_LOAD, 0xE000E014 -- 重载寄存器
STK_VAL, 0xE000E018 -- 当前值寄存器
STK_CALRB, 0xE000E01C -- 校准值寄存器
1、STK_CSR控制寄存器:寄存器内有4 个位t 具有意义
第0 位:ENABLE,Systick 使能位(0:关闭Systick 功能;1:开启Systick
功能)
第1 位:TICKINT,Systick 中断使能位(0:关闭Systick 中断;1:开启
Systick 中断)
第2 位:CLKSOURCE,Systick 时钟源选择(0:使用HCLK/8 作为Systick
时钟;1:使用HCLK 作为Systick 时钟)
www.arm79.com
Copyright © 2009-2010 福州芯达工作室ALL rights reserved 3
第3 位:COUNTFLAG,Systick 计数比较标志,如果在上次读取本寄存器后,
SysTick 已经数到了0,则该位为1。如果读取该位,该位将自动清零。
2、STK_LOAD 重载寄存器:
Systick 是一个递减的定时器,当定时器递减至0 时,重载寄存器中的值就
会被重装载,继续开始递减。STK_LOAD 重载寄存器是个24 位的寄存器最大
计数0xFFFFFF。
3、STK_VAL当前值寄存器:
也是个24 位的寄存器,读取时返回当前倒计数的值,写它则使之清零,同
时还会清除在SysTick 控制及状态寄存器中的COUNTFLAG 标志。
4、STK_CALRB 校准值寄存器:
位31 NOREF :1=没有外部参考时钟(STCLK 不可用)0=外部参考时钟可用
位30 SKEW:1=校准值不是准确的1ms 0=校准值是准确的1ms
位[23:0] :Calibration value
Indicates the calibration value when the SysTick counter runs on HCLK
max/8 as external clock. The value is product dependent, please refer to
the Product Reference Manual, SysTick Calibration Value section. When
HCLK is programmed at the maximum frequency, the SysTick period is 1ms.
If calibration information is not known, calculate the calibration value
required from the frequency of the processor clock or external clock.
2. systick编程
现在我们想通过Systick 定时器做一个精确的延迟函数,比如让LED 精确延
迟1 秒钟闪亮一次。
思路:利用systick 定时器为递减计数器,设定初值并使能它后,它会每个
系统时钟周期计数器减1,计数到0 时,SysTick 计数器自动重装初值并继续
计数,同时触发中断。
那么每次计数器减到0,时间经过了:系统时钟周期* 计数器初值。我们
使用72M 作为系统时钟,那么每次计数器减1 所用的时间是1/72M,计数器
的初值如果是72000,那么每次计数器减到0,时间经过(1/72M) * 72000 =
0.001,即1ms。

 

Q:什么是SYSTick定时器?
SysTick 是一个24 位的倒计数定时器,当计到0 时,将从RELOAD 寄存器中
自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清
除,就永不停息。
Q:为什么要设置SysTick定时器?
(1)产生操作系统的时钟节拍
SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。
在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作
为整个系统的时基。因此,需要一个定时器来产生周期性的中断,而且最好还让
用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。
(2)便于不同处理器之间程序移植。
Cortex‐M3 处理器内部包含了一个简单的定时器。因为所有的CM3 芯片都带
有这个定时器,软件在不同CM3 器件间的移植工作得以化简。该定时器的时钟
源可以是内部时钟(FCLK,CM3 上的自由运行时钟),或者是外部时钟( C
M3 处理器上的STCLK 信号)。
不过,STCLK 的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率
可能会大不相同,你需要检视芯片的器件手册来决定选择什么作为时钟源。Sys
Tick 定时器能产生中断,CM3 为它专门开出一个异常类型,并且在向量表中有
它的一席之地。它使操作系统和其它系统软件在CM3 器件间的移植变得简单多
了,因为在所有CM3 产品间对其处理都是相同的。
(3)作为一个闹铃测量时间。
SysTick 定时器除了能服务于操作系统之外,还能用于其它目的:如作为一个闹
铃,用于测量时间等。要注意的是,当处理器在调试期间被喊停(halt)时,则
SysTick 定时器亦将暂停运作。
Q:Systick如何运行?
首先设置计数器时钟源,CTRL->CLKSOURCE(控制寄存器)。设置重载值(R
ELOAD 寄存器),清空计数寄存器VAL(就是下图的CURRENT)。置CTRL
->ENABLE 位开始计时。
如果是中断则允许Systick 中断,在中断例程中处理。如采用查询模式则不断读
取控制寄存器的COUNTFLAG 标志位,判断是否计时至零。或者采取下列一种
方法
当SysTick 定时器从1 计到0 时,它将把COUNTFLAG 位置位;而下述方法
可以清零之:
1. 读取SysTick 控制及状态寄存器(STCSR)
2. 往SysTick 当前值寄存器(STCVR)中写任何数据
只有当VAL 值为0 时,计数器自动重载RELOAD。

 Q:如何使用SysTicks作为系统时钟?
SysTick 的最大使命,就是定期地产生异常请求,作为系统的时基。OS 都需要
这种“滴答”来推动任务和时间的管理。如欲使能SysTick 异常,则把STCSR.TI
CKINT 置位。另外,如果向量表被重定位到SRAM 中,还需要为SysTick 异
常建立向量,提供其服务例程的入口地址。

此帖出自stm32/stm8论坛

最新回复

顶楼主,学到了东西  详情 回复 发表于 2012-5-18 11:53
点赞 关注
 

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

受教了

受教了啊,哈哈
此帖出自stm32/stm8论坛
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
顶楼主,学到了东西
此帖出自stm32/stm8论坛
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表