S3C2440A 具有5 个16 位定时器,每个定时器可以按照中断模式或DMA 模式工作。定时器0,1,2,3 具有PWM 功能。定时器4 是一个内部定时器,不具有对外输出口线。定时器0 还具有死区发生器,通常用于大电流设备。
定时器特性总结如下。
● 5 个16 位定时器可以工作在中断模式或DMA 模式。
● 包括2 个8 位预分频器、2 个4 位分割器。
● 输出波形的占空比可用编程控制(即进行脉宽调制)。
● 具有自动重载模式或单次触发模式。
● 具有死区发生器。

与定时器相关的寄存器有:TCFG0、TCFG1、TCON、TCMPBn、TCNTBn、TCNTOn 定时器的频率由PCLK分频而来,即Ftimer = PCLK / (prescaler+1) / MUX
prescaler位于TCFG0,MUX位于TCFG1 TCON控制定时器的运行:是否自动装载定时器初值,是否手动装载,开始/停止 定时器。 TCNTBn放定时器n的初值,装载用
TCMPBn放定时器n的匹配值,用于调至PWM
TCNTOn,只读,用于观察定时器n的初值
编程方法如下:
定时器初始化()
{
设置预分频器prescaler (TCFG0)
设置MUX (TCFG1)
赋初值TCNTB TCNTB = (PCLK / (prescaler+1) / MUX) * 中断时间间隔(单位秒)
TCON: 手动跟新打开
手动跟新关闭
自动装载(计时器循环计数)
启动定时器
}
中断初始化()
{
清除SRCPNF、INTPND中的相应中断标志位(可以调用ClearPending函数)
填入中断例程地址于中断向量表 pISR_EINTx
使能相应中断 rINTMSK
}
中断例程() __irq
{
……中断程序……
清除SRCPNF、INTPND中的相应中断标志位
}
下面是定时器0试验程序:
//************************************************************************************************
void Main(void)
{
int i;
……硬件初始化……
int_time0_init();
time0_init(); while(1);
} void int_time0_init(void)
{
Uart_Printf("Timer0中断实验\n");
ClearPending(1<<10); //清楚中断标志
pISR_TIMER0=(unsigned)timer0_ISR; //填入中断例程地址于中断向量表
rINTMSK&=~(1<<10); //TIME1开中断
} void time0_init(void)
{
rTCFG0 = rTCFG0 &(~0xFF) | 175; //设置预分频器prescaler0 = 175
rTCFG1 = rTCFG1 &(~0xF) | 2; //设置MUX0 = 1/8
rTCNTB0 = PCLK/(175+1)/8; //一秒,注意右值别溢出16位
rTCON |= 1<<1; //开启手动更新,将TCNTB0的值载入定时器0
rTCON &= ~(1<<1); //关闭手动更新(必须)
rTCON |= 1<<0 | 1<<3; //开启定时器,自动装载模式
//关于中断时间的设定: TCNTB =(PCLK / (prescaler+1) / MUX) * 中断时间间隔(单位秒)
} void timer0_ISR(void) __irq
{
n++;
Uart_Printf("Timer0 已经中断 %d 次\n",n);
ClearPending(1<<10); //清楚中断标志
} //*********************************************************************************************************** 运行结果如下:

|