Timer和counter
什么是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
Timer和counter的更多相关文章
- Timer.4 - Using a member function as a handler
In this tutorial we will see how to use a class member function as a callback handler. The program s ...
- 关于js单线程(转载)
进程和线程都是操作系统的概念.进程是应用程序的执行实例,每一个进程都是由私有的虚拟地址空间.代码.数据和其它系统资源所组成:进程在运行过程中能够申请创建和使用系统资源(如独立的内存区域等),这些资源也 ...
- MINIX3 内核时钟分析
MINIX3 内核时钟分析 4.1 内核时钟概要 先想想为什么 OS 需要时钟?时钟是异步的一个非常重要的标志,设想一下,如 果我们的应用程序需要在多少秒后将触发某个程序或者进程,我们该怎么做到? ...
- 细说JavaScript单线程的一些事
标签: JavaScript 单线程 首发地址:码农网<细说JavaScript单线程的一些事> 最近被同学问道 JavaScript 单线程的一些事,我竟回答不上.好吧,感觉自己的 Ja ...
- Linux时间子系统之(二):软件架构
专题文档汇总目录 Notes:从框架上讲解了时间子系统,从底向上包括CPU Local TImer.Global Counter.Clock Souce/Clock Events模块管理.Tick D ...
- 2. 2A03简介
2A03简介 1.CPU 1.1 内部寄存器 1.累加寄存器A(Accumulator):8位寄存器,用于同算术逻辑单元(ALU)共同完成各种算术逻辑运算,它既为ALU提供原始操作数又担任存放ALU运 ...
- Singer 学习十 同步模式
sync 模式是属于tap 的操作,同步模式下,tap 需要提交 schema. record .state message, singer 指南对于每种 类型有详细的说明 streams 每个str ...
- javascript单线程那些事
首先,说下为什么 JavaScript 是单线程? 总所周知,JavaScript是以单线程的方式运行的.说到线程就自然联想到进程.那它们有什么联系呢? 进程和线程都是操作系统的概念.进程是应用程序的 ...
- STM32定时器级联 -- AN2592
Master configuration When a timer is selected as a master timer, the corresponding trigger output si ...
随机推荐
- 关于TFTLCD硬件接口和驱动的问题
在设计TFTLCD液晶硬件驱动电路的时候,我们会发现TFTLCD裸屏(买来的最初元件)的接口并非相似,所以导致驱动电路设计需要有些差别. TFTLCD液晶的本质 ...
- 一步步学习NHibernate(7)——HQL查询(1)
请注明转载地址:http://www.cnblogs.com/arhat 从本章开始,老魏带着大家来学习一下HQL语句.HQL语句NHibernate为我们提供的一种功能比较强大的查询语句,这个HQL ...
- pywinauto简单介绍
Pywinauto是基于Python开发的,用于自动化测试的脚本模块,主要操作于Windows标准图形界面.它可以允许你很容易的发送鼠标.键盘动作给Windows的对话框和控件. 其中,最主要功能为对 ...
- 移动前端javascript事件
移动端事件: // 手势事件 touchstart //当手指接触屏幕时触发 touchmove //当已经接触屏幕的手指开始移动后触发 touchend //当手指离开屏幕时触发 touchcanc ...
- SHELL学习笔记----IF条件判断,判断条件
SHELL学习笔记----IF条件判断,判断条件 前言: 无论什么编程语言都离不开条件判断.SHELL也不例外. if list then do something here ...
- 在C#中关于excel的导入和导出操作
一.先来看看最常见的导入操作吧! private void Import() { //打开excel选择框 OpenFileDialog frm = new OpenFileDialog(); frm ...
- XSS之学习误区分析
有段时间没写东西了, 最近看到zone里出现了很多“XSS怎么绕过某某符号的帖子”,觉得很多新手在寻找XSS时走进了一些误区,比如:专门想着怎么去“绕过”.这里做个总结,希望对大家有所帮助. 1. 误 ...
- Fast CGI 工作原理
http://www.cppblog.com/woaidongmao/archive/2011/06/21/149092.html 一.FastCGI是什么? FastCGI是语言无关的.可伸缩架构的 ...
- POJ2200+全排列模拟
简单. 手动的实现全排列 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<a ...
- 怎么查看和修改 MySQL 的最大连接数?
一. 查看Mysql当前配置 MySQL 默认的最大连接数为 100,可以在 mysql 客户端使用以下命令查看 mysql> show variables like '%connections ...