核心内容就在这张图上:
相信大家都明白总线的概念,在图中可以看到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 Register,PITCFLMT)用来使能PIT模块、冻结PIT模块、控制功耗、设置PIT工作模式,并强制装载微定时器的初始值,如图10.4所示。
PIT控制和强制装载微定时寄存器(PITCFLMT)
PITE:PIT模块使能位。当PITE为0时,则禁止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模块停止计数。
PFLMT1~PFLMT0:PIT微定时器1和PIT微定时器0强制装载位。如果相应的微定时器激活且PIT模块使能(PITE=1)时,PFLMT=1,则相应的8位微定时器的装载寄存器值将立即装载到8位微定时器的递减计数器。写0操作无效;读取这2位,总是返回0。
注意:强制装载微定时器值会影响到使用该微定时基准的所有定时器通道。
PIT通道使能寄存器(PITCE)
PIT通道使能寄存器(PIT Channel Enable Register,PITCE),用来使能PIT定时器3、PIT定时器2、PIT定时器1、PIT定时器0通道,如图10.6所示。
PCE3,PCE2,PCE1,PCE0:PIT定时器3、PIT定时器2、PIT定时器1、PIT定时器0的通道使能位。如果PCE位清零,则禁用PIT通道,PITTF寄存器中的相应标志位也会清零。当PCE位置1,且PIT模块使能(PITE=1)时,则16位定时计数器将装载初始计数值,从该初始值开始向下递减计数。
0表示禁用相应的PIT通道;
1表示使用相应的PIT通道。
PIT复用寄存器(PITMUX)
PIT复用寄存器(PIT Multiplex Register,PITMUX),用来选择PIT定时器3、PIT定时器2、PIT定时器1、PIT定时器0通道的复用位,如图10.7所示。
PMUX3、PMUX2、PMUX1、PMUX0:PIT定时器3、PIT定时器2、PIT定时器1、PIT定时器0的通道复用选择位。这些位选择相应的16位定时器连接的是微定时基准1还是微定时基准0;修改PMUX位,则相应的16位定时器将会立即切换微定时基准。
0表示相应的16位定时器使用微定时基准0计数;
1表示相应的16位定时器使用微定时基准1计数。
PIT 中断使能寄存器(PITINTE)
PIT 中断使能寄存器(PIT Interrupt Enable Register,PITINTE),用来使能PIT定时器3、PIT定时器2、PIT定时器1、PIT定时器0的超时中断,如图10.8所示。
PINTE3、PINTE2、PINTE1、PINTE0:PIT定时器3、PIT定时器2、PIT定时器1、PIT定时器0的超时中断使能位。该位使能,一旦相应PIT通道的PTF标志位置位,则允许产生相应的中断服务请求。当中断被挂起时,该位使能,PTF=1将会立即产生中断。为了避免该中断发生,必须先清零相应的PTF标志位。
0表示禁止相应的PIT通道中断请求;
1表示允许相应的PIT通道中断请求。
PIT 微定时装载寄存器0 和1(PITMTLD0/1)
PIT 微定时装载寄存器0 和1(PIT Micro Timer Load Register 0 和1,PITMTLD0~1),用来设置PIT微定时器的初始值,如图10.10所示。
PMTLD7~0:PIT微定时器装载初值。这8位用来设置8位微定时器的模数递减计数器的装载初值,PITMTLD寄存器写入新的数值不会重新启动微定时器。当微定时器的计数值减到零时,则重新装载PMTLD寄存器值。如果想要立即装载初值,只要PITCFLMT寄存器中的PFLMT置位就会立即更新新的初值到递减计数器。
PIT装载寄存器0~3(PITLD0~3)
PIT装载寄存器0~3(PIT Load Register 0 to 3,PITLD0~3),用来设置16位模数递减计数器的装载初值,如图10.11所示。
PLD15~0:PIT模块的16位模数递减计数器的装载初值。为了确保数据的一致性,写入PITLD寄存器的新值必须按照16位访问进行操作,否则不会重启定时器。当定时器向下递减计数到0时,则PTF超时标志位置1,重新装载该寄存器值。如果想要立即装载初值,只要PITFLT寄存器中的PFLT置位就会立即更新新的初值至计数器。
PIT计数寄存器0~3 (PITCNT0~3)
PIT计数寄存器0~3(PIT Count Register 0 to 3,PITCNT0~3)中存放的是16位模数递减计数器的当前值,如图10.12所示。
PCNT15~0:该寄存器中的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