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中断向量号进行相应处理。
本文关键字:技术 嵌入式系统-技术,单片机-工控设备 - 嵌入式系统-技术