ARM的PWM定时器(S3C2440)

ARM 246浏览


参考S3C2440的数据手册的第10章《PWM定时器》

概述
S3C2440A 有 5 个 16 位定时器。其中定时器 0、1、2 和 3 具有脉宽调制(PWM)功能。定时器 4 是一个无输出引脚的内部定时器。定时器 0 还包含用于大电流驱动的死区发生器。

S3C2440有两个8 位预分频器。定时器 0 和 1 共用一个 8 位预分频器,定时器 2、3 和 4 共用另外的 8 位预分频器。使得PCLK分频进入下一步操作。8 位预分频器由TCFG0寄存器设置。
每个定时器都有一个可以生成 5 种不同分频信号(1/2,1/4,1/8,1/16 和 TCLK)的时钟分频器。使得经过8 位预分频器的时钟再次分频。由TCFG1寄存器设置。
看一下PWM定时器的方框图
在这里插入图片描述
从方框图仅能看出定时器的时钟频率,具体如何工作还需看内部结构。

下图为内部控制逻辑图
在这里插入图片描述
定时器的工作流程为:

  1. 设置TCMPBn和TCNTBn,分别为比较值和初值。
  2. 随之设置TCON启动定时器,这时,TCMPBn和TCNTBn的值被装载至TCMPn和TCNTn。定时器的TCNTn开始减1计数。
  3. 当TCNTn的值等于TCMPn的值时,定时器的输出管脚TOUTn的输出电平反转。定时器的TCNTn继续减1计数。
  4. 当TCNTn的值减到0时,输出管脚TOUTn的输出电平再次反转。并处罚中断。
  5. 当TCNTn的值减到0时,如果TCON寄存器中设置为自动重载,则TCMPBn和TCNTBn的值被自动装载至TCMPn和TCNTn,开始下一个计数流程。

对于定时器的操作:
1设置时钟
2设置初值
3加载初值,启动Timer
4设置自动加载
5中断相关

编程
具体代码如下:


#include "timer.h"
extern flag;

void interrupt_init(void)
{

	INTMSK &= ~(1<<10);		/* Service available */

}


/* 定时器输入时钟频率 = PCLK / {预分频值+1} / {分频值} */
/* 31250 = 50000000/(99+1)/16  */
void timer_init(void)
{
	TCFG0 = 99;			//定时器0和1的预分频值为99
	TCFG1 &= ~(0xf<<0);
	TCFG1 |= (3<<0);	//定时器1的分频值为1/16
	TCNTB0 = 31250;		//定时周期设为1s
	TCON |= (1<<1);		//手动更新

	TCON &= ~(1<<1);
	TCON |= ((1<<0) | (1<<3));		//开启自动重载,开启定时器
}

void timer_isr(void)
{
	if (flag)
	{
		GPFDAT |= (1<<4);
		GPFDAT |= (1<<5);
		GPFDAT |= (1<<6);

		flag = 0;
	}
	else
	{
		GPFDAT &= ~(1<<4);
		GPFDAT &= ~(1<<5);
		GPFDAT &= ~(1<<6);

		flag = 1;
	}
	SRCPND |= (1<<10);			//清中断
	INTPND |= (1<<10);
}