一、PIT模块介绍
PIT是周期中断定时器模块的简称,XEP100单片机的PIT定时器是一系列24位定时器的阵列。可以用来触发单片机的外围设备,也可以用来产生周期性的中断。XEP100单片机的PIT模块具有如下特性:
1、8个具有独立的溢出时间周期的定时器用作模数递减计数器。
2、溢出周期可以在1到个总线周期数之间选择。溢出时间等于m×n个总线周期数,其中1<=m<=256,1<=n<=65536。
3、定时器能够被独立使能。
4、8个时间溢出中断。
5、8个可以用的时间溢出触发输出信号,可以用来触发外围模块。
6、启动的各通道可以彼此对齐。
XEP100单片机的PIT模块的示意图如下图所示。
由图中可以看出。PIT模块的主要组成部分是状态、控制和数据寄存器,2个8位向下计数器,8个16位向下计数器和1个中断触发接口。
24位的计数器被分为两级,分别为8个16位的模数递减计数器和2个8位模数递减计数器。2个8为模数递减计数器产生2个微时基,这2个微时基为16位计时器提供时钟。每个16位计时器连接到微时基0或1,这通过设置PITMUX寄存器的PMUX[7:0]位来确定。
如果PIT模块的控制和强制载入微定时器寄存器(PITCFLMT)中的PITE位使能并且PIT通道使能寄存器(PITCE)中的PCE位也置1,则一个定时器通道被使能。两个8为模数递减计数器用来产生两个微时基。一旦一个微时基被一个使能的通道选定,相应的微定时器将载入PITMTLD0或PITMTLD1寄存器的值,并且开始递减计数。无论何时微定时器的递减计数器数到0,则PITMTLD寄存器被重新载入,并且相应的16位模数递减计数器计数一个周期。
当16位计数器和与其相连的8位计数器同时数到0时,PITLD寄存器被重新载入,并且PIT溢出标志寄存器(PITTF)的PTF位置1。总的溢出周期是PITLD和PITMTLD寄存器的函数,如下式所示,其中fBUS为总线频率。
溢出周期=(PITMTLD+1)×(PITLD+1)/fBUS
例如:如果总线时钟为40MHz,则最大的溢出周期等于:
256×65536×25ns=419.43ms
当前的16位模数递减计数器的值能够由PITCNT寄存器中读取。微定时器递减计数器的值不能被读取。
8位微定时器可以通过向PITCFLMT寄存器的PFLMT位写入1来重新启动。16位定时器可以通过向PITFLT寄存器的PFLT位写入1来重新启动。如果需要可以在同时重新启动任何一组定时器和微定时器。重新启动的方式是用一个16位的数写入相邻的PITCFLMT和PITFLT寄存器,使相应的位置1。如下图所示。
每个溢出事件能够被用来触发一个中断服务请求。对于每一个定时器通道,PIT中断使能寄存器PITINTE的PINTE位用来使能这个特性。如果PINTE被置1,当相应的溢出标志寄存器PITTF的PTF位置1时,将触发一个中断请求。可以通过向标志位写入1来清除标志位。
PIT模块包含8个硬件触发信号线PITTRIG[7:0],每个对应一个定时器通道。这些信号能够将高低电平与外设使能相连。例如:周期性的ATD转换。当一个定时器通道溢出时,相应的PTF位置1,形成的触发信号触发一个上升沿。触发特性要求溢出周期至少要有两个总线周期的大小。
二、例程测试
接下来,对PIT模块的功能进行测试,本文的资源中包含了PIT模块的测试代码,在这个程序中,PIT模块的初始化代码如下所示。
void init_PIT(){
PITMTLD0=249; //为0通道8位计数器赋值
PITLD0=63999; //为0通道16位计数器赋值 //(249+1)*(63999+1)=16000000个总线周期=0.5秒
PITMUX_PMUX0=0; //第0通道使用微计数器0
PITCE_PCE0=1; //第0通道计数器工作
PITCFLMT=0X80; //使能周期中断定时器
PITINTE_PINTE0=1; //0通道定时器定时中断被使能
}
在这段代码中,把PIT模块的8位和16位计数值分别设置为249和63999。所以根据上面的说明,PIT模块的溢出周期为
(249+1)*(63999+1)=16000000个总线周期
由于总线设置为32MHz,所以PIT模块的溢出时间为0.5s。初始化代码中还使能了PIT模块的溢出中断。
PIT模块的中断处理函数如下所示。
interrupt void PIT_INTER(void)
{
if(PITTF_PTF0==1) {
PITTF_PTF0=1;
LEDCPU=~LEDCPU;
}
}
在中断函数中,清除中断标志位,并改变LED灯的状态。
将程序下载到单片机中并执行,可以看到LED灯以1Hz的频率闪烁。