基于飞思卡尔 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,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。