zoukankan      html  css  js  c++  java
  • 飞思卡尔XS128系列(三) PIT

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

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

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

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


    核心内容就在这张图上:

     

      相信大家都明白总线的概念,在图中可以看到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/

     

  • 相关阅读:
    ZOJ 1002 Fire Net (火力网)
    UVa OJ 117 The Postal Worker Rings Once (让邮差只走一圈)
    UVa OJ 118 Mutant Flatworld Explorers (变体扁平世界探索器)
    UVa OJ 103 Stacking Boxes (嵌套盒子)
    UVa OJ 110 MetaLoopless Sorts (无循环元排序)
    第一次遇到使用NSNull的场景
    NSURL使用浅析
    从CNTV下载《小小智慧树》
    NSDictionary and NSMutableDictionary
    Category in static library
  • 原文地址:https://www.cnblogs.com/pang123hui/p/2309975.html
Copyright © 2011-2022 走看看