您的位置 首页 资料

飞思卡尔那些事之守时中止(PIT)

前言:上次说到因为源于对英文的恐惧,没有阅读英文DATASHEET,想当然的认为XS128单片机中的定时器模块也和DG128中定时器模块一样。结果造

前语:
前次提到由于源于对英文的惊骇,没有阅览英文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 PITTIME5000//设定为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;
asmNOP;
asmNOP;
asmNOP;
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 interrupt 66 PIT0(void)
{
vTmpPIT++;
if(vTmpPIT==10)
{
PORTB=~PORTB;//输出取反
vTmpPIT=0;
}
PITTF_PTF0=1;//清中止标志位
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/257011.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部