garfield

【原创】kinetis 处理器pit模块使用2

0
阅读(2636)

上一篇博文简单介绍了飞思卡尔kinetis处理器的pit模块,主要介绍了模块的基本信息,结构以及寄存器描述,本篇博文将继续研究飞思卡尔kinetis处理器的pit模块,主要介绍pit模块的功能以及初始化。

1、功能

本节给出模块的详细操作信息,每一个定时器都可以用于产生触发脉冲和产生中断,每一个中断都占用独立的中断通道。

定时器周期性的产生触发信号,当定时器计数到零后会自动装载在LDVAL寄存器中设置的计数初值,每次定时器计数到零都会产生触发脉冲并且使中断标志置位。

所有的中断都可以由TCTRLn[TIE]位来控制允许或者屏蔽,只有当前一个中断清除后新的中断才可能产生。定时器的当前计数值可以通过读CVAL寄存器获得。

想要重新开始一个定时周期,必须首先禁止pit定时器,然后时能定时器,如下图

clip_image002

Pit定时器的定时周期也可以更改,方法是:首先禁止定时器工作,设置新的装载值,然后重新使能定时器,如下所示:

clip_image004

当然,不用重启定时器也可以更改定时器定时周期,仅仅需要在LDVAL寄存器中设置新的装载值即可,在下一次pit中断之后,新的计数值将开始发挥作用,如下图所示:

clip_image006

2、调试模式:

在调试模式下,根据寄存器MCR的FRZ位定时器会决定在调试模式下是否停止计数,这主要用于软件开发,使开发者可以暂停处理器。

3、中断:

Pit模块中所有的定时器都支持中断生成,设置TCTRLn[TIE]位可以使能中断,TFLGn[TIF]置位时相应定制器的超时中断产生,向该标志位写1清除该位。

4、定时器级联

当一个定时器的时间链模式使能时,只有前一个定时器失效后,它才开始工作。因此,如果定时器n-1计数到零,定时器n将会对计数值减一,这样就可以使用多个定时器级联的方式来获得较长的定时时间,定时器零不可以与其他定时器级联。

5、初始化和应用信息

这部分介绍pit定时器的初始化

例程中做如下配置:

1、Pit时钟为50MHz

2、定时器1每5.12ms中断一次

3、定时器3每30ms触发一个事件

Pit模块必须通过向MCR[MDIS]位写0来激活

50MHz时钟频率相当于时钟周期为20ms,定时器1需要每5.12ms/20ns=256000周期触发一次,定时器3需要每30ms/20ns=1500000周期触发一次,LDVAL寄存器的值由下面公式计算:

clip_image008

这就是说LDVAL1和LDVAL3需要分别被设置为0X0003E7FF和0X0016E35F。置位TCTRL1[TIE]来使能定时器1的中断,向TCTRL[TEN]位写1启动定时器。定时器3将被用于触发事件,因此,向TCTRL3[TEN]位写1启动定时器3,而TCTRL3[TIE]位保持为0.

代码如下:

// turn on PIT

PIT_MCR = 0x00;

// Timer 1

PIT_LDVAL1 = 0x0003E7FF; // setup timer 1 for 256000 cycles

PIT_TCTRL1 = TIE; // enable Timer 1 interrupts

PIT_TCTRL1 |= TEN; // start Timer 1

// Timer 3

PIT_LDVAL3 = 0x0016E35F; // setup timer 3for 1500000 cycles

PIT_TCTRL3 |= TEN; // start Timer 3

7、级联工作方式的设置

程序设置如下:

1、 pit时钟频率为100MHz

2、 定时器1、2有效

3、 设置中断每一小时产生一次

需要向MCF[MDIS]位写0来激活pit模块,100MHz时钟频率等价于时钟周期是10ns,所以pit需要计数60亿个周期,这对于单个的三二十二位定时器是不可能完成的,因此定时器1设置成每6s中断一次(6亿个周期),定时器2跟定时器1级联,因此,LDVAL1应该设置为0X23C345FF,而LDVAL2应该设置为0X00000009。

设置TCTRL2[TIE]位来使能定时器2的中断,置位TCTRL2[CHN]位来激活级联模式,向TCTRL2[TEN],TCTRL1[TEN]位写1启动定时器,清除TCTRL1[CHN]和TCTRL1[TIE]位。

程序如下:

// turn on PIT

PIT_MCR = 0x00;

// Timer 2

PIT_LDVAL2 = 0x00000009; // setup Timer 2 for 10 counts

PIT_TCTRL2 = TIE; // enable Timer 2 interrupt

PIT_TCTRL2 |= CHN; // chain Timer 2 to Timer 1

PIT_TCTRL2 |= TEN; // start Timer 2

// Timer 1

PIT_LDVAL1 = 0x23C345FF; // setup Timer 1 for 600 000 000 cycles

PIT_TCTRL1 = TEN; // start Timer 1