首页 飞思卡尔xs128单片机的简单定时中断

飞思卡尔xs128单片机的简单定时中断

举报
开通vip

飞思卡尔xs128单片机的简单定时中断 基于飞思卡尔 xs128xs128xs128xs128单片机的简单定时中断(PITPITPITPIT) 刚开始接触这款单片机,由于看的书基本上都是以 dg128为原型来讲解的,故 很多东西都是按照 dg128的情况来移植到 xs128 上的,导致出了很多错误。像 定时器模块这部分,查了很多资料,最后发现 xs128 没有 dg128所具有的 MDC 模数计数器模块,相对应的是定时模块 PIT,然后在网上疯狂的找了很多资料, 总结下来,自己花了一晚上弄了个最最简单的定时中断程序,实现 1 秒钟 LED 灯的闪烁。...

飞思卡尔xs128单片机的简单定时中断
基于飞思卡尔 xs128xs128xs128xs128单片机的简单定时中断(PITPITPITPIT) 刚开始接触这款单片机,由于看的书基本上都是以 dg128为原型来讲解的,故 很多东西都是按照 dg128的情况来移植到 xs128 上的,导致出了很多错误。像 定时器模块这部分,查了很多资料,最后发现 xs128 没有 dg128所具有的 MDC 模数计数器模块,相对应的是定时模块 PIT,然后在网上疯狂的找了很多资料, 总结下来,自己花了一晚上弄了个最最简单的定时中断程序,实现 1 秒钟 LED 灯的闪烁。 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 则清除该标志位。 可以通过查询该位来判断定时是否完成。 程序中要注意的问题: 1、头文件 derivative.h中包含为: #include #pragma LINK_INFO DERIVATIVE "MC9S12XS128" 这是 Codewarrior5.0版本中的默认设置。 2、设置 PLL 时钟时 SYNR 和 REFDV须按照给的程序当中来设置,若按照程序 注释中来设置的话时钟将出现很大误差,原因我不知道,我是不断测试得到的。 3、具体的寄存器要根据给定的对应的头文件,不同的 IDE版本中 xs128 的头文 件可能不同,应根据实际情况来写。 代码如下: #include /* common defines and macros */ #include "derivative.h" /* derivative-specific definitions */ #define PITTIME 1000//设定为 5ms 定时 uchar count=0; void setbusclock(void) //32MHz 外部时钟 16MHz { CLKSEL=0X00; // disengage PLL to system PLLCTL_PLLON=1; // turn on PLL SYNR =0x40 | 0x03; REFDV=0x80 | 0x01; //SYNR =1; //PLLCLK=2*fOSC*(SYNR + 1)/(REFDV + 1) //REFDV=1; POSTDIV=0x00; // 4:0, fPLL= fVCO/(2xPOSTDIV) // If POSTDIV = $00 then fPLL is identical to fVCO (divide by one). _asm(nop); // BUS CLOCK=16M _asm(nop); while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it; CLKSEL_PLLSEL =1; //engage PLL to system; } void PORTB_init(void)//IO口初始化,B口为输出 { DDRB=0xFF; PORTB=0x00; } void PIT_init(void)//定时中断初始化函数 5MS定时中断设置 { PITCFLMT_PITE=0; //定时中断通道 0 关 PITCE_PCE0=1;//定时器通道 0使能 PITMTLD0=160-1;//8 位定时器初值设定,160 分频,在 32MHzBusClock 下,为 0.2MHz。即 5us PITLD0=PITTIME-1;//16位定时器初值设定。PITTIME*0.005MS PITINTE_PINTE0=1;//定时器中断通道 0中断使能 PITCFLMT_PITE=1;//定时器通道 0 使能 } void main(void) { /* put your own code here */ setbusclock(); PORTB_init(); PIT_init(); EnableInterrupts; for(;;) { _FEED_COP(); /* feeds the dog */ } /* loop forever */ /* please make sure that you never leave main */ } #pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区 void interrupt 66 PIT0(void) { count++; if(count==200) { PORTB=~PORTB;//输出取反 count=0; } PITTF_PTF0=1;//清中断标志位 } S12 系列的定时器模块是在标准定时器模块(Standard Timer Module,TIM)的 基础上增加了一些功能,称为增强型定时器模块(Enhanced Capture Timer Module,ECT). ECT 功能:1)高速 I/O 口 2)一个 16位自由运行计数器 3)八个 16位输入捕捉(IC)/输出比较(OC) 通道 4)一个 16位脉冲累加器 5)一个 16位模数递减计数器(MDC) 我想说说做智能车中应该能用到的功能 1、输入捕捉:4个缓冲通道 IC0-IC3(引脚 PT0-PT3),4 个非缓冲通道 IC4-IC7 (引脚 PT4-PT7) 区别:缓冲和非缓冲都有一个捕捉寄存器,而 缓冲通道还有一个保持寄存器。 例程:利用 IC 对通道 0 的脉冲信号进行计数,并在 PORTB 端口显示脉冲 数 #include #include #pragma LINK_INFO DERIVATIVE "mc9s12xs128" unsigned char PulseCnt; void main(void) { DDRB=0XFF; //设置 PORTB 为输出 PORTB=0XFF; //PORTB 端口的初始值 asm sei; //关闭所有中断 TIOS=0X00; //设置 ECT 通道 0为 IC 工作方式 TSCR1=0X80; //定时器使能,正常工作 TSCR2=0X01; //禁止定时器溢出中断,预分频系数为 2 TCTL4=0X02; //捕捉下降沿 TIE=0X01; //允许 ECT 通道 0中断 TFLG1=0X01; //清中断标志 DLYCT=0X01; //延迟 PulseCnt=0X00; //计脉冲数变量初始值 asm cli; for(;;){} } #pragma CODE_SEG __NEAR_SEG NON_BANKED void interrupt IC0_ISR(void) { PulseCnt++; TFLG1=0X01; PORTB=~PulseCnt; //在 PORTB 显示脉冲数 } #pragma CODE_SEG DEFAULT 基于飞思卡尔xs128单片机的简单定时中断(PIT)
本文档为【飞思卡尔xs128单片机的简单定时中断】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_487041
暂无简介~
格式:pdf
大小:129KB
软件:PDF阅读器
页数:5
分类:工学
上传时间:2012-04-02
浏览量:30