看到一篇很好的博文,分析2410定时器中断的使用的,很详细,和大家分享一下

转载来源于http://www.cnblogs.com/Neddy/archive/2011/07/01/2095176.html

s3c2410提供了5个16位的Timer(Timer0~Timer4),其中Timer0~Timer3支持Pulse
Width Modulation—— PWM(脉宽调制 )。Timer4是一个内部定时器(internal timer),
PCLK是Timer的信号源,我们通过设置每个Timer相应的Prescaler和Clock
Divider把PCLK转换成输入时钟信号传送给各个Timer的逻辑控制单元(Control
Logic),事实上每个Timer都有一个称为输入时钟频率(Timer input clock
Frequency)的参数,这个频率就是通过PCLK,Prescaler和Clock Divider确定下来的,每个Timer
的逻辑控制单元就是以这个频率在工作。下面给出输入时钟频率的公式:

Timer input clock Frequency = PCLK / {prescaler value+1} /
{clock divider }
{prescaler value} = 0~255
{ clock divider } = 2, 4, 8, 16

然而并不是每一个Timer都有对应的Prescaler和Clock
Divider,从上面的原理图我们可以看到Timer0,Timer1共用一对Prescaler和Clock
Divider,Timer2,Timer3,Timer4共用另一对Prescaler和Clock
Divider,s3c2410的整个时钟系统模块只存在两对Prescaler和Clock Divider。

我曾经在讨论watchdog的文章中提到,watchdog也是一种定时器,他的工作就是在一个单位时间内对一个给定的数值进行递减和比较的操作,而我们这篇文章讨论的定时器他的工作内容和watchdog在本质上是一样的。定时器在一个工作周期(Timer
input clock cycle)内的具体工作内容主要有3个。分别是:

1. 对一个数值进行递减操作
2. 把递减后的数值和另一个数值进行比较操作
3. 产生中断或执行DMA操作

在启用Timer之前我们会对Timer进行一系列初始化操作,这些操作包括上面提到的设置Prescaler和Clock
Divider,其中还有一个非常重要的就是要给Timer两个数值,我们分别称之为Counter(变量,用于递减)和Comparer(定值,用于比较),Counter会被Timer
加载到COUNT BUFFER REGISTER(TCNTB),而Comparer会被Timer 加载到和COMPARE BUFFER
REGISTER(TCMPB),每个Timer都有这样两个寄存器。当我们设置完毕启动Timer之后,Timer在一个工作周期内所做的就是先把TCNTB中的数值(Counter)减1,之后把TCNTB中的数值和TCMPB中的数值(Comparer)进行对比,若Counter已经被递减到等于Comparer,发生计数超出,则Timer产生中断信号(或是执行DMA操作)并自动把Counter重新装入TCNTB(刷新TCNTB以重新进行递减)。以上就是Timer的工作原理。

下面我们结合代码具体说明如何对Timer0进行初始化并开启它。
首先我假设我的PCLK是50700000Hz

// define Timer register
#define rTCFG0 (*(volatile unsigned int *)0x51000000)
#define rTCFG1 (*(volatile unsigned int *)0x51000004)
#define rTCON (*(volatile unsigned int *)0x51000008)
#define rTCNTB0 (*(volatile unsigned int *)0x5100000C)
#define rTCMPB0 (*(volatile unsigned int *)0x51000010)
#define rTCNTO0 (*(volatile unsigned int *)0x51000014)
#define rTCNTB1 (*(volatile unsigned int *)0x51000018)
#define rTCMPB1 (*(volatile unsigned int *)0x5100001C)
#define rTCNTO1 (*(volatile unsigned int *)0x51000020)
#define rTCNTB2 (*(volatile unsigned int *)0x51000024)
#define rTCMPB2 (*(volatile unsigned int *)0x51000028)
#define rTCNTO2 (*(volatile unsigned int *)0x5100002C)
#define rTCNTB3 (*(volatile unsigned int *)0x51000030)
#define rTCMPB3 (*(volatile unsigned int *)0x51000034)
#define rTCNTO3 (*(volatile unsigned int *)0x51000038)
#define rTCNTB4 (*(volatile unsigned int *)0x5100003C)
#define rTCNTO4 (*(volatile unsigned int *)0x51000040)

void timer0_config()
{

rTCFG0=119

rTCFG1=3;

rTCNTB0=26406;
rTCMPB0=0;
}
由于我们的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()
{

rTCON|=1<<1;

rTCON=0x09;
}

附件:

最新文章

  1. 去年做了什么?OA。
  2. C#调用webservice简单实例
  3. python简单文件操作
  4. jQ插件--时间线插件和拖拽API
  5. Qt 无边框窗体改变大小 完美实现(全部自己实现)
  6. 读书笔记3 Socket
  7. ORM之PetaPoco入门(一)--Petapoco简介
  8. [转]Getting (personal) tasks from the user profile.
  9. C#读取和写入文件
  10. Webdriver+testNG+ReportNG+Maven+SVN+Jenkins自动化测试框架的pom.xml配置
  11. Python全栈【进程、线程】
  12. JavaScript tips:数组去重
  13. linux上pem格式私钥转pfx格式证书的命令
  14. 证明LDU分解的唯一性
  15. fedora27安装后的配置工作(持续更新)
  16. MySQL Transaction--RR事务隔离级别下加锁测试
  17. Read N Characters Given Read4 II - Call multiple times
  18. 自定义控件(视图)2期笔记13:View的滑动冲突之 内部拦截法
  19. spring事务传播特性实验(2):PROPAGATION_REQUIRED实验结果与分析
  20. Python3 shelve模块(持久化)

热门文章

  1. 软工15个人作业4——alpha阶段
  2. Games Delphi developers play
  3. CentOS修改系统的默认启动模式为命令号界面
  4. Java 实现--时间片轮转 RR 进程调度算法
  5. Linux内核开发
  6. hibernate 多对多(many-to-many)
  7. 十八、python沉淀之路--生成器
  8. FastAdmin 一键 CRUD 生成时方法不存在的问题分析
  9. 获取微信用户openid
  10. MyBatis缓存结构