新闻中心

EEPW首页>嵌入式系统>设计应用> 飞思卡尔那些事之定时中断(PIT)

飞思卡尔那些事之定时中断(PIT)

作者: 时间:2016-11-27 来源:网络 收藏
前言:
上次说到因为源于对英文的恐惧,没有阅读英文DATASHEET,想当然的认为XS128单片机中的定时器模块也和DG128中定时器模块一样。结果造成了致命性的错误,最后在疯狂的熬夜中才将问题检测到。
当然,找到问题,解决起来就简单多了。后头拿起DATASHEET狂肯,终于有所收获,同时也知道了在XS128单片机中用于定时的另一个模块:PIT(定时中断)。为了测试一下定时中断的,同时也解决之前单片机一直没办法进入中断的问题,特写了一个简单的基于定时器中断的闪烁灯程序。
目的:
1、学习使用XS128PIT模块。
2、测试XS128核心板的中断木块。
功能描述:
通过定时中断实现500MS定时。当定时中断触发时,对IO口进行取反操作即可以实现LED500MS的闪烁。
资源:
1、XS128核心板,8个LED接XS128的B口。
2、XS128的PIT模块。
PIT说明:
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则清除该标志位。
可以通过查询该位来判断定时是否完成。

CODE:
#include
#include
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
//==================================================
//定时中断函数
//定时中断0实现500MS定时
//author:yangtze
//time:2009/5/2
//==================================================
#define PITTIME 5000//设定为50MS定时
unsigned int vTmpPIT=0;

void pllclk(void)//24MHz,外部时钟为16MHz
{
CLKSEL=0X00;
PLLCTL=0xe1;
SYNR=2;//PLLCLK =2*OSCCLK*(SYNR + 1)/(REFDV + 1)
REFDV=1;
PLLCTL=0X60;
asm NOP;
asm NOP;
asm NOP;
while((CRGFLG&0X08)==0);//时钟校正同步
CLKSEL=0X80;
}
void initIOBoutput(void)//IO口初始化,B口为输出
{
DDRB=0XFF;
PORTB=0XFF;
}
void initPIT(void)//定时中断初始化函数 50MS定时中断设置
{
PITCFLMT_PITE=0; //定时中断通道0关
PITCE_PCE0=1;//定时器通道0使能
PITMTLD0=240-1;//8位定时器初值设定。240分频,在24MHzBusClock下,为0.1MHz。即
10us.
PITLD0=PITTIME-1;//16位定时器初值设定。PITTIME*0.01MS
PITINTE_PINTE0=1;//定时器中断通道0中断使能
PITCFLMT_PITE=1;//定时器通道0使能
}

void main(void)
{
pllclk();
initIOBoutput();
initPIT();
EnableInterrupts;
for(;;) {}

}

#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt66 PIT0(void)
{
vTmpPIT++;
if(vTmpPIT==10)
{
PORTB=~PORTB;//输出取反
vTmpPIT=0;
}
PITTF_PTF0=1;//清中断标志位
}


评论


技术专区

关闭