历史上的今天

今天是:2024年08月27日(星期二)

正在发生

2021年08月27日 | 飞思卡尔XS128系列(三) PIT

发布者:dswecd 来源: eefocus关键字:飞思卡尔  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给翻译了一下而已,实属害人不浅。

关键字:飞思卡尔  PIT 引用地址:飞思卡尔XS128系列(三) PIT

上一篇:飞思卡尔XS128系列(二) PWM模块
下一篇:飞思卡尔智能车 电机PID

推荐阅读

近期,多家新造车势力的首款产品将与消费者见面,其中就包括合众新能源的小型SUV哪吒N01、清行汽车的小型SUV竞客400。 实际上,不止是上述企业,蔚来、威马、小鹏……大量新造车势力的首款产品都选择了SUV车型。即便如此,亿欧汽车仍然认为,SUV并不是电动汽车最适合的产品形态。 SUV市场“失速”SUV近年来一直是增速最高的细分市场。中汽协数据显示,20...
翻译自——EEjournal,Bryon Moyer 任何人对人工智能都有着自己的看法,而Mentor Graphics在今年夏天的DAC上讨论了关于AI的2个立场。作为一家EDA公司,他们有两个特定的机会来发现人工智能的价值。一是改进他们提供的设计工具;另一个是专门为人工智能设计创建设计工具。我们今天要讲第一个角度。 因此,对于这个故事,人工智能本身并不是终点;这将是达到...
2020年8月26日-28日,由中国半导体行业协会、中国电子信息产业发展研究院、江苏省工业和信息化厅、南京市江北新区管理委员共同举办的“2020世界半导体大会”在南京召开。在本次大会上,作为国产EDA行业的领军企业,芯和半导体展示了其IC、封装、系统三大领域的全产业链仿真EDA解决方案,彰显了芯和半导体在国产EDA领域领先的技术实力。当前,我们都在经历...
  防爆电机的特点  (1)满足增安型防爆电机的要求,采取一系列可靠的防止火花、电弧和危险高温的措施,可以安全运行于2区爆炸危险场所。  (2)采用无刷励磁,设置旋转整流盘和静态励磁柜,励磁控制系统可靠;顺极性转差投励准确,无冲击;励磁系统失步保护可靠,再整步能力强;线路设计合理,放电电阻在工作中不发热;励磁电流调节范围宽。  (3...

史海拾趣

问答坊 | AI 解惑

请教两个问题

1、Ndis库没有向nids微端口驱动的接口函数(如初始化函数等)下发irp,那代码中的irp是从哪里来的?ndis微端口驱动自己组建的吗? 2、如何看到ndis微端口驱动中irp中包含的是什么板侧的指令?如断链指令…

查看全部问答∨

关于驱动开发的就业前景,待遇

我,大二的小童鞋,软件工程 这个暑假打算在实验室好好研究一下驱动程序的开发,以后也想在这一块发展 不知目前搞驱动开发的就业如何,待遇咋样,过来人帮忙给分析一下下 小弟这里多谢了…

查看全部问答∨

现在还有人用UPSD么?

                                  …

查看全部问答∨

STM32中CRC模块的CRC_IDR寄存器作什么用?

                                 CRC_IDR寄存器不知道有什么用处?…

查看全部问答∨

STM8勘误表去那找,谢谢(最好直接给出链接)

                                 RT…

查看全部问答∨

STM32单路DAC的速度最快是多少?

                                 例如采用72MHz的时钟,模拟信号的建立时间最短是多少?谢谢!…

查看全部问答∨

有关长整形(long int)?

今天编程时发现用long int 定义的变量当大于 32768时就会益处!难道iar c语言中没有真正的long int吗??…

查看全部问答∨

stm32 计数 如何设置成双边缘触发模式

不知道stm32计数模式下,可不可以设置成双边缘触发模式,若可以,麻烦告诉下方法(C语句),谢谢!…

查看全部问答∨

片子单向可控硅被烧的原因

日光灯用到一个白炽灯声控开关上,为什么会把片子单向可控硅都烧了?求答案。…

查看全部问答∨

赛灵思业界首款20nm ALL Programmable 产品开始发货了

半导体产业界首款20nm产品,也算个小里程碑了。 https://www.eeworld.com.cn/FPGA/2013/1112/article_3407.html…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved