什么是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