1.概览
S3C2440A有5个16-bit的定时器 . 定时器0,1,2,3有PWM功能 , 定时器4只有一个内部定时没有关联上输出管脚 . 定时器0有一个dead-zone产生器 ,用于大电流设备 .
定时器 0 和 1 共享这一个8-bit的预分频器 , 定时器2,3,4共享另一个8-bit的预分频器 . 每一个定时器都有一个时钟分频器 , 用于产生5个不同的分频信号(1/2 ,1/4 , 1/8 , 1/16 , TCLK) . 每一个定时器模块从时钟分频器(clock divider)(输入到时钟分配器的信号是来自于对应的8-bit预分频器)接收自己的时钟信号 . 这个8-bit的预分频器是可编程的并且分频PCLK根据设置的值(TCFG0和TCFG1寄存器里的值) .
定时计数缓冲寄存器(timer count buffer :TCNTBn):在定时器启动时 , TCNTBn里的值 会被加载到递减计数器(down-counter)里 . 而对于定时比较缓冲寄存器(timer compare buffer : TCMPBn)里的值会被加载到比较寄存器(compare register)来跟递减计数器进行比较.
每一个定时器都有一个属于自己的16-bit的递减计数器,这个计数器的计数由定时器时钟驱动. 但递减计数器到达0时 , 定时器中断请求产生通知CPU定时器运行完成 .
TCMPBn的值通常用于PWM . 定时器控制逻辑改变输出逻辑当递减计数器和比较寄存器相匹配时 , 所以比较寄存器决定了PWM输出的开启时间(或者说关闭时间) .
特征:
------5个16-bit定时器
------两个8-bit预分频和两个4-bit分频器
------可编程PWM占空比
------重装载模式或者一次性脉冲模式
------dead-zone产生器
2.16-bit PWM 定时器模块框架图
3.PWM定时器的运行时序如下:
注:
一个定时器(除了定时器通道5)都有TCNBn , TCNTn, TCMPBn 和 TCMPn . (TCNTn和TCMPn都为内部寄存器 . 其中TCNTn的值可以从TXCNTOn寄存器里读到) 当定时器到达 0 时 , TCNTBn和TCMPBn的内容被装载到TCNTn和TCMPn . 当TCNTn到达0时 , 一个中断请求将会出现 (假如中断使能) . 当TCNTn = TCMPn时 , TOUTn逻辑电平翻转.
4.自动重载(auto reload)和双重缓冲器
S3C2440A的PWM定时器有一个双重缓冲功能 , 使能重载内容给下一个定时操作而不需要停止当前的定时操作 . 所以 , 尽管性的定时器值被设置 , 当前定时器操作都能正确完成 .
定时器的内容可以写入TCNTBn , 并且可以从TCNTOn寄存器里读取定时器的当前计数值 . 假如TCNTBn被读取 , 这个值是用于下次定时操作的重载值而不是当前计数器的值 .
一旦TCNTn到达 0 之后 , 自动重载操作拷贝TCNTBn的值到TCNTn . 写在TCNTBn里的值只有在TCNTn到达 0 并且使能自动重载才会被加载到TCNTn . 假如TCNTn计数到0并且自动重载位被设置为 0 ,那么TCNTn不做任何操作 .
以下是一个例子:
5.定时器初始化使用manual update 和 inverter bit(反相位)
一个定时器的自动重载操作会在递减计数器计数到 0 时发生 . 所以 , 一个TCNTn的初始值必须提前被定义 . 在这种情况下 , 初始值需要手动加载到进TCNTn通过manual update位. 具体步骤如下:
1)把初始值写入TCNTBn和TCMPBn
2)设置相应定时器的manual update位 . (推荐也配置反相器开关位)
3)设置相应定时器的启动位来启动定时器(并且清除手动更新位)
如果定时器被迫停止 ,TCNTn保持计数值并且不从TCNTBn重载数据 . 如果希望设置一个新的计数值 , 则需要手动更新 .
注意:
一旦TOUT反相器开关位被改变了 , TOUTn逻辑值也被改变不管定时器有没有工作 , 所以 , 在设置手动配置位时也配置反相器开关位是合适的 .
1)输出电平控制
如果反相器被关闭 , 那么定时器的输出管脚初始值为高电平 , 在定时器启动后 , 在TCNTn>TCMPn期间 , 输出为 ' 0 ' , 在TCNTn < TCMPn期间 , 输出为 ' 1 ' . 如果反相器被打开 , 情况与上述相反 .