分类: LINUX
2008-06-17 12:39:44
转载自:http://enkunlee.blog.163.com/blog/static/204341520068257228342/
ARM,S3C2410中脉宽调制定时器
S3C2410有5个16bit定时器。定时器0-3有脉宽调制功能(Pulse Width Modulation,PWM),定时器4是内部定时器,没有输出引脚。定时器0有Dead-zone发生器,可以保证一对反向信号不会同时改变状态,常用于大电流设备中。
定时器0-1共用一个8bit prescaler,定时器2-4共用另外一个。每个定时器有一个时钟分频器,可以选择5种分频方法。每个定时器从各自的时钟分频器获取时钟信号。prescaler是可编程的,并依据TCFG0-1寄存器数值对PCLK进行分频。
当定时器被使能之后,定时器计数缓冲寄存器(TCNTBn)中初始的数值就被加载到递减计数器中。定时器比较缓冲寄存器(TCMPBn)中的初始数值被加载到比较寄存器中,以备与递减计数器数值进行比较。这种双缓冲特点可以让定时器在频率和占空比变化时输出的信号更加稳定。
每个定时器都有一个各自时钟驱动的16bit递减计数器,当计数器数值为0时,产生一个定时中断,同时TCNTBn中的数值被再次载入递减计数器中再次开始计数。只有关闭定时器才不会重载。TCMPBn的数值用于PWM,当递减计数器的数值和比较寄存器数值一样时,定时器改变输出电平,因此,比较寄存器决定了PWM输出的开启和关闭。
S3C2410的PWM定时器采用双buffer机制,可以不停止当前定时器的情况下设置下一轮定时操作。定时器值可以写到TCNTBn,而当前定时的计数值可以从TCNTOn获得,即,从TCNTBn获得的不是当前数值而是下一次计数的初始值。
自动加载功能被打开后,当TCNTn数值递减到0时,芯片自动将TCNTBn的数值拷贝到TCNTn,从而开始下一次循环,若TCNTBn数值为0,则不会有递减操作,定时器停止。
第一次启动定时器的过程如下:(1)初始化TCNTBn和TCMPBn的数值;(2)设置定时器的人工加载位,不管是否使用极性转换功能,都将极性转换位打开;(3)设置定时器的启动位来启动定时器,同时清除人工加载位。
若定时器在计数过程中被停止,则TCNTn保持计数值,若需要设置新的数值需要人工加载。定时器的工作过程可以用下图表示。
1, 使能自动加载功能,设置TCNTBn=160,TCMPBn=110,设置人工加载位并配置极性转换位,人工加载位将时TCNTBn、TCMPBn的数值加载到TCNTn、TCMPn。然后,设置TCNTBn、TCMPBn为80和40,作为下一次定时的参数。
2, 设置启动位,若人工加载位为0,极性转换关闭,自动加载开启,则定时器开始递减计数(计数前有一个设定时间,可以理解为与setup time类似)。
3, 当TCNTn的数值和TCMPn一致时,TOUTn从低变为高。
4, 当TCNTn计数至0,定时器产生中断请求,同时TCNTBn、TCMPBn的数值被自动加载到TCNTn、TCMPn,前者为80,后者为40。
5, 中断服务向量(ISR)将TCNTBn、TCMPBn设置为80和60。
6, 与3相似。
7, 与4相似,TCNTn、TCMPn,前者为80,后者为60。
8, ISR服务程序中,将自动加载和中断请求关闭。
9, 与6、3相似。
10,TCNTn为0,TCNTn不会自动加载新的数值,定时器被关闭。
11,没有新的中断发生。
同时,由上面的工作过错可以看出,通过ISR或别的方法写入不同的TCMPBn的数值,就可以调节输出信号的占空比,实现脉宽调制(PWM)。
Dead Zone主要用在控制外设的使能,其功能主要是在关闭一个设备和开启另一个设备之间,插入一个时间间隙,以防止两个设备同时改变状态。(有利于减小系统干扰?)
定时器可以通过TCFG1寄存器的DMA模式位配置为DMA请求源信号(nDMA_REQ)发生器,当定时器被这样配置后,它将nDMA_REQ信号一直置低,直到接收到ACK信号。当定时器收到ACK信号,它将nDMA_REQ信号置高(无效)。当定时器被设置为DMA请求模式时,不会产生中断请求。只能有一个定时器被配置为DMA请求源。