飞思卡尔S12系列(基于MC9S12XET256MAA和/MC9S12XEP100)中断PIT资料总结和分享

(47) 2024-04-21 09:01:01

飞思卡尔S12系列(基于MC9S12XET256MAA和/MC9S12XEP100)中断PIT资料总结和分享 (https://mushiming.com/)  第1张

核心内容就在这张图上:

 

  相信大家都明白总线的概念,在图中可以看到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位),这个计数范围还是蛮大的。

 

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

PIT控制和强制装载微定时寄存器(PITCFLMT)

PIT控制和强制装载微定时寄存器(PIT Control and Force Load Micro Timer RegisterPITCFLMT)用来使能PIT模块、冻结PIT模块、控制功耗、设置PIT工作模式,并强制装载微定时器的初始值,如图10.4所示。

飞思卡尔S12系列(基于MC9S12XET256MAA和/MC9S12XEP100)中断PIT资料总结和分享 (https://mushiming.com/)  第2张

PIT控制和强制装载微定时寄存器(PITCFLMT

 

        PITEPIT模块使能位。当PITE0时,则禁止PIT模块功能,PIT超时标志寄存器PITTF中的标志位清零。当置位PITE时,能够使能相应定时器位PCE,相应装载寄存器开始向下递减计数。

  0表示禁用PIT模块(低功耗模式);

    1表示使用PIT模块。

  PITSWAI:等待模式下PIT停止位。

  0表示等待模式下,PIT模块正常运行;

  1表示等待模式下,PIT模块停止产生时钟信号,冻结PIT模块。

  PITFRZ:冻结模式下PIT计数器冻结位。冻结模式下,PITFRZ位确定PIT工作状态。冻结模式下,断点调试时,该位冻结PIT计数器,可有效避免中断的发生。

  0表示冻结模式下,PIT模块正常运行;

  1表示冻结模式下,PIT模块停止计数。

  PFLMT1PFLMT0PIT微定时器1PIT微定时器0强制装载位。如果相应的微定时器激活且PIT模块使能(PITE=1)时,PFLMT=1,则相应的8位微定时器的装载寄存器值将立即装载到8位微定时器的递减计数器。写0操作无效;读取这2位,总是返回0

  注意:强制装载微定时器值会影响到使用该微定时基准的所有定时器通道。

PIT通道使能寄存器(PITCE

PIT通道使能寄存器(PIT Channel Enable RegisterPITCE),用来使能PIT定时器3PIT定时器2PIT定时器1PIT定时器0通道,如图10.6所示。

飞思卡尔S12系列(基于MC9S12XET256MAA和/MC9S12XEP100)中断PIT资料总结和分享 (https://mushiming.com/)  第3张

        PCE3PCE2PCE1PCE0PIT定时器3PIT定时器2PIT定时器1PIT定时器0的通道使能位。如果PCE位清零,则禁用PIT通道,PITTF寄存器中的相应标志位也会清零。当PCE位置1,且PIT模块使能(PITE=1)时,则16位定时计数器将装载初始计数值,从该初始值开始向下递减计数。

  0表示禁用相应的PIT通道;

  1表示使用相应的PIT通道。

PIT复用寄存器(PITMUX

        PIT复用寄存器(PIT Multiplex RegisterPITMUX),用来选择PIT定时器3PIT定时器2PIT定时器1PIT定时器0通道的复用位,如图10.7所示。

飞思卡尔S12系列(基于MC9S12XET256MAA和/MC9S12XEP100)中断PIT资料总结和分享 (https://mushiming.com/)  第4张

        PMUX3PMUX2PMUX1PMUX0PIT定时器3PIT定时器2PIT定时器1PIT定时器0的通道复用选择位。这些位选择相应的16位定时器连接的是微定时基准1还是微定时基准0;修改PMUX位,则相应的16位定时器将会立即切换微定时基准。

  0表示相应的16位定时器使用微定时基准0计数;

  1表示相应的16位定时器使用微定时基准1计数。

PIT 中断使能寄存器(PITINTE

 PIT 中断使能寄存器(PIT Interrupt Enable RegisterPITINTE),用来使能PIT定时器3PIT定时器2PIT定时器1PIT定时器0的超时中断,如图10.8所示。

飞思卡尔S12系列(基于MC9S12XET256MAA和/MC9S12XEP100)中断PIT资料总结和分享 (https://mushiming.com/)  第5张

 PINTE3PINTE2PINTE1PINTE0PIT定时器3PIT定时器2PIT定时器1PIT定时器0的超时中断使能位。该位使能,一旦相应PIT通道的PTF标志位置位,则允许产生相应的中断服务请求。当中断被挂起时,该位使能,PTF=1将会立即产生中断。为了避免该中断发生,必须先清零相应的PTF标志位。

   0表示禁止相应的PIT通道中断请求;

   1表示允许相应的PIT通道中断请求。

PIT 微定时装载寄存器0 1PITMTLD0/1

 PIT 微定时装载寄存器0 1PIT Micro Timer Load Register 0 1PITMTLD01),用来设置PIT微定时器的初始值,如图10.10所示。

飞思卡尔S12系列(基于MC9S12XET256MAA和/MC9S12XEP100)中断PIT资料总结和分享 (https://mushiming.com/)  第6张

PMTLD70PIT微定时器装载初值。这8位用来设置8位微定时器的模数递减计数器的装载初值,PITMTLD寄存器写入新的数值不会重新启动微定时器。当微定时器的计数值减到零时,则重新装载PMTLD寄存器值。如果想要立即装载初值,只要PITCFLMT寄存器中的PFLMT置位就会立即更新新的初值到递减计数器。

PIT装载寄存器03PITLD03

 PIT装载寄存器03PIT Load Register 0 to 3PITLD03),用来设置16位模数递减计数器的装载初值,如图10.11所示。

飞思卡尔S12系列(基于MC9S12XET256MAA和/MC9S12XEP100)中断PIT资料总结和分享 (https://mushiming.com/)  第7张

PLD150PIT模块的16位模数递减计数器的装载初值。为了确保数据的一致性,写入PITLD寄存器的新值必须按照16位访问进行操作,否则不会重启定时器。当定时器向下递减计数到0时,则PTF超时标志位置1,重新装载该寄存器值。如果想要立即装载初值,只要PITFLT寄存器中的PFLT置位就会立即更新新的初值至计数器。

PIT计数寄存器03 (PITCNT03)

 PIT计数寄存器03PIT Count Register 0 to 3PITCNT03)中存放的是16位模数递减计数器的当前值,如图10.12所示。

飞思卡尔S12系列(基于MC9S12XET256MAA和/MC9S12XEP100)中断PIT资料总结和分享 (https://mushiming.com/)  第8张

 PCNT150:该寄存器中的16位表示16位模数递减计数器的当前值,读取该计数寄存器的值必须在一个时钟周期内按照16位访问进行操作。

觉得上面难理解,下面是通俗的解释。

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则清除该标志位。
    可以通过查询该位来判断定时是否完成。

/*
********************************************************************************
*                               PIT0_Init (void) 
* 该函数为中断PIT0初始化函数,每10ms中断一次
* 时钟源:外部晶振8MHz,总线频率8MHZ
* 公式T=(PITMTLD + 1) * (PITLD + 1) / fBUS.
* 时间间隔 T=8*10000/8M=10ms
* 程序每10ms中断一次,中断服务程序在CPU12ISRs.c中的ISR void PIT0_ISR(void)中
********************************************************************************
*/
void PIT0_Init(void) 
{

    PITCFLMT_PITE=0;//关闭PIT
    
    PITCE_PCE0 = 1;      //PIT通道使能寄存器中,PCE0通道使能;还有PITCE_PCE1~3可用
    PITMUX = 0x00;          //通道0/1/2/3  使用时基0

    //fbus=8M,10ms中断,计算后 (PITMTLD+1)*(PITLD+1)/fBUS=8*10000*125ns=10ms  
    PITMTLD0 =  8-1; /Macro timer0 load =   8, output->Busclk/8   to 16bit-timer
    PITLD0   = 10000-1; //Ch0: (PITMTLD+1)*(PITLD+1)/fBUS=8*10000*125ns=10ms
     
    PITINTE_PINTE0 = 0x01;//开启PIT通道0的中断功能    
    PITCFLMT_PITE=1;//使能PIT
 
}


/*
********************************************************************************
*                         ISR void PIT0_ISR(void)                               
* 该函数为PIT0中断服务程序,每10ms中断一次
* 时钟源:外部晶振8MHz,总线频率8MHZ
* 公式T=(PITMTLD + 1) * (PITLD + 1) / fBUS.
* 时间间隔 T=8*10000/8M=10ms
********************************************************************************
*/

#pragma CODE_SEG NON_BANKED
ISR void PIT0_ISR(void)
{

  PITTF_PTF0=1;       //中断0清中断标志位
  
}
#pragma CODE_SEG DEFAULT
THE END

发表回复