TI教室 >
应用与设计 >
工业应用 >
工厂自动化与控制系统 >
Automated Machinery >
TI-RSLK 模块 9 - SysTick 计时器 > 讲座视频 - SysTick 计时器 - 理论
- 课程目录
- 相关资源
- 课程笔记
大家好,我是 Jon Valvano。
在本模块中,我们将讨论
SysTick 计时器。
SysTick 计时器是所有ARM Cortex-M 都具有的
内置时钟。
我们将使用它来测量运行时间或创建
软件延迟。
在这次的整个课程中,您将
看到我们会在机器人中频繁使用到它。
那么让我们开始吧。
那么,具体来说,我们将在该模块中使用
该计时器来创建延迟,或进行测量。
在后续实验中,我们将使用该相同的
计时器来创建周期性中断,以便我们能够
定期运行软件。
但我们将从使用 SysTick实现时间延迟的简单
任务开始。
SysTick最基本的它有一个 24 位计数器。
它称为值,或 VAL,它的宽度为 24 位。
它将以总线频率进行递减 -- 因此该数字将以
每秒 4800 万次的频率进行递减。
这一切过程的发生无需软件参与。
它是自动发生的。
我们的软件还将设置另一个 24 位
常数,它称为加载寄存器。
例如,如果您将加载寄存器设置为 5,
将要发生的是,计数器将进行
倒计数 -- 该值将进行倒计数,5,4,3,2,1,0 --
在达到 0 之后,它将自动再次执行该过程 --
5,4,3,2,1,0;5,4,3,2,1,0 -- 不停地重复进行。
因此,如果您看到加载寄存器的值
为 n,那么它其实是一个模 n 加 1 计数器,
那么,让我们来讨论一下软件
其实软件相当简单。
我们将把它分为两个部分。
第一个部分是初始化 --
您将执行它一次。
那么,我们将看到,仅有三个与 SysTick
相关联的寄存器。
控制寄存器 --它包含一些位,
我将在初始化期间设置这些位。
具体而言,由于我希望
它以 48MHz 的频率进行计数,
因此我要把源寄存器设置为 1。
由于我希望它实际运行,
因此我要把这里的使能位设置为 1,
把该位 0 设置为 1。
在这里,在实验 9 中,我们还不需要中断,
因此我们要把该位设置为 0。
您可以看到,设置位 2、
声明位 0和设置位 0
在这里,在将 5 写入控制寄存器的初始化
代码中进行编码。
现在,控制寄存器中还有另一个位,它称为
计数 -- 它是位 16 -- 我们将在下一页中介绍。
但我们已经讨论了其他两个寄存器。
再说一次,24 位计数器本身位于该值寄存器中,
该 24 位常数重新加载值位于加载寄存器中。
一种使用该计时器的方法是向加载寄存器
全部写入 1。
再说一次,它是一个 24 位值。
因此,在您这么做之后,它将变成一个模为 2 的
24 次方的计数器。
如果您看到,如果我将 2 的 24 次方
乘以总线时钟的周期 --
48MHz 的周期,即20.83 纳秒 --
那么,我们将看到,在使用该加载值
设置时,这个东西将每 349 毫秒回滚重复
一次。
那么,换句换说,我要说的是,加载值
是它开始执行的值。
这是我输入的加载值。
20 纳秒之后,它将递减,
20 纳秒之后,它将递减。
然后它会一直运行下去,直到它达到 3,2,1,0。
然后,在达到 0 之后,它将重新回滚重复。
如果您愿意,该整个周期
将花费 349 毫秒的时间。
那么这是它的基本工作方式。
现在我们将通过两种方法在该模块中使用它。
第一种方法与秒表类似。
某件事需要多长时间才能发生?
那么,我有某个函数 --某个软件,我不知道
它的执行需要多长时间 --
我需要测量实际运行时间,
我可以使用 SysTick 计时器。
我再次使用了该加载值 --
该加载值,如果您还记得,在前一张幻灯片中,它等于
FFFFFF
因此,它将对所有可能的24 位值进行倒计数,
然后重新回滚重复。
那么,我将执行它的方法是,在我感兴趣的函数执行之前,
我将捕获计数器的值。
我将执行该未知函数,
然后捕获第二个值,并把这两者相减。
由于它在进行倒计数,因此
我要用起始值减去终止值。
例如,如果我调用这个,
我得到数字 2,000 --
它是介于 0 和 2 的 24次方之间的某个随机数 --
然后我再次调用它,我得到 1,400,我知道
在这个时间和那个时间之间
经历了 600 个时钟周期。
因此我要把这两者相减,我将得到 600。
我将知道,这意味着600 乘以 20.83 纳秒,
那么,该测量,如果您愿意,
具有 20 纳秒的分辨率。
这意味着,任何大于
20 纳秒的
差异 -- 任何时间变化 --
都将导致不同的计数。
因此,我能够以低至20 纳秒的分辨率解析
经历的时间测量。
我曾提到过,它需要经过
349 毫秒才会发生回滚,只要
这里经历的时间小于 349 毫秒,该系统
就能正常工作。
那么,这是我可以经历的最大时间 --
最大的可能值是340毫秒。
如果您看看它,
将有 2 的 24 次方 --
16,000,000 -- 个互不相同的
可能测量值,
因此,有 2 的 24 次方个我能够
加以区别的不同测量值。
我们要将这定义为 24 位
精度测量。
您会说,嘿,John,这是怎么回事?
好的,这正是我执行24 位减法的方法。
那么,让我在这里执行一个示例,
如果起始值碰巧是某个较小的数 --
比如所它碰巧是 4 --
然后它进行计数,1 次,2 次,3 次,4 次,
5 次 --
FFFFFF -- 6 次 --
FFFFFE -- 这是我的终止时间,
您已经知道答案了。
答案是 6,对吧?
1,2,3,4,5,6 --您知道答案将是 6。
但如果我获取起始值,然后用它减去终止值,
我得到的将是 FF0 0000 --
又是这样 --
1,2,3,4,5,6,对吧?
这是当我用起始值减去终止值时将得到的结果。
但是,如果我丢弃该测量值的顶部 8 位,
那么我将得到正确的答案。
因此,这里使用 24 位掩码来结束它的神秘技巧
是一种执行24 位减法的方法。
那么,这只是 24 位。
再说一次,这就是我测量经历的时间的方法。
我可以使用它做的另一件事是时间延迟。
现在,您应该记得,控制寄存器中还有
另一个位,它称为计数位
它碰巧在那里,在位 16 中。
它的有趣之处在于,当它回滚时 --
让我们在这里执行一个示例。
比如说 n 等于
让我们假设 n 等于 5。
好的,那么我将设置 n 等于 5。
那么,当我把 4 存储到加载寄存器中时,
计数器将变为 --
它将成为这里的值计数器。
计数器将变为 4,然后它将进行计数 --
4,3,2,1,0。
事实上,只要计数器从 1
变为 0,这就会设置计数标志
现在,正如您知道的,它将回滚重复并反复不断地进行计数。
但是,我在这里要做的是,把我
希望等待的时间设置到加载寄存器中。
我将减去 1,因为它会在这里从该 1 递减为
0
然后我将清除计数值
我将清除计数值,通过写入 -- 我写入
计数器的任何值都将清除计数。
然后我将等待计数位被设置。
再说一次,只要n 不是太小,
对于任何不大于 2 的 24次方的值,这都会正常工作。
或者最大为 349 毫秒。
现在,如果您希望等待的时间大于 349 毫秒,我将做的是,
我将把这个放在另一个的内部
例如,如果我把480,000 发送到
前一个函数中,这里的函数
将等待 10 毫秒,因为,再说一次,
如果我等待 48,这将是 1 微秒。
如果我等待 48,000,这将是 1 毫秒。
因此,如果我等待480,000,这将是 10 毫秒。
好的,然后我使用该另一个参数把它放入一个循环中。
现在,如果我调用该参数 -- 比如,
使用数字 100--
这里的函数将等待 1 秒。
现在,它不是很高效。
它不是很高效,但它是一种实现时间延迟的
简单方法。
总之,我们看到了SysTick 具有 24 位,
此外,我们使用它实现了两种功能 --
测量经历的时间和创建延迟。
在本课程的稍后部分中,我们将
使用它来创建中断,这将是一种用于实现延迟的方法,
一种很高效的方法。
但到目前为止,以这种方式
使用 SysTick 实际上非常低效,因为它在等待,
它呆在那里,什么也没做。
但这对于实验 9 而言是可以的。
好的,祝您愉快!
课程介绍
共计4课时,30分9秒
猜你喜欢
换一换
推荐帖子
- UART深入学习续~通过寄存器赋值实现功能
- 先贴库函数操作的程序~ void delay(long i) { for(i=0;i<10000;i++) { } } //这个函数的作用是向串口发送一个字符串 void UARTSend(const unsigned char *pucBuffer, unsigned long ulCount) { &n...
- xielijuan 微控制器 MCU
- 关于c28xx的filter模块
- 我现在在研究2812的算法。 怎么也看不懂那个filter_module,很奇怪。比如: /*---------------------------------------------------------------- Define the structure of the FIRFILT_GEN Filter Module -----------------------------...
- 雾海飘香 微控制器 MCU
- 【视频分享】WEBENCH设计导出工具WEBENCH Export介绍
- 来自TI硅谷实验室的Jeff为您介绍TI屡获殊荣的WEBENCH在线设计工具新增加的WEBENCH Export工具,该工具可将模拟设计从WEBENCH设计中心即刻导出到业界领先的CAD平台。 $('swf_J33').innerHTML=AC_FL_RunContent('width', '550', 'height', '400', 'allowNetworking', 'internal'...
- 德州仪器_视频 模拟与混合信号
- 武林学习LM3S811(二)使用串口下载程序的方法
- 参考《LM3S 系列处理器 Boot loader使用说明》文章是关于LM3S8962的串口下载程序的方法,只有做稍微修改就能使用到LM3S811当中 步骤1:首先编译boot_serial工程并下载程序到板子上 步骤2:打开需要使用下载的工程,比如blinky这个工程,做如下设置: 设置FLASH的偏移地址为1K,也就是0X800 步骤三:打开Linker选项卡-点编辑,并作如下修改...
- billbot501 微控制器 MCU