您当前的位置:五五电子网电子知识单片机-工控设备嵌入式系统-技术MPC860的中断处理技术研究 正文
MPC860的中断处理技术研究

MPC860的中断处理技术研究

点击数:7854 次   录入时间:03-04 11:37:43   整理:http://www.55dianzi.com   嵌入式系统-技术
struct dprbase *PDPr; /*指向双端口内存基址的地址*/

void smc_init() /*初始化SMC函数*/

{ void intbrn(); /*定义SIU中断服务程序*/

int *ptrs,*ptrd; /*SIU中断服务程序搬移的源和目的地址*/

char intlv1=4;/*CPM中断级别*/

PDPr=(struct dprbase *)(getimmr() & 0xFFFF0000); /*得到内部双端口寄存器的基址*/

…… /*初始化SMC的寄存器和工作参数,如工作模式,波特率等*/

…… /*初始化串口数据收发缓冲区的描述字,注意要把接收缓冲区描述字RxBD的中断位置为1*/

ptrs=(int *)intbrn; /*需要搬移的SIU中断服务程序源地址*/

ptrd=(int *)(getevt()+0x500);/*目标地址*/

do /*把SIU中断服务程序搬移到外部中断入口处*/

*ptrd++=*ptrs;

while(*ptrs++!=0x4c000064);/*0x4c000064是SIU中断服务程序返回指令RFI指令的二进制代码*/

PDPr->CICR.IRL2=(unsigned)(intlv1);/*设定CPM的中断级别为4*/

pdpr->CICR.HP0_HP4=0x1F; /*设定PC15为最高优先级中断*/

pdpr->CIMR.SMC1=1;/*打开CPM IC的SMC1中断屏蔽位*/

pdpr->SIMASK.ASTRUCT.LVM4=1;/*打开SIU IC的CPM中断屏蔽位*/

pdpr->CICR.IEN=1;/*使能CPM中断*/

pdpr->SMCE1=0xFF;/*清除SMC1的事件寄存器*/

pimm->SMCM1=1;/*打开子模块可屏蔽的接收中断*/

asm("mtspr 80,0");/*使能中断*/

…… /*使能SMC1的发送和接收功能*/

}

main() /*主函数*/

{ smc_init() /*初始化SMC1*/

while(1==1);/*等待接收*/

}

#pragma interrupt intbrn /*SIU中断服务程序

void intbrn()

{void CPMHandler();/*定义CPM中断服务程序*/

asm("stwu r9,-4(r1");/*把GRR9压入堆栈*/

switch(pdpr->SIVEC.IC)/*读取SIU的中断向量号,转入相应处理程序*/

{case 0x24;/*为CPM对应的中断向量号*/

asm("mfspr r9,8");/*把LR压入堆栈*/

asm("mfspr r9,8");/*把LR压入堆栈*/

asm("mfspr r9,8");/*把LR压入堆栈*/

asm("stwu r9,-4(r1)");

asm("bla CPMHandler")/*调用CPM中断处理函数*/

asm("lwz r9,0(r1)");/*把LR从堆栈中弹出*/

asm("addi r1,r1,4");/*恢复堆栈指针*/

asm("mtspr8,r9");

break;

default:;

}

asm("lwz r9,0(r1); /*把GPR9从堆栈中弹出/*

asm("addi r1,r1,4");/*恢复堆栈指针*/

}

void CPMHandler() /*CPM中断处理程序*/

{unsigned v1;

pdpr->CIVR.IACK=1;/*把CIVR的IACK位置为1,以读取CIVR中的中断向量号*/

v1=pdpr->CIVR.VN;/*读取中断向量号*/

switch(pimm->CIVR.VN)/*根据中断向量号进行处理*/

{case 4: /*SMC1的中断向量*/

…… /*SMC1中断处理程序,对接收到的数据进行处理*/

pimm->CISR=1<<(31-11);/*清除IN-SRVCE位*/

break;

default:;

}

}

getimmr() /*得到双端口寄存器的基址*/

{ asm("mfspr3,638");

}

getevt() /*得到中断入口的基址*/

{ if((getmsr() & 0x40)==0)/*如果MSR.IP等于0*/

return(0); /*中断入口在低位*/

else

return(0xFFF00000);/*中断入口在高位*/

}

getmsr() /*得到机器状态寄存器MSR的值*/

{ asm(mFMsr 3; /*把MSR的值读到r3中*/

}

4 结论

以上讨论的中断应用程序的编写是在没有操作系统的情况下进行的;如果有操作系统,对中断管理的初始化会在操作系统初始化时完成,用户只需调用API函数安装中断服务程序即可。但即使这样,理解上述的中断处理过程,对编写MPC860中断服务程序也是有必要的。

从以上讨论可以看出,与MPC860带有两个处理器的体系结构相适应的,MPC860中断机制采用了两级中断处理,其优点是能最大限度地扩展外部中断源的数量,并可以加快对CPM中断的响应速度。编写MPC860中断处理程序的关键在两个方面:一个是在初始化时应该设置好各个中断寄存器,并且把SIU中断服务程序放到正确的位置;另一个是在中断服务程序的处理过程中,要根据读得的SIU和CPM中断向量号进行相应处理。



上一页  [1] [2] 


本文关键字:技术  嵌入式系统-技术单片机-工控设备 - 嵌入式系统-技术