S3C2440A 有 5 个 16 位定时器。其中定时器 0、1、2 和 3 具有脉宽调制 (PWM )功能。定时器 4 是一个无输出引脚的内部定时器。
定时器 0 和 1 共用一个 8 位预分频器 ,定时器 2、3 和 4 共用另外的 8 位预分频器。
每个定时器都有一个可以生成 5 种不同分频信号 (1/2 ,1/4 ,1/8 ,1/16 和 TCLK )的时钟分频器。
每个定时器模块从相应 8 位预分频器得到时钟的时钟分频器中得到其自己的时钟信号。8 位预分频器是可编程的 ,并且按存储在 TCFG0 和 TCFG1 寄存器中的加载值来分频 PCLK。
每个定时器有它自己的由定时器时钟驱动的 16 位递减计数器。当递减计数器到达零时 ,产生定时器中断请求通知 CPU 定时器操作已经完成。
定时器寄存器:
定时器的工作流程
void timer0_init(void)
{
//定时器0输入时钟频率 = PCLK/(预分频值+1)/(分频值),即25KHz=50MHz/(250*8)=50MHz/(2000)
rTCFG0 = (rTCFG0 & ~(0xff)) | 249; // prescaler1=249
rTCFG1 = (rTCFG1 & ~(0x0f)) | (0x2); //divider:8,0b0010
rTCNTB0 = 25000; //让定时器0每隔1秒中断一次,则写入寄存器的数值为2500=25kHz/10Hz
rTCMPB0 = 12500; //每个0.5s取反一次
rTCON = rTCON | 0x2;//手动更新TCNTB0;
rTCON = rTCON & ~(0x0f) | 0x09 ;//自动重载,输出不取反,自动更新TCNTB0,启动定时器0
}