| 
在线时间166 小时
UID417103
注册时间2012-3-31
NXP金币0 
 该用户从未签到 金牌会员  
 
	积分1072 
最后登录2023-4-10 | 
 
| 本帖最后由 霹雳小猪 于 2014-11-18 14:43 编辑 
 对MPC5604P中断不是很了解,参考资料写了个PIT中断来点亮LED,可是就是无法正常工作,求大神帮忙!
 
 
 #include "MPC5604P_M26V.h"
 
 
 unsigned char Time_Flag = 0;
 unsigned char LED_Flag  = 0;
 
 
 void Init_Mode_Clock(void)
 {
 ME.MER.R = 0x0000001D;                                 /* Enable DRUN, RUN0, SAFE, RESET modes */
 
 /* Initialize PLL before turning it on */
 CGM.CMU_0_CSR.R = 0x000000004;                 /*Monitor FXOSC > FIRC/4 (4MHz); no PLL monitor */
 CGM.FMPLL[0].CR.R = 0x02400100;         /* 8 MHz xtal: Set PLL0 to 64 MHz */
 ME.RUN[0].R = 0x001F0074;                        /* RUN0 cfg: 16MHzIRCON,OSC0ON,PLL0ON,syclk=PLL0*/
 
 
 ME.PCTL[92].R = 0x01;                                 /* PIT, RTI: select ME_RUN_PC[1] */
 ME.RUNPC[1].R = 0x00000010;                 /* Peri. Cfg. 1 settings: only run in RUN0 mode */
 
 /* Enter RUN0 mode: */
 ME.MCTL.R = 0x40005AF0;                         /* Enter RUN0 Mode & Key */
 ME.MCTL.R = 0x4000A50F;                         /* Enter RUN0 Mode & Inverted Key */
 
 while (ME.GS.B.S_MTRANS == 1) {}         /* Wait for mode transition to complete */
 /* Notes: */
 /* 1. I_TC IRQ could be used here instead of polling */
 /* to allow software to complete other init. */
 /* 2. A timer could be used to prevent waiting forever*/
 while(ME.GS.B.S_CURRENTMODE != 4) {} /* Verify RUN0 is the current mode */
 /* Note: This verification ensures a SAFE mode */
 /* tranistion did not occur. SW could instead */
 /* enable the safe mode tranision interupt */
 }
 
 
 void Disable_Watchdog(void)
 {
 SWT.SR.R = 0x0000c520;                         /* Write keys to clear soft lock bit */
 SWT.SR.R = 0x0000d928;
 SWT.CR.R = 0x8000010A;                         /* Clear watchdog enable (WEN) */
 }
 
 
 void Init_PIT(void)
 {
 PIT.PITMCR.R           = 0x00000001;        /* Enable PIT Timers Clock,Timers continue to run in debug mode*/
 /* Timer 0 */
 PIT.CH[0].LDVAL.R = 0x03D09000; /* 64Mhz--->100ms */
 PIT.CH[0].TCTRL.R = 0x00000003;        /* Timer Interrupt&Timer Enable */
 
 INTC.PSR[59].R           = 0x05;                 /* PIT 0 interrupt vector with priority 1 */
 }
 
 void PIT1_ISR(void)
 {
 PIT.CH[0].TFLG.B.TIF = 1;
 
 if(Time_Flag < 5) Time_Flag++;
 else
 {
 if(LED_Flag == 0)         LED_Flag = 1;
 else                                 LED_Flag = 0;
 Time_Flag = 0;
 }
 }
 
 void Init_INTC(void)
 {
 INTC_InstallINTCInterruptHandler(PIT1_ISR, 59, 5);       /*将PIT0 ISR安装到中断向量表中*/
 
 INTC.MCR.B.HVEN = 0;                                                                         /* Single core: initialize for HW vector mode */
 INTC.MCR.B.VTES = 0;                                    /* Use default vector table 4B offsets */
 }
 
 
 void Init_Port(void)
 {
 SIU.PCR[52].B.PA  = 0;
 SIU.PCR[53].B.PA  = 0;
 SIU.PCR[54].B.PA  = 0;
 SIU.PCR[55].B.PA  = 0;
 
 SIU.PCR[52].B.OBE  = 1;
 SIU.PCR[53].B.OBE  = 1;
 SIU.PCR[54].B.OBE  = 1;
 SIU.PCR[55].B.OBE  = 1;
 
 SIU.GPDO[52].R = 1;   //
 SIU.GPDO[53].R = 1;
 SIU.GPDO[54].R = 1;
 SIU.GPDO[55].R = 1;
 }
 
 
 void Enable_IRQ(void)
 {
 INTC.CPR.B.PRI = 0;         /* Single Core: Lower INTC's current priority */
 asm(" wrteei 1");                 /* Enable external interrupts */
 }
 
 
 
 
 int main(void)
 {
 Init_Mode_Clock();
 Disable_Watchdog();
 Init_PIT();
 Init_INTC();
 Init_Port();
 Enable_IRQ();
 
 /* Loop forever */
 for (;;)
 {
 if(LED_Flag == 0)
 {
 SIU.GPDO[52].R = 0;   //
 SIU.GPDO[53].R = 0;
 SIU.GPDO[54].R = 1;
 SIU.GPDO[55].R = 1;
 }
 else
 {
 SIU.GPDO[52].R = 1;   //
 SIU.GPDO[53].R = 1;
 SIU.GPDO[54].R = 0;
 SIU.GPDO[55].R = 0;
 }
 }
 }
 
 
 
 
 
 | 
 |