ARM技术论坛
直播中

王鹏

7年用户 1240经验值
私信 关注
[问答]

求助ARM S3C2440定时器是怎样启动的呢

第一、S3C2440共有5个16位的定时器。其中定时器0、1、2、3有PWM(脉冲宽度调制:利用处理器的数字输出控制模拟电路)功能,他们都有一个输出引脚,可以通过定时器来控制引脚周期性的高、低电平变化;定时器4没有输出引脚。
第二、定时器部件的时钟源为PCLK,首先通过两个8位的预分频器降低频率:定时器0、1共用第一个预分频器,定时器2、3、4公用第二个预分频器。预分频器的输出将进入第二级分频器,它们输出5种频率的时钟:2分频、4分频、8分频、16分频或者外部的TCLK0/TCLK1,每个定时器的工作时钟也可以从这5种频率中选择。
第三、定时器启动流程
1. 定时器初始化
(1) 初始化定时器时钟频率
1.jpg
1.jpg
根据前面“第二”可以知道,5个定时器(0,1,2,3,4)都要进预分频和二级分频。
定时器分频的公式为:
定时器分频后时钟频率=PCLK时钟源频率/prescaler值(预分频值)/divider值(二级分频值)
Prescaler的值由上面表中可知是通过寄存器TCFG0来配置的,如果是定时器2,3,4,那么Prescaler的值 = TCFG0[15:8]中设置的值;如果是定时器0,1,那么
Prescaler的值 = TCFG0[7:0]中设置的值。
Divider的值由寄存器TCFG1来设置的,如果是定时器0,那么
Divider的值由TCFG1[3:0]设置确定,如果是定时器1,那么
Divider的值由TCFG1[7:4]设置确定,如果是定时器2,那么
Divider的值由TCFG1[11:8]设置确定,如果是定时器3,那么
Divider的值由TCFG1[15:12]设置确定,如果是定时器4,那么
Divider的值由TCFG1[19:16]设置确定。   
(2) 初始化设置定时器计数值
   即对寄存器TCMPBn和TCNTBn进行初始化(意思见后面讲的定时器工作流程)
   其中TCMPBn与TCNTBn两个单词最后一个字母n可取值为0,1,2,3,4,分别表示定时器
0,1,2,3,4。如TCMPB2与TCNTB2表示配置定时器2的寄存器。
(3) 初始化设置中断处理函数
2. 定时器启动
1.jpg
设置寄存器TCON[0]值为1即可启动定时器,设置TCON[0]值为0关闭定时器
TCON[3]值为0表示定时器启动后只执行一个周期,TCON[3]值为1表示定时器启动后会循环执行定时器
第四、定时器工作过程,下图表示的是定时器0的寄存器
1.jpg
假设 TCMPB0值设置为50, TCNTB0设置值为100,
当启动定时器0后
第(1)步TCMPB0会把值复制给TCMP0,TCNTB0把值复制给TCNT0,
第(2)步TCNT0的值开始循环减1,当TCNT0的值被减到50时,TCNT0的值
  与TCMP0的值相同,此时会触发一个中断。(我们就可以设置一个监听中断的中断处理函数,如果处理函数为播放音乐,那么就是相当于做了一个闹钟了。)
第(3)步TCNT0继承重复减1,当TCNT0的值被减到0时,有两种可能的的执行流程:
A.再次执行上面的“第(1)步”;
B.结束;
具体是再次执行上面的“第(1)步”,还是执行“结束”,由寄存器TCON的设置还判断.
(如果要想实时的取出TCNT0的值,可以通过TCNTO0寄存器。)

原作者:wangguangrong

更多回帖

发帖
×
20
完善资料,
赚取积分