飞思卡尔XS128系列(三) PIT

摘要:
当我们到达ECT计时模块时,悲剧发生了。最后,我们发现XS128没有DG128 MDC模块的MDC模块。IO端口上的寄存器和PWM寄存器可以完全复制。我们可以在图中看到六个定时器模块。从图中可以看到,PIT模块将总线时钟(BusClock)作为基准时钟,这两个基准时钟通过16位定时器(通过寄存器PITMUX设置)为PIT提供时钟。

      刚报名参加了第五届飞思卡尔智能车竞赛的时候,知道要用飞思卡尔的16位单片机,当时也没在意,就随便买了本这方面的书,记得书名是:《基于HCS12的嵌入式系统设计》,我是因为这本书各模块后面的例子都是以智能车为主,我才买的,本以为买对书了,还洋洋得意,可惜啊,可惜……

      悲剧发生在拿到真正拿到芯片的时候,以无比激动的心情把以前写的程序烧进去实验,一开始都还好,到了ECT定时模块就发生悲剧了,一大串的错误,然后仔细研究才发现书上讲的是DG128,而我拿到的芯片是XS128,怎么能不错呢?

      后面仔细搜索,DG128和XS128区别还真的蛮大的,相对于平时使用来说,主要在ECT和AD这两块地方,像定时器模块这部分,查了很多资料,最后发现XS128没有DG128所具有的MDC模数递减计数器模块,相对应的是PIT定时模块,还有比如没有了模糊指令的硬件支持,没有了i2c模块等等。

      言归正传,开始讲PIT,讲PIT,我准备先简单讲讲寄存器,之前不讲主要是基本上买的到的书都是DG128的,里面关于IO口的寄存器和PWM的寄存器都是完全可以照搬的,而这一章的东西照搬是要出问题的。

飞思卡尔XS128系列(三) PIT第1张


核心内容就在这张图上:

 

  相信大家都明白总线的概念,在图中可以看到6个定时器模块,Micro Timer 0、Micro Timer 1、Timer 0、Timer 1、Timer 2、Timer 3,其中前两个是8位的,后四个是16位的。从图中可以看出PIT模块是以总线时钟(Bus Clock)为基准时钟的,总线时钟通过8位Micro Timer 0和Micro Timer 1倍频形成两个基时钟,即Micro Timer Base 0和Micro Timer Base 1,这两个基时钟通过16位Timer给PIT提供时钟(通过寄存器PITMUX设置)。

 

  原理讲完了,其实相对于PIT模块是一个24位的定时器(51单片机最多也就16位),这个计数范围还是蛮大的。

 

     下面是一些寄存器的解释,解释完还是看代码吧。

 

  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 Warrior 5.0
Target : MC9S12XS128
Crystal: 16.000Mhz
by:庞辉
芜湖联大飞思卡尔项目组 *****************************************************************
*/

void PIT_Init(void)
{
PITCFLMT_PITE=0; //关闭PIT

//微定时器的装载寄存器
PITMTLD0= 80-1;//8位定时器初值设定。80分频,在80MHzBusClock下,为1MHz,即1us
//PITMTLD1= 160-1;//8位定时器初值设定,160分频

//定时器的装载寄存器
PITLD0 = 100 - 1 ;//16位定时器初值设定 0.1ms
PITLD1 = 20000 - 1 ;//定时50000*0.001ms = 20ms

PITCE_PCE0=1;//使能通道0
PITCE_PCE1=1;//使能通道1

PITMUX_PMUX0=0;//0:相应16位定时器与微时基0连接
//PITMUX_PMUX1=1;//1:相应16位定时器与微时基1连接

PITINTE_PINTE0=1;//开通PIT0定时器的溢出中断
PITINTE_PINTE1=1;//开通PIT1定时器的溢出中断

PITCFLMT_PITE=1; //使能PIT
}

     以上代码一次开通了2路PIT,即PIT0和PIT1,初始化之后主要写上相对应的中断代码就可以了。

如:

    /****************************************************************  
Code Warrior 5.0
Target : MC9S12XS128
Crystal: 16.000Mhz
by:庞辉
芜湖联大飞思卡尔项目组
    *****************************************************************
*/

/#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区

void interrupt 66 PIT0(void)
{
//相应代码
PITTF=0x01;//清中断标志位
}
#pragma CODE_SEG DEFAULT

#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区
void interrupt 67 PIT1(void)
{
//相应代码
PITTF=0x02;//清中断标志位
}
#pragma CODE_SEG DEFAULT

这里要注意两个地方:

1.首先两路PIT同时使用时,在中断函数里清中断标志位一定要使用如上方面还不是像这样PITTF_PTF0 = 1; 不然两路PIT其实只有1路在工作。

2.一旦PIT中断初始化使能,那么代码里一定要有中断函数,如果没有,编译不会报错,但是可怕的是一定运行会出现不可预估的后果。

以上两点都曾经使我郁闷了N久才知道是怎么回事,一般的书上都不会提,像我买的那本书,其实要我现在说,就是某某人把官方的Datesheet给翻译了一下而已,实属害人不浅。

 

------------------------------------------------------------------------------------------------------

 

转载我博客文章郑重声明:技术性网站著名原创作者即可转载,商业性网站必须经过我的同意才能转载,否则追究责任——

pang123hui的博客:

博客园http://www.cnblogs.com/pang123hui/

CSDNhttp://blog.csdn.net/pang123hui/

 

免责声明:文章转载自《飞思卡尔XS128系列(三) PIT》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇第三方应用软件提权es7.4.0集群部署下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

嵌入式软件机器编程为啥选择梯形图作为编程语言?

(机器编程系列文章二)   嵌入君   上一篇《机器人程序员正朝我们走来,大家准备好了吗?》文章中,谈到了我个人的观点,在一个编程平台中,是否算是机器编程,需要看机器完成的代码占总编码的量和对编程人员的技术要求。那么,我们在设计机器人程序员系统时,需要刻意的设计,尽量让编程者只利用很少的知识,轻松掌握编程技能,同时尽量减少编程者的工作量。   梯形图(LA...

Verilog HDL的程序结构及其描述

  这篇博文是写给要入门Verilog HDL及其初学者的,也算是我对Verilog  HDL学习的一个总结,主要是Verilog HDL的程序结构及其描述,如果有错,欢迎评论指出。 一、Verilog HDL的程序结构   首先我们不开始讲Verilog HDL的语法,我们从Verilog HDL的程序结构出发。相信大家都看过芯片吧,它有个名字,有个外壳...

JMeter定时器设置延迟与同步

JMeter定时器一般用来设置延迟与同步。它的作用域和优先级如下: 定时器的优先级高于Sampler。 在同一作用域(比如控制器下)有多个定时器存在,每个定时器都会执行。 在某一Sampler节点下的定时器,只对这个Sampler有效。 JMeter一共有9种定时器: Constant Timer 固定值,多用来模拟思考时间。 Uniform Ra...

nodejs使用pkg打包

Node.js应用不需要经过编译过程,可以直接把源代码拷贝到部署机上执行,确实比C++、Java这类编译型应用部署方便。然而,Node.js应用执行需要有运行环境,意味着你需要先在部署机器上安装Node.js。虽说没有麻烦到哪里去,但毕竟多了一个步骤,特别是对于离线环境下的部署机,麻烦程度还要上升一级。假设你用Node.js写一些小的桌面级工具软件,部署到...

读设计模式之禅6大设计原则

单一职责原则:简称SRP,指有且仅有一个原因引起类的变更。在设计类的时候尽可能使类的接口简单、清晰,职责分明;而类则尽量做到只有一个原因引起变化。这里强调的是类的内在逻辑简洁性。 里氏替换原则:所有引用基类的地方必须能透明地使用其子类的对象。这里从继承角度讲多态的条件,子类必须实现父类的所有方法,并且子类可以进行扩展。注:子类在覆写父类的方法时输入参数可以...

使用boost的deadline_timer实现一个异步定时器

概述 最近在工作上需要用到定时器,然后看到boost里面的deadline_timer可以实现一个定时器,所以就直接将其封装成了ATimer类,方便使用,ATimer有以下优点: 可以支持纳秒、毫秒、秒、分、小时定时。 可以随时停止定时器。 支持单次调用。 因为使用了deadline_timer,所以定时比较准确。 ATimer和Qt的QTimer使用...