讲座视频 - 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秒

TI-RSLK 模块 9 - SysTick 计时器

TI PWM 机器人 RSLK SysTick 计时器 脉宽 调制

在此模块中,您将学习 SysTick 计时器和脉宽调制器 (PWM) 的基本原理,包括如何用逻辑分析仪测量脉冲时间和周期以及用示波器测量幅度。了解 PWM 的概念非常重要,因为我们将使用它来调整电机功率。

推荐帖子

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

shakencity

学习学习TI-RSLK 模块 9 - SysTick 计时器

2019年11月29日 11:06:12

zx1988ZX

好好学习,天天向上!

2019年11月01日 19:13:30

hawkier

好好学习

2019年08月02日 11:15:36

大明58

不错的视频,认真学习。

2019年07月01日 15:50:21

hellokt43

看看视频,学习一下。。。

2019年05月17日 09:40:58

zwei9

周日继续学习

2019年05月12日 13:32:42

dingxilindy

看看视频,学习一下。

2019年02月02日 11:11:28

wudianjun2001

学习

2019年01月17日 10:14:39

wudianjun2001

不错的视频

2019年01月15日 10:25:43

wudianjun2001

不错的视频

2019年01月11日 09:36:59

分享到X
微博
QQ
QQ空间
微信

EEWorld订阅号

EEWorld服务号

汽车开发圈

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

站点相关: EEWORLD首页 EE大学堂 论坛 下载中心 Datasheet 活动专区 博客

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

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