S3C6410时钟控制(2)PWM定时器设置
1、 S3C6410定时器综述
(1) 定时器资源,参见上图,S3C6410有5个32位定时器,其中定时器0和定时器1具有脉冲宽度调制(PWM)功能,定时器2、3、4仅供内部定时而没有输出引脚,定时器0和1具有死区生成器,可以用来控制大电流设备。
(2) 定时器时钟源为PCLK。首先通过两个8位预分频器降低频率,定时器0、1共用第一个预分频器,定时器2、3、4共用第二个预分频器;预分频器的输出进入第二级分频器,可以进行1、2、4、8、16分频;每个定时器的工作时钟可以从第二级分频器和外部时钟TCLK0/TCLK1中选择。
2、 定时器初始化
(1) 设置定时器的时钟频率。每一个时钟周期定时器减1,定时器的时钟频率为每秒定时器的减少值。定时器输入时钟频率=PCLK/(prescaler value+1)/(divider value)其中prescaler value取值1~255,TCFG0配置;divider value取值1、2、4、8、16、TCLK,TCFG1配置
(2) 设置定时器的计数值。定时器的计数值和定时器的时钟频率决定定时器的触发时间。
(a)
(b) 使能定时器中断,并清除定时器中断标志;
(c) 设定manual-updata位为1(推荐也设定inverter on/off bit为1),如果需要重复,则auto-reload置为1;
(d) 启动定时器包括设定start bit为1和清除manual-updata bit。
说明:起始,容易被manual-updata和auto-reload弄晕,我的理解是:manual-updata只要置1,则对应缓充寄存器中的值立即写入对应的寄存器中,通常只有在最初启动定时器之前,写入初始值之后,置1,之后在启动之前立即置0;auto-reload只要置1,则会在TCNTn计数值变为0的时候,自动的重新将对应缓冲寄存器的值写入对应寄存器中,则定时器会继续运行下去,如果置0,则定时器运行到TCNTn计数值变为0之后会停止。
(3) 定时器中断相关系统中断VIC的设置,包括关闭对应中断,设置中断类型,清除系统中断标志,写中断处理程序入口地址,使能中断等等。(参考以前的外部中断)
(4) 设置置定时器中断处理函数。定时发生,触发定时器中断,进入中断处理函数。中断程序中通常可以用来改变计数值和比较值,或者对auto-reload和中断允许之类的进行设定。
3、 定时器启动(直接付上用户手册的两个运行例子)
4、 定时器寄存器
(1)定时器配置寄存器0(TCFG0)和定时器配置寄存器1(TCFG1)。其中TCFG0用来配置两个8位预分频值和死区长度;TCFG1用来控制五个多路选择器和DMA模式选择;可读可写
(2)定时器控制寄存器(TCON)。一般用来控制定时器的auto-reload、manual-updata、start/stop这三位,然后还有定时器0和1的ouput-inverter-on/off位,以及死区使能位。
(3) 定时器计数缓冲寄存器(TCNTBn)、定时器比较缓冲寄存器(TCMPBn)、定时器计数观察寄存器(TCNTO0),这里仅截定时器0的图。
(4) 定时器中断控制和状态寄存器TINT_CSTAT。可以用来使能某个寄存器的中断,也可用来判断是哪个寄存器发生中断,并写1清除该中断。
5、 系统中断VIC。与定时器相关的VIC知识,
1) 先关闭INT_TIMER
2) 设置系统中断类型
3) 清除系统中断标志
4) 写中断处理程序地址
5) 使能系统中断
具体的参照外部中断的内容,同样注意使能VIC和IRQ,在启动程序中。
用户1651464 2014-4-25 11:06
用户403664 2014-4-23 10:27