转自 https://blog.csdn.net/lwj103862095/article/details/7857428
S3C2440定时器简介:
S3C2440一共有5个16位的定时器,其中定时器0、1、2、3有PWM(脉冲宽度调制)功能,它们都有一个输出引脚(如TOUTn【n为0~3】),可以通过定时器来控制引脚周期性的高、低电平变化,但是定时器4没有输出引脚。
定时器顾名思义需要时钟去维持,那么它的时钟源为PCLK,首先通过两个8位的预分频降低频率,其中,定时器0共用第一个预分频器,定时器2、3、4共用第二个预分频器。预分频器的输出将进入第二级分频器,它们输出5种频率的时钟,2、4、8、16和TCLK0/1(外部时钟),每个定时器的工作时钟就是从这5种频率中选择得来的啦。
8位预分频是通过TCFG0寄存器来设置的,4位分频是通过TCFG1来设置的。定时器的结构示意图如下:
定时器的内部逻辑单元图如下所示
定时器工作流程如下所示
定时器操作的详细例子
接下来我们来讲解一下有关定时器的一些寄存器:
1、TCFG0寄存器(TIMER CONFIGURATION)
位[7:0]、位[15:8]分别用于控制预分频器0、1,它们的值可以设置为0~255,经过预分频器出来的时钟频率为:PCLK/{ prescaler value +1}
2、TCFG1寄存器(TIMER CONFIGURATION)
经过预分频器得到的时钟将被2分频、4分频、8分频、16分频,除了这4种频率外,额外低,定时器0、1还可以工作在外接的TCLK0时钟下,定时器2、3、4还可以工作在外接的TCLK1下。
通过TCFG1寄存器来设置这5个定时器,分别工作于这5种频率中的哪一个频率。所以定时器哦你工作的公式可以按照下面的计算:
定时器工作频率 = PCLK/{prescaler value + 1}/{driver value}.
{prescaler value} = 0~255;
{driver value} = 2、4、8、16;
3、TCNTBn/TCMPBn 寄存器
n为0~4,这两个寄存器都只用到位[15:0],TCNTBn中保存定时器的初始计数值,TCMPBn中保存比较值。它们的值在启动定时器时,被传到定时器内部寄存器TCNTn、TCMPn 中。
注意:没有TCMPB4,因为定时器4没有输出引脚。 这里仅列出TCNTB0和TCMPB0寄存器的一些参数:
要控制PWM的占空比就是控制TCMPBn这个寄存器:
4、TCNTOn寄存器(COUNT OBSERVATION)
n为0~4,定时器n被启动后,内部寄存器TCNTn在其工作时钟下不断减1计数,我们可以通过读取TCNTOn寄存器得知其值。
5、TCON 寄存器(TIMER CONTROL)
它有以下4个作用:
(1)、第一次启动定时器“手动”将TCNTBn/TCMPBn 寄存器的值装入内部寄存器TCNTn、TCMPn中;
(2)、启动、停止寄存器;
(3)、决定在定时器计数到达0时,是否自动将TCNTBn/TCMPBn 寄存器的值装入内部寄存器TCNTn、TCMPn中,即是否启动自动重载功能;
(4)、决定定时器输出管脚TOUTn 的输出电平是否反转;
TCON寄存器位[3:0]、位[11:8]、位[15:12]、位[19:16]、位[22:20]分别用于定时器0~4,除了定时器4外没有“输出反转”(因无输出管脚),其他功能相似。下面以定时器0说明这些位的作用:
在第一次使用定时器时,需要设置“手动更新”位[1] ,为1,使得TCNTBn/TCMPBn寄存器的值装入内部寄存器TCNTn、TCMPn中,如果下一次还要设置这一位,需要先将它清零。TCON(定时器控制寄存器)还要DMA、Dead Zone的设置,这里不常用,就不详述了。
—————————————————————————————————————————————————
到这里,定时器这一节我们就讲解完毕啦。定时器PWM详解 - 23号的wj - 伟坚的博客定时器PWM详解 - 23号的wj - 伟坚的博客