PIT

转载 2011年01月09日 16:04:00

 转自http://www.cnblogs.com/pang123hui/articles/1800096.html

言归正传,开始讲PIT,讲PIT,我准备先简单讲讲寄存器,之前不讲主要是基本上买的到的书都是DG128的,里面关于IO口的寄存器和PWM的寄存器都是完全可以照搬的,而这一章的东西照搬是要出问题的。

     

 

核心内容就在这张图上:

 

  相信大家都明白总线的概念,在图中可以看到6个定时器模块,Micro Timer 0、Micro Timer 1、Timer 0、Timer 1、Timer 2、Timer 3,其中前两个是8位的,后四个是16位的。从图中可以看出PIT模块是以总线时钟(Bus Clock)为基准时钟的,总线时钟通过8位Micro Timer 0和Micro Timer 1倍频形成两个基时钟,即Micro Timer Base 0和Micro Timer Base 1,这两个基时钟通过16位Timer给PIT提供时钟(通过寄存器PITMUX设置)。

 

  原理讲完了,其实相对于PIT模块是一个24位的定时器(51单片机最多也就16位),这个计数范围还是蛮大的。

 

     下面是一些寄存器的解释,解释完还是看代码吧。

 

  S12PIT24B4CV1是一个模数递减计数器。首先给计数寄存器设定一个初值,每经过一个总线周期,计数器进行一次减一操作,当计数器自减溢出时,触发中断。因为总线周期是已知的,即可以通过计数器自减实现定时。
   

    在XS128PIT模块中,需要用到得是如下几个寄存器。
   

1)、PIT Contorl and force Lad Micro Timer Register(PITCFLMT)
    该寄存器用于PIT模块的使能设置和工作方式设置。通常设置该寄存器中的PITE为即可,即PITCFLMT_PITE=1,使PIT使能。
   

 2)、PIT Channel Enable Register(PITCE)
    该寄存器用于对PIT模块中的4个通道使能进行设置。如果使用某个通道时,对对应位进行置一即可,即PITCE_PCEx=1,其中x代表通道序号,为0~3。
   

3)、PIT Micro Timer Load Register 0 to 1 (PITMTLD0-1)
    该寄存器用于设置PIT模块中的8位计数器初值,以实现24位的计数。设定值为0到255范围。
   

 4)、PIT Load Register 0 to 3(PITLD0-3)
    该寄存器用于设置PIT模块中的16位计数器初值,和8位计数器配合而成24位计数器。设定值范围0-65535。
   

5)、PIT Multiplex Register(PITMUX)
    该寄存器对定时器通道的8位时基进行选择。因为8位计数器只有两个,所以在将8位计数器和16位计数器连接时,可以选择不同的8位时基。
    当设置为0时,对应通道选择时基0;置一时,对应通道选择时基1。
    如PITMUX_PMUX0=1为通道0选择时基1。
   

6)、PIT Interrupt Enable Register(PITINTE)
    该寄存器为中断使能寄存器,为不同的PIT通道中断使能。设定为0时,相应通道中断禁止。置一时,相应通道使能。
    如PITINTE_PINTE0=1时,PIT通道0定时中断使能,当计数器递减溢出时,申请中断。
   

 7)、PIT Time-Out Flag Register(PITTF)
    该寄存器为溢出标志位,当某一通道的8位计数器和16位计数器递减到0时,该位置一。给改位写1则清除该标志位。
    可以通过查询该位来判断定时是否完成。

 

 

代码

/****************************************************************


******************************************************************/

void PIT_Init(void)
{
PITCFLMT_PITE
=0; //
关闭PIT

//微定时器的装载寄存器

PITMTLD0= 80-1;//8位定时器初值设定。80分频,在80MHzBusClock下,为0.1MHz,即1us
//PITMTLD1= 160-1;//
8位定时器初值设定,160分频,在16MHz的总线时钟频率下,为0.1MHz,即10us

//定时器的装载寄存器

PITLD0 = 100 - 1 ;//16位定时器初值设定。PITTIME*0.01MS,定时100 * 0.001ms = 0.1ms
PITLD1 = 20000 - 1 ;//定时50000*0.001ms = 20ms

PITCE_PCE0
=1;//使能通道0
PITCE_PCE1=1;//使能通道1

PITMUX_PMUX0
=0;//
0:相应16位定时器与微时基0连接
//PITMUX_PMUX1=1;//1:相应16位定时器与微时基1连接


PITINTE_PINTE0
=1;//开通PIT0定时器的溢出中断

PITINTE_PINTE1=1;//开通PIT1定时器的溢出中断

PITCFLMT_PITE=1; //使能PIT
}

 

  以上代码一次开通了2路PIT,即PIT0和PIT1,初始化之后主要写上相对应的中断代码就可以了。

 

如:

 

代码

/****************************************************************

 
******************************************************************/

#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区

void interrupt 66 PIT0(void)
{

//相应代码

PITTF=0x01;//清中断标志位


}

#pragma CODE_SEG DEFAULT


#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区

void interrupt 67 PIT1(void)
{

//相应代码

PITTF=0x02;//清中断标志位


}

#pragma CODE_SEG DEFAULT

 

这里要注意两个地方:

 

1.首先两路PIT同时使用时,在中断函数里清中断标志位一定要使用如上方面还不是像这样PITTF_PTF0 = 1; 不然两路PIT其实只有1路在工作。

 

2.一旦PIT中断初始化使能,那么代码里一定要有中断函数,如果没有,编译不会报错,但是可怕的是一定运行会出现不可预估的后果。

 

以上两点都曾经使我郁闷了N久才知道是怎么回事,一般的书上都不会提,像我买的那本书,其实要我现在说,就是某某人把官方的Datesheet给翻译了一下而已,实属害人不浅。

linux时钟RTC,TSC,PIT,jiffies

1 基本概念 定时机制连同一些更可见的内核活动(如检查超时)来驱使进程切换。 两种主要的定时测量: 保存当前的时间和日期,以便能通过time(), ftime()和getti...

The Mythical Man-Month: The Tar Pit

The Tar Pit     No scene from prehistory isquite so vivid as that of the mortal struggles of great ...

【趋势科技实习录】 PIT testing with OSCE11

我今天下午先是在32bit的机子上针对fail的进行了再次测试,case3,16,18,23,37可以pass了。Case17远程路径的测试,不能成功设置;case26中在执行CreateTempRe...

对MC9S12XS128MAL中TIM、PIT、RTI的一点理解

最近看了一下飞思卡尔的MC9S12XS128MAL单片机,对其定时器这一块感觉很麻烦不像STM32那样直观,可以选择多种配置方式,XS128的这三个模块功能相互有重复功能,但又各有特点。看了好多网友的...

飞思卡尔单片机PIT汇编编程(一)

飞思卡尔单片机(XS128系列)单片机汇编编程(一) 本人就是一个菜鸟,从菜鸟学习汇编编程;汇编也没想象中的复杂和难懂,细细品味还是挺有意思的。就当刷着玩吧,就学起了汇编(这一直是我的一大心病),慢慢...

PIT设置_中断优先级设置__MK20DX128VLH5_K20系列

中断,PIT,K20

C Traps and Pit falls-Order of evaluation

求值顺序 运算符优先级与求值顺序完全是另外一码事。运算符优先级是关于诸如表达式 a+b*c 应该被解释成 a+(b*c) 而不是 (a+b)*c 的这样一类规则。...

MCF52259 PIT中断

中断向量表如下所示: __declspec(vectortable) vectorTableEntryType _vect[256] = { /* Interrupt vector table *...

PIT systick

说起PIT周期中断定时器,那就是一句话,So easy!写这个模块的教程简直是太轻松了,PIT的功能就是它名字本身的字面意思,如果非要深究严谨的说的话,就是周期中断或触发定时器。我们常用的就是它的周期...

android qemu-kvm i8254 pit虚拟设备

ubuntu12.04下使用android emulator,启用kvm加速,模拟i8254定时器的代码比较旧,对应于qemu0.14或者之前的版本,这时还没有QOM(qemu object mode...
  • ayu_ag
  • ayu_ag
  • 2016年10月19日 11:41
  • 619
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PIT
举报原因:
原因补充:

(最多只允许输入30个字)