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

推荐帖子

MSComm不显示单片机发来的数据
我用MSP430发数据给PC,用串口助手能收到数据,但是用VC++,MSComm控件却显示不了,下面是控件接收部分代码(该控件与串口助手能正常通信) void CMytestDlg::OnComm() {         VARIANT variant_inp;         COleSafeArray s...
alexanderjue 微控制器 MCU
【我与TI的结缘】+TI运放助力电子大赛
上次和大家聊了一下【我与TI的结缘】的原因,就是因为MSP430单片机, 具体帖子在这里【我与TI的结缘】+MSP430系列单片机 今天在和大家聊聊我曾经用过的TI的一些运放吧,或者说是我前两年做电子大赛时用的TI运放做的一些题吧。                   &n...
High哥 TI技术论坛
【SensorTag】the seventh week:找到类似的芯片
本帖最后由 ddllxxrr 于 2014-2-14 14:08 编辑 我本想用手机做主控,但这几天看资料,发现IOS要开发费用地。 我想这有点不值吧,毕竟只是学习阶段对吧,我也不可能去换个安卓手机,那样太蠢。 于是我换过来,我想用SensorTag做服务端,我用一个蓝牙模块去读它。 没事在网上找真地找到了一款芯片,这个芯子就是nRF51822。 Nordic Semiconduc...
ddllxxrr 无线连接
关于M4扩展RAM的问题
请问如果M4通过EPI扩展了外部的SDRAM,在程序里面怎么定义变量,才能让变量在外扩的RAM运行,或者是CCS需要怎么设置,请高手回答,谢谢。 ...
sdlczxk2002 微控制器 MCU
分享到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