由于我们的PCLK是50700000Hz, 根据Timer input clock Frequency的计算公式我们如下计算Timer0的时钟输入频率:
- prescaler value = 119
- divider value = 1/16
- PCLK= 50700000
- Timer input clock Frequency =50700000/ (119+1)/(1/16)=26406
也就是说通过设置prescaler和divider value之后,Timer0的工作频率为26406,也就是说一秒内Timer0会进行26406次递减和比较操作,假设我们现在是要让Timer0每1秒产生一次中断的话,我们应该设置Counter=26406和Camparer=0,既:
- rTCNTB0=26406;
- rTCMPB0=0;
如果我们要让Timer0每0.5秒产生一次中断,则我们应该设置Counter=26406/2和Camparer=0,既:
- rTCNTB0=13203;
- rTCMPB0=0;
如果我们要让Timer0每0.25秒产生一次中断,则我们应该设置Counter=26406/4和Camparer=0,既:
- rTCNTB0=6601;
- rTCMPB0=0;
初始化完Timer后我们要开启它。
- void timer0_start()
- {
- /*
- Update TCNTB0 & TCMPB0
- rTCON寄存器的第1位是刷新Timer0的COUNT BUFFER REGISTER(TCNTB)和
- COMPARE BUFFER REGISTER(TCMPB),由于是第一次加载Counter和Comparer,
- 所以我们需要手动刷新它们
- */
- rTCON|=1<<1;
- /*
- 置rTCON第0位为1,开启Timer0
- 把rTCON第1位置为0,停止刷新TCNTB0 和 TCMPB0
- 置rTCON第3位为1,设置Counter的加载模式为自动加载(auto reload),这样每当
- Timer计数超出之后(此时TCNTB的值等于TCMPB的值),Timer会自动把原来我们给
- 定的Counter重新加载到TCNTB中
- */
- rTCON=0x09;
- }
要使你的Timer能够正常的工作,除了调用timer0_config()和timer0_start()之外,我们还必须设置Timer的中断服务例程并取消对Timer的中断的屏蔽.这些操作可以参考<<s3c2410 中断异常处理>>一文.