[资料分享] MCF52233_GPT

tjbbjiang   2009-12-1 15:37 楼主
 呵呵,我们的Freescale。终于有Freescale的版块了,现在把以前写的一些东西转过来,希望能有更多人的关注Freescale。

MCF52233_GPT—General Purpose Time Module
   今天嘛——给介绍下Coldfire的GPT这个模块.在调这块的时候碰到了一个问题。验证脉宽检测的时候用的是另一个实验箱输出的PWM波,测出来的结果老是相差10倍,在一大堆数据中会有那么一个是正常的结果。晕、迷茫,手册看了一遍又一遍始终找不出来哪地方的问题。弄了快一天,忽然想到把两个电路的地连起来,呵呵,马上就看到了期盼了一天的数据。其实这个小细节以前老师跟我们讲过的,只是当是没在意,慢慢就忘了,现在看来真是太重要了,经验乎教训乎……
  呵呵,Coldfire的定时器可真是多啊!两路的PIT;四路的GPT实际上是由2计数器组成的,并不像第一印象4个那样;8路的PWM用的8个定时器我感觉用计数器来定义更合适些。从更接近硬件的本质的角度来看好多都是计数器,但表现出来的却都是定时器的功能。哈哈,我们就把他们统统当成定时器吧,总共14个!(以表对Coldfire的崇拜,GPT我把它当作有4个)嘿嘿,N吧——
   在这些定时器中,最复杂的要数GPT了,因为它的功能真是太多了(呵呵,用“全”来形容更合适)。4路的输出比较/输入捕获、1路的外部事件计数、1路的脉宽检测,这其中有些是共用一个引脚的,所以并不是这6路可以同时使用的。另外它的中断也肯定会让你笑的,共有7个。
  首先说下输出比较/输入捕获(output compare/input capture)。虽然Coldfire已经有了很方便的8路PWM功能,但它GPT的output compare同样可以用来产生PWM,不同的是GPT可以产生更精确的PWM波形,频率控制也更自由灵活。美中不足的是要产生高频的PWM波的话就要使用channel 3来限制计数上限,这样就限制了channel 3功能的发挥。要是能再增加寄存器来存放计数上限就好了,不过这样的话GPT可能就真的要4个计数器而不是现在的2个了。这个就不讨论了。对于input capture就是个边沿触发器,当有效边沿来时记下当前时刻,跟据自己的爱好产生中断。这个用来对外部事件计数,或者当作外部中断,再或者用来测脉宽那都是没问题的。
  然后是计数功能,它直接就给出了有效边沿发生的次数,用来计数的话,程序那是相当的简便啊!
  最后是脉宽检测(Pulse Accumulator),这个只是在input capture上作了点手脚。它是一个有效边沿发生时启动PA计数器,结束边沿到达时停止PA计数器,并产生中断。我们直接就可以得到被测脉宽了。
  无论初始化还是7个中断都要跟据不同的功能来写,实在不好用这个语言来表达,看代码吧:

void GPT_init(void)
{
  uart0_putstr("GPT_init\n");
MCF_GPIO_PTAPAR=MCF_GPIO_PTAPAR_GPT0_GPT0
       |MCF_GPIO_PTAPAR_GPT1_GPT1
       |MCF_GPIO_PTAPAR_GPT2_GPT2
       |MCF_GPIO_PTAPAR_GPT3_GPT3;
//set pin as input capture or output compare 0:input
//            1:output
MCF_GPTA_GPTIOS=MCF_GPTA_GPTIOS_IOS0
       |MCF_GPTA_GPTIOS_IOS1;
       //|MCF_GPTA_GPTIOS_IOS2;
       //|MCF_GPTA_GPTIOS_IOS3;
//force a compare
MCF_GPTA_GPTCFORC=0;
//config corresponding pin as output
MCF_GPTA_GPTOC3M=MCF_GPTA_GPTOC3M_OC3M0
     |MCF_GPTA_GPTOC3M_OC3M1;
     //|MCF_GPTA_GPTOC3M_OC3M2;
     //|MCF_GPTA_GPTOC3M_OC3M3;
//
MCF_GPTA_GPTOC3D=MCF_GPTA_GPTOC3D_OC3D0
     |MCF_GPTA_GPTOC3D_OC3D1
     |MCF_GPTA_GPTOC3D_OC3D2
     |MCF_GPTA_GPTOC3D_OC3D3;
//toggles the output compare pin on overflow for each channel
MCF_GPTA_GPTTOV=MCF_GPTA_GPTTOV_TOV0
       |MCF_GPTA_GPTTOV_TOV1
       |MCF_GPTA_GPTTOV_TOV2
       |MCF_GPTA_GPTTOV_TOV3;
//disconnect(NOGHING)/toggle/set/clesr when compare occured
MCF_GPTA_GPTCTL1=MCF_GPTA_GPTCTL1_OUTPUT0_CLEAR
     |MCF_GPTA_GPTCTL1_OUTPUT1_CLEAR
     |MCF_GPTA_GPTCTL1_OUTPUT2_NOTHING
     |MCF_GPTA_GPTCTL1_OUTPUT3_NOTHING;
//input capture disable/on rising/on falling/on any edge
MCF_GPTA_GPTCTL2=MCF_GPTA_GPTCTL2_INPUT0_DISABLED
      |MCF_GPTA_GPTCTL2_INPUT1_DISABLED
      |MCF_GPTA_GPTCTL2_INPUT2_RISING
      |MCF_GPTA_GPTCTL2_INPUT3_DISABLED;
// channel interrupt enable
MCF_GPTA_GPTIE=//MCF_GPTA_GPTIE_CI0
      //|MCF_GPTA_GPTIE_CI1
      MCF_GPTA_GPTIE_CI2;
      //MCF_GPTA_GPTIE_CI3;
//TOI time over interrupt
//pull-up resistor when the pin configured as input
//prescaler bits
MCF_GPTA_GPTSCR2=//MCF_GPTA_GPTSCR2_TOI
     MCF_GPTA_GPTSCR2_PUPT
     //|MCF_GPTA_GPTSCR2_TCRE
     |MCF_GPTA_GPTSCR2_PR_128;
//a channel flag is set when an input capture or output compare event occurs
/*****实在没办法,后面的代码一加进来就提示有敏感词,不能发表,QQ真挫**********/


[ 本帖最后由 tjbbjiang 于 2009-12-1 15:39 编辑 ]

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复