什么是Timer,什么是Counter

几乎每个嵌入式板都会有counter和timer,重要性比肩gpio.本质上来看timer和counter几乎是一样的东西,底层都是一个硬件counter,如果是按照规律的时间跳表,就是timer,如果是按照不规律的事件讯号跳表就是counter.一般timer/counter统一称作timer.

Timer.

一个典型的Timer包含以下元件:

  • prescaler -- 除频器,分频器
  • N-bit的counter register
  • 一个或者多个capture register
  • 一个或者多个compare register

timer底层实际是counter,counter会计算输入脉冲的数量,如果输入脉冲式每隔固定时间发出一次,就是timer.至于这个计数器的大小其实和处理器架构一点关系没有,8bit的处理器也可以有16bit size的counter.32bit的处理器也可以有16bit的counter。

prescaler(除频器)

prescaler是一个硬件元件,可以把用于驱动timer的clock(可能是cpu的clock,或是bus上的clock),以频率已特定的倍数下降。一般来说可以除以2^n,或是除以1~2^P, P是prescaler存放除频参数的bit数。

为什么需要使用prescaler

因为你必须把timer的触发clock调整到你想要的频率。因为counter的size是有限的,你使用的clock频率越高,你的时间精密度就越高,但是相对的,你的timer最高能记得时间就会减少。例如你想要1us的精确度,但是你只有16bit-timer,那你就只能数到约65ms,counter就要重新数了。如果你想要让counter一次可以数完一秒,那你就要每次16us才跳表。这就要透过除频器来做取舍。不过改进的方法就是另外加一个repetition register,用于设定一个重复的次数,可以让你的counter重新数完n次之后,在发出数完了的中断讯号。

假如每1us跳一次counter,16bit可以跳65546次,就只能数到65ms.

如果timer当计数器使用,通常会搭配另外一个time-based的timer,这样你就可以衡量一个时间周期内,该事件发生几次。

Timer Register

Timer Register其实就是一个N-bit的counter,可以向上数,也可以向下,甚至可以向上数完再向下。你可以读取,写入,停止,归零这个counter.当然,决定这个counter什么时候会计数跳表,取决于触发该counter的来源.

Capture Register

capture register是一种如果被触发,就会把目前counter的值存起来的register。触发的条件通常是输入pin教改变了状态。也就是说,Capture Register是一种当时间发生时,截取timer snapshot的register。capture register也可以设定产生一个interrupt,让handler去保存刚刚街渠道的timer状态。因为这是硬件触发的,所以不会像软件计数会有latency.所以capture register最简单的用途就是计算两个脉冲之间的时间间隔,把第一个和第二个讯号的snapshot counter相减,乘上每次counter+1的时间间隔,就代表两次讯号的时间差。

Compare Register

也有人称match register。他的用途和capture register正好相反。compare register会保存一个值。这个值会一直和timer目前的值做比较。如果当两个值一样时,就会发出一个讯号。因此这个是用于output讯号的register.如果你的timer是当成timer(计时)使用,那么compare register就可以用作每隔固定时间发出讯号。如果你的timer是当做计数器,那么compare register就变成一种当某个事件发生固定次数后,就会发出讯号的装置。

因此这就可以当作称PWM的功能。在timer=0是把output讯号设成high,然后设定compare register的值作为脉冲的宽度(pulse width),然后当比较相等的事件发生时,把output拉成low,再用另外一个compare register设定一个更大的时间,当时间到了之后把timer归0,你就做出了PWM了。

参考:

https://embedded-note.hackpad.com/ep/pad/static/aUAsaFTHTUf

转载于:https://www.cnblogs.com/biglucky/p/4894982.html

Timer和counter相关推荐

  1. STM32 - 定时器的设定 - 基础 - 05 - Arbitrary waveform generation using timer DMAburst feature - 任意波形的序列产生

    DMA的功能不说了,如何产生任意序列的波形,我们仔细看看: 本节叙述了同DMA的方法,在不占用MCU资源的情况下,通过提前编辑一组任意定制的波形参数,实现复杂的波形输出. STM32 DMA-burs ...

  2. APIC Timer

    前言 (由于之前的blog已经关闭了,所以将此文章迁移至这里,并非转载) 之前已经大体的写过APIC的一些内容,这次是写一些APIC定时器的内容,当然,也是翻译了一些来自OSDev的资料(不要问我为什 ...

  3. 如何在C#Windows控制台应用程序中更新当前行?

    使用C#构建Windows控制台应用程序时,是否可以在不扩展当前行或转到新行的情况下写入控制台? 例如,如果我想显示一个百分比,该百分比代表一个过程到完成为止的距离,我只想在与光标相同的行上更新值,而 ...

  4. 重要头文件: cc430x613x.h

    2019独角兽企业重金招聘Python工程师标准>>> 重要头文件: cc430x613x.h 来自:http://www.inventortown.com/includes/cc4 ...

  5. dell服务器系统开机提示错误解决方法

    DELL 服务器有时会若硬件的改动,在开机以后会提示错误信息.信息一般会提示在显示器上,以后举出如下信息的解决办法.   信息 原因 纠正措施    Alert! iDRAC6 not respond ...

  6. Example: Communication between Activity and Service using Messaging

    原文地址: http://stackoverflow.com/questions/4300291/example-communication-between-activity-and-service- ...

  7. 启明云端分享|干货来了,怎么用ESP32-S2驱动断码屏呢?更多干货欢迎关注启明云端CSDN技术社区!

    一.基础理论 ESP32-S2具有43个GPIO,理论上可以支持835=280段,但实际上,受限于刷新率和保持时间的限制,按刷新时间20ms,保持时间1ms计算,大概能支持的上限为820=160段. ...

  8. layer.open子页面调用父页面的方法_记好这 24 个 ES6 方法,用来解决实际开发的 JS 问题...

    本文主要介绍 24 中 es6 方法,这些方法都挺实用的,本本请记好,时不时翻出来看看. 1.如何隐藏所有指定的元素 const hide = (...el) => [...el].forEac ...

  9. 5G NR RLC:Data Transfer ARQ

    其他相关内容 RLC PDU and Parameters RLC架构和RLC entity 一 RLC entity handling RLC entity有建立.重建和释放的过程(establis ...

  10. 从Var Tick角度来对CE电源管理

    从Var Tick角度来对CE电源管理 一.相关的基础知识如下 1.OAL中Timer相关函数说明 1> OALTimerInit 参数: msecPerSysTick: 每个系统调度Tick对 ...

最新文章

  1. cannot find main module 解决办法
  2. (shell脚本编程)linux如何利用脚本执行多条命令以及linux如何执行定时任务
  3. 前端学习(1081):构造函数和原型概述
  4. ffmpeg解码H.264视频数据,MFC播放视频
  5. java 账户和密码 3次_模拟登录,给三次机会,并提示还有几次。Java实现
  6. 快速从mysqldump文件中恢复一个表
  7. 用SecureCRSecurePortable查看动态日志
  8. skimage读取不到图片会报错 cv2读取不到图片返回None
  9. 全国计算机一级考试wps教程,全国计算机等级考试一级教程:计算机基础及WPS Office应用(2013年版)...
  10. 航空公司客户价值分析R语言实现
  11. [CF296D] Greg and Graph [floyd]
  12. linux无法访问443端口,无法监听EC2上的https端口443(Amazon Linux)
  13. 【Linux】/bin/sh、/bin/bash、/bin/dash、init=/sysroot/bin/bash(sh) 、init=/bin/bash(sh) 的区别
  14. Python使用Pandas计算相关系数
  15. 在 Mac 上将 PDF 转换为 Word 的 5 种简单方法
  16. 计算机网络技术高职单招题库上机,全国高职单招计算机类模拟试卷及答案-20210522020322.docx-原创力文档...
  17. python把英语句子成分字母_求一个可以分析英语句子成分的软件或网站
  18. maya批量操作mel_maya为热键指定 MEL 脚本,MAYA
  19. Word控件Spire.Doc 【文本】教程(10) ;在 word 文档中的字符或句子周围应用边框
  20. AlphaStar 星际首秀,人工智能走向星辰大海

热门文章

  1. C++编程语言中重载运算符(operator)介绍
  2. moment时区转换
  3. 反激电源电路电磁干扰原理
  4. 从零搭建KVM虚拟服务器
  5. 学科前沿讲座 神经网络,机器学习,深度学习
  6. 以讹传讹的小故事大道理
  7. 美妆行业如何在小红书营销推广?美妆品牌的线上推广怎么宣传更有效果?
  8. 潇潇六月雨 input file里的JQ change() 事件的只生效一次
  9. luogu P1338 末日的传说
  10. 上帝叫我牵一只蜗牛去散步