定时器
7.1 通用定时器概述
定时器或计数器的逻辑电路本质上是相同的,它们之间的区别主要在用途上。它们都是主要由带有保存当前值的寄存器和当前寄存器值加1或减1逻辑组成,其内部工作原理图是以一个N位的加1或减1计数器为核心,计数器的初始值由初始化编程设置,计数脉冲的来源有两类:系统时钟和外部事件脉冲。
定时工作方式
若编程设置定时/计数器为定时工作方式时,则N位计数器的计数脉冲来源于内部系统时钟,并经过M分频。每个计数脉冲使计数器加1或减1,当N位计数器里的数加到0或减到0时,则会产生一个“回0信号”,该信号有效时表示N位计数器里的当前值是0。因为系统时钟的频率是固定的,其M分频后所得到的计数脉冲频率也就是固定的,因此通过对该频率脉冲的计数就转换为定时,实现了定时功能。
计数工作方式
若编程设置定时/计数器为计数方式时,则N位计数器的计数脉冲来源于外部事件产生的脉冲信号。有一个外部事件脉冲,计数器加1或减1,直到N位计数器中的值为0,产生“回0信号”。
N位计数器里初始值的计算,在不同的定时部件中其具体的计算公式是不同的。
7.2S5PV210的脉宽调制定时器
S5PV210有五个32位脉冲宽度调制定时器。这些定时器为ARM分系统产生内部中断。此外,定时器0、1、2、3包含一个PWM功能模块,用于驱动外部I/O信号。定时器0中的PWM可选择的死区发生器,能够支持一个大电流设备。定时器4是没有外部引脚的内部定时器。
定时器将APB—PCLK作为时钟源。定时器0和1共用一个可编程8比特分频器,该分频器为PCLK提供第一层分频。定时器2、3、4共用一个不同的8比特分频器。每个定时器有自己的专用时钟分频器,用于提供第二层的时钟分频器(分频器分为2、4、8、16分频)。
每一个定时器有自己的由定时器时钟分频得到的32比特减法计数器。减法计数器最初从定时器计数缓冲寄存器(TCNTBn)中得到初值,然后在定时器时钟控制下进行减法操作。在自动重载工作状态,如果减法计数器降到了0,TCNTBn相应的值会重载到减法计数器来启动下一个循环。
PWM功能要用到TCMPBn比较缓冲寄存器的值。如果在定时器控制逻辑下,减法计数器的值与比较寄存器的值相匹配,定时器逻辑会改变输出电平。因此,比较缓冲寄存器决定了PWM输出的开启和关闭时间。
TCNTBn和TCMPBn寄存器都是都是双缓存配置,能够使定时器参数在循环的中间得到更新。新的数值直到当前时钟循环完成后才会起作用。
定时器组成:
减法计数器、初值寄存器、比较寄存器、观察寄存器、控制逻辑等5部分构成。
输入时钟频率的公式:
Timer input clock Frequency =
PCLK / {prescaler value+1} / {clock divider }
{prescaler value} = 0~255
{ clock divider } = 2, 4, 8, 16
PWM定时器的寄存器
寄存器声明:
// define Timer register
#define rTCFG0 (*(volatile unsigned int *)0xEA000000)
#define rTCFG1 (*(volatile unsigned int *)0xEA000004)
#define rTCON (*(volatile unsigned int *)0xEA000008)
#define rTCNTB0 (*(volatile unsigned int *)0xEA00000C)
#define rTCMPB0 (*(volatile unsigned int *)0xEA000010)
#define rTCNTO0 (*(volatile unsigned int *)0xEA000014)
……
前两个是定时器配置寄存器,主要用来设置预分频值和分割器值。第三个是控制寄存器,主要用来设置各定时器功能,第四个是计数缓冲寄存器,第五个是比较缓冲寄存器,第六个是计数观察寄存器。
定时器配置寄存器0(TCFG0)
用来配置2个预分频器和死区的的长度的寄存器。其中:
定时器输入时钟频率=PCLK/({预分频器值+1})/{分割器的值};
{预分频器值}=1~255;
{分割器的值}=1,2,4,8,16,TCLK;
死区长度=0~254。
定时器配置寄存器1(TCFG1)
配置每个定时器独有分割器的值。