AnsweredAssumed Answered

MPC5634-EMIOS-SAIC   code

Question asked by steven chen on Jan 17, 2016

Now I want to capture  eMIOS_9  channel output PWM(duty cycle 20%,frequency is 1KHz),using eMIOS_0 channel for capture.

But  I  cannot  enter   eMIOS_0_isr   interrupt  function,Is there any wrong with my code?

////////////////////////////////////////////////////////////////////////////////

#include "MPC5634M_MLQC80.h"

 

#define  LED3 SIU.GPDO[190].R

#define  LED4 SIU.GPDO[191].R

 

uint32_t data1,data2;

uint32_t delaytime;

 

void Config_PLL(void)

   FMPLL.SYNCR.R = 0x03080030;            /* 8 MHz crystal */

   while (FMPLL.SYNSR.B.LOCK != 1) {};    /* Wait for LOCK = 1 */

   FMPLL.SYNCR.R = 0x03080430;            /* Enable FM */

   while (FMPLL.SYNSR.B.LOCK != 1) {}; /* Wait for FMPLL to LOCK again */

   FMPLL.SYNCR.R = 0x16000000;         /* Final value for 64 MHz: RFD=0 */

}

 

 

void init_led(void)

{

  //EMIOS9,10,11,12对应PCR188,189,190,191

  //SIU.PCR[188].R = 0x0203;            //EMIOS9,OUTPUT

  //SIU.PCR[189].R = 0x0203;             //EMIOS10,OUTPUT

  SIU.PCR[190].R = 0x0203;             //EMIOS11,OUTPUT

  SIU.PCR[191].R = 0x0203;             //EMIOS12,OUTPUT

}

 

void init_EMIOS(void)

{

   EMIOS.MCR.B.GPRE=63;      // 设置分频系数为63+1=64,分频后始终为1MHz

   EMIOS.MCR.B.ETB=0;        // 禁止外部时基,设置通道23作为总线A控制时基

   EMIOS.MCR.B.GPREN=1;      // 使能全局分频器

   EMIOS.MCR.B.GTBE=1;       // 使能全局时基

   EMIOS.MCR.B.FRZ=1;        // 在调试模式下停止通道

 

   /* 初始化eMIOS23:作为所有通道的时基Bus A*/

   EMIOS.CH[23].CADR.R=999;       // 周期是999=1=1000 clocks(1ms)

   EMIOS.CH[23].CCR.B.MODE=0x50;  //设置为缓冲模数计数器模式MCB

   EMIOS.CH[23].CCR.B.BSL=0x3;    //使用1MHz的内部计数器作为时钟源

   EMIOS.CH[23].CCR.B.UCPRE=0;    //设置通道分频值为1

   EMIOS.CH[23].CCR.B.FREN=1;     //在调试模式下冻结通道计数

   EMIOS.CH[23].CCR.B.UCPREN=1;   //使能分频器:使用默认预分频值为1

 

   /* 初始化eMIOS9:占空比20% */

   EMIOS.CH[9].CADR.R=100;         // 设置首边沿的匹配值

   EMIOS.CH[9].CBDR.R=900;         // 设置尾边沿的匹配值

   EMIOS.CH[9].CCR.B.BSL=0x0;      // 使用Bus A

   EMIOS.CH[9].CCR.B.EDPOL=0;      // 设置极性:A匹配时清0,B匹配时置1

   EMIOS.CH[9].CCR.B.MODE=0x60;    //选择OPWMB模式

   SIU.PCR[188].R = 0x0600;        //EMIOS9对应SIU.PCR188

 

 

   /*初始化eMIOS0:输入捕捉SAIC模式 */

 

   EMIOS.CH[0].CCR.B.MODE=0x02;    //设置SAIC

   EMIOS.CH[0].CCR.B.BSL=0x0;      //使用使用Bus A:1MHz的内部计数器作为时钟源

   //EMIOS.CH[0].CCR.B.IF = 1;       //设置输入滤波器

   //EMIOS.CH[0].CCR.B.FCK= 1;       //滤波器时钟为主时钟

   EMIOS.CH[0].CCR.B.FEN = 1;       //使能输入捕捉中断

   //EMIOS.CH[0].CCR.B.DMA = 0;       //FLAG用作中断请求

   EMIOS.CH[0].CCR.B.EDSEL=0;       //设置上升沿触发中断

   EMIOS.CH[0].CCR.B.EDPOL= 1;

   //EMIOS.CH[0].CCR.B.UCPRE = 0;     //设置分频值为1

   //EMIOS.CH[0].CCR.B.UCPREN = 1;    //使能分频器

   //EMIOS.CH[0].CCR.B.FREN=1;        //在调试模式下冻结通道计数

   INTC.PSR[51].R = 3;

   SIU.PCR[179].R = 0x0503;         //EMIOS0对应SIU.PCR179

}

 

 

/*******************************************************************************

/*                       SAIC中断函数:eMIOS_0_isr                             */

/*******************************************************************************/

void eMIOS_0_isr(void)

{

  //LED4 ^= 1;

  if(EMIOS.CH[0].CSR.B.FLAG == 1)

  {

  //EMIOS.CH[0].CSR.B.FLAG = 1;      //清除标志位

 

  data1 = data2;

  data2 = EMIOS.CH[0].CADR.R;    //记录上升沿对应的时刻

 

  delaytime = data2- data1;   //计算时间间隔

  LED4 ^= 1;

     EMIOS.CH[0].CSR.B.FLAG = 1;      //清除标志位

  }

}

 

 

/************************************************************/

/*                           主函数                         */

/************************************************************/

void main(void)

{   

   vuint32_t i = 0;    /* Dummy idle counter */

   Config_PLL();

 

   init_led();

   init_EMIOS();

 

   INTC_InitINTCInterrupts();

   INTC_InstallINTCInterruptHandler(eMIOS_0_isr,51,3);

   INTC.CPR.B.PRI = 0;       /* MPC555x: Lower INTC's current priority */

   /* Loop forever */

   for (;;)

   {    

      i++;

      LED3 ^= 1; 

   }

}

 

////////////////////////////////////////////////////////////////////////////////

Outcomes