查看: 3350|回复: 3

[MPC] 【求助】MPC5604P中断问题

[复制链接]

该用户从未签到

24

主题

666

帖子

0

金牌会员

Rank: 6Rank: 6

积分
1072
最后登录
2023-4-10
发表于 2014-11-18 14:18:12 | 显示全部楼层 |阅读模式
本帖最后由 霹雳小猪 于 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;       
    }
  }
}




我知道答案 目前已有3人回答
回复

使用道具 举报

该用户从未签到

0

主题

218

帖子

0

中级会员

Rank: 3Rank: 3

积分
472
最后登录
1970-1-1
发表于 2014-11-18 20:10:49 | 显示全部楼层
可以参看这个示例

MPC5604P-PIT-InterruptNesting-CW210.zip

119.26 KB, 下载次数: 42, 下载积分: 威望 1

回复 支持 反对

使用道具 举报

该用户从未签到

24

主题

666

帖子

0

金牌会员

Rank: 6Rank: 6

积分
1072
最后登录
2023-4-10
 楼主| 发表于 2014-11-19 10:54:14 | 显示全部楼层

你好,非常感谢,你能再提供一个硬件中断模式下的例程么?
回复 支持 反对

使用道具 举报

该用户从未签到

24

主题

666

帖子

0

金牌会员

Rank: 6Rank: 6

积分
1072
最后登录
2023-4-10
 楼主| 发表于 2014-11-19 16:17:17 | 显示全部楼层

参考示例还是没能行
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-9-12 05:34 , Processed in 0.091670 second(s), 25 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表