刚报名参加了第五届飞思卡尔智能车竞赛的时候,知道要用飞思卡尔的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/

飞思卡尔XS128系列(三) PIT相关推荐

  1. ftm模块linux驱动,飞思卡尔k系列_ftm模块详解.doc

    飞思卡尔k系列_ftm模块详解 1.5FTM模块1.5.1 FTM模块简介FTM模块是一个多功能定时器模块,主要功能有,PWM输出.输入捕捉.输出比较.定时中断.脉冲加减计数.脉冲周期脉宽测量.在K1 ...

  2. 飞思卡尔XS128八位数模转换模块的实验与心得体会

    飞思卡尔XS128八位数模转换模块的实验与心得体会 数模转换的编程流程: 代码标注 数模转换的编程流程: ① 锁相环时钟设置,这一步不细讲,后面会有文章来专门解释锁相环的设置,将总线时钟频率升到32M ...

  3. freescale飞思卡尔 HC9S12 系列单片机 Flash擦写详解(一)之时钟设置

    Flash擦写的内容,个人做HC9S12系列单片机时觉得应该是各模块内容中最难而且是最麻烦的一步了.只有能够对Flash进行擦写以后,所做的Bootloader才有真正手段将串口或者其他通讯手段接收到 ...

  4. 痞子衡嵌入式:飞思卡尔Kinetis系列MCU启动那些事(1)- KBOOT架构

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔Kinetis系列MCU的KBOOT架构. Bootloader是嵌入式MCU开发里很常见的一种专用的应用程序,在一个没有Boo ...

  5. 飞思卡尔S12系列(基于MC9S12XET256MAA和/MC9S12XEP100)锁存器资料总结和分享

    最近在公司做项目,用到飞思卡尔S12系列芯片,为了让自己养成良好习惯,以后每做一部分,都会总结出来,方便自己和他人. 今天讲讲飞思卡尔锁存器部分. CRG时钟合成寄存器(SYNR) 读:任何时刻:写: ...

  6. 让atmega8可以和飞思卡尔xs128一样对IO引脚进行定义

    好吧,不得不承认,我使用飞思卡尔的XS128单片机已经非常之习惯了,结果一上手atmega8,最令我反感的就是atmega8不能对IO引脚进行操作,非要用些繁琐的位操作.我就不,我就要像飞思卡尔那样操 ...

  7. 飞思卡尔MKL系列单片机用jlink烧写程序出现的Kinetis (connect): Timeout while halting CPU. CPU does not stop.问题

    最近用Jlink烧写飞思卡尔MKL16Z128单片机时发现经常出现不能连接成功的情况,用的是SWD接口,排查了好久后来发现问题在单片机的RESET脚上,因为之前用SWD接口的时候只接4线(SWD.SC ...

  8. freescale飞思卡尔 HC9S12 系列单片机 Flash擦写详解(三)之Flash控制器指令执行

    前面我们介绍了Flash主要的几个寄存器,如果还有其他的疑问可以再返回去看看或者直接查阅S12系列单片机的手册中相关的内容.这一节我将介绍Flash控制器指令执行的过程,并举出相关的例子,希望能够起到 ...

  9. 飞思卡尔S12系列(基于MC9S12XET256MAA和/MC9S12XEP100)中断PIT资料总结和分享

    核心内容就在这张图上: 相信大家都明白总线的概念,在图中可以看到6个定时器模块,Micro Timer 0.Micro Timer 1.Timer 0.Timer 1.Timer 2.Timer 3, ...

最新文章

  1. 我们真的需要深度图神经网络吗?
  2. 人工智能免费公开课一网打尽!14个类别、230门课程,GitHub标星6000+
  3. 听说你想从事中间件开发?
  4. Linux 中复制文件到多个目录中
  5. aix升级新安装oracle,AIX 5L上安装和升级Oracle
  6. 程序员怎样上元宇宙的车?
  7. C#设计模式-单例模式
  8. ATFX:美国通胀转折点已来,激进加息势将暂缓?
  9. 验证整数和小数的正则表达式
  10. nodeJS版本升级
  11. IC卡管理系统(Java基础)
  12. python机器学习记录4and5 支持向量机
  13. 面向越野地形自动驾驶的语义地形分类
  14. [好文精选] Behance 2019 设计趋势
  15. 简明扼要:numpy.random.seed()用法
  16. 2020 语音识别领域最具商业合作价值企业盘点
  17. JavaSE IO流 Vol.2 节点流 - 输入流 入门
  18. 项目管理工具——项目开发者工具
  19. 谷歌地球不能用了?我敢说大部分人不知道真实原因
  20. 第一次Java项目实训:GUI学生管理系统

热门文章

  1. Redis高负载排查记录
  2. 平板电脑有没计算机功能,平板电脑的用途与功能
  3. shell脚本之n之内的质数
  4. JS 函数中的 arguments 类数组对象
  5. Hibernate - 对象关系映射文件(*.hbm.xml)详解
  6. 计算机的工作原理及中央处理器
  7. 为什么一个电子商务网站需要七秒钟加载?
  8. 在虚拟机上使用SoftRoCE部署SPDK NVMe-oF
  9. Windows窗口API
  10. 解决tomcat7安装后启动时一闪而退的bug