在线时间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;
}
}
}
|
|