讲座视频 - 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 的概念非常重要,因为我们将使用它来调整电机功率。

推荐帖子

分享到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-2025 EEWORLD.com.cn, Inc. All rights reserved