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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于飞思卡尔 xs128 单片机的简单定时中断(PIT)
刚开始接触这款单片机,由于看的书基本上都是以 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 <MC9S12XS128.h> #pragma LINK_INFO DERIVATIVE "MC9S12XS128" 这是 Codewarrior5.0 版本中的默认设置。 2、 设置 PLL 时钟时 SYNR 和 REFDV 须按照给的程序当中来设置,若按照程序 注释中来设置的话时钟将出现很大误差,原因我不知道,我是不断测试得到的。 3、具体的寄存器要根据给定的对应的头文件,不同的 IDE 版本中 xs128 的头文 件可能不同,应根据实际情况来写。
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)
#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区 void interrupt 66 PIT0(void) { count++; if(count==200) { PORTB=~PORTB;//输出取反 count=0; } PITTF_PTF0=1;//清中断标志位 }
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 */ }
代码如下: #include <hidef.h> /* 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
TSCR2=0X01; TCTL4=0X02; TIE=0X01; TFLG1=0X01; DLYCT=0X01; PulseCnt=0X00; asm cli; for(;;){} }
//禁止定时器溢出中断,预分频系数为 2 //捕捉下降沿 //允许 ECT 通道 0 中断 //清中断标志 //延迟 //计脉冲数变量初始值
我想说说做智能车中应该能用到的功能 1、 输入捕捉: 4 个缓冲通道 IC0-IC3(引脚 PT0-PT3) , 4 个非缓冲通道 IC4-IC7 (引脚 PT4-PT7) 区别:缓冲和非缓冲都有一个捕捉寄存器,而 缓冲通道还有一个保持寄存器。
例程:利用 IC 对通道 0 的脉冲信号进行计数,并在 PORTB 端口显示脉冲 数 #include <hidef.h> #include <MC9S12XS128.h> #pragma LINK_INFO DERIVATIVE "mc9s12xs128" unsigned char PulseCnt; void main(void) { DDRB=0XFF; PORTB=0XFF; asm sei; TIOS=0X00; TSCR1=0X80; //设置 PORTB 为输出 //PORTB 端口的初ຫໍສະໝຸດ Baidu值 //关闭所有中断 //设置 ECT 通道 0 为 IC 工作方式 //定时器使能,正常工作
#pragma CODE_SEG __NEAR_SEG NON_BANKED void interrupt { PulseCnt++; TFLG1=0X01; PORTB=~PulseCnt; } #pragma CODE_SEG DEFAULT //在 PORTB 显示脉冲数 IC0_ISR(void)
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; }
相关文档
最新文档