中断初始化相关知识..doc
文本预览下载声明
1.InitPieVectTable():
每个中断都有自己的中断向量,即每个中断源都对应着自己的中断服务程序的入口地址,这些中断向量连续存在于RAM中,就是整个系统的中断向量表;
Uint32 *Source = (void *) PIE_RESERVED;中断服务函数入口地址;
取PIE_RESERVED地址,强制转换为void*。换后的void*直接赋值给Uint32 *指针。这里要把PIE_RESERVED的首地址给指针Source,Source是Uint32型的,不能够直接给地址的,需要类型转换,在C语言里面指针强制转换要求两边的类型要是一样的,同时也指出了void类型是可以赋值给任何类型的,所以这里用了(void*),其实改成(Uint32*)。Uint32 *Dest = (void *) PieVectTable;中断向量表
extern struct PIE_VECT_TABLE PieVectTable;(Device.h)
一共128个中断,即128个中断向量ID:
EALLOW;
for(i=0; i 128; i++)
*Dest++ = *Source;
EDIS;
把中断入口地址送给中断向量表,达到关联的目的;
#define EALLOW asm( EALLOW)
#define EDIS asm( EDIS) (Device.h)
EALLOW是指允许对受保护的寄存器操作,通常和EDIS配套使用,EDIS是指恢复被保护寄存器的状态,只有执行了EALLOW命令之后才能对受保护的寄存器操作。
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;使能中断向量表。
2.InitPieCtrl():
DINT;关闭CPU总中断;
#define DINT asm( setc INTM) ( Device.h)
PieCtrlRegs.PIECTRL.bit.ENPIE = 0; 关闭PIE模块总中断。
关闭所有PIE模块的中断:
PieCtrlRegs.PIEIERn.all = 0;(n=0……12)
清除所有中断标志位:
PieCtrlRegs.PIEIFRn.all = 0;(n=0…….12)
对于不可屏蔽中断来说,它直接进入CPU级。对于可屏蔽中断来说,PIE模块有相关的标志寄存器(PIEIFRx和PIEIERx)(x=1……12)每一个位设为y(y=1……8)当有中断请求进入PIE控制器的时候,相关的PIE中断标志位PIEIFRx.y置高。如果PIE中断允许位PIEIERx.y也置高的时候,PIE控制器机会检查PIEACKx标志位来决定CPU是否已经准备好接收这个PIE中断组的中断。如果PIEACKZx被清零了,那么PIE会把这个中断请求送到CPU如果PIEACKx位置,那么PIE就会等待直到这个标志位清零然后发送中断请求给CPU级的INTx。一旦中断请求到达CPU级,CPU级和INTx相对应的中断标志位(IFR)置,如果CPU中断允许寄存器(IER)或者调试中断允许寄存器(DBGIER)和全局中断屏蔽位(INTM)允许的话,CPU才会这个中断申extern cregister volatile unsigned int IER; (Device.h)
CPU中断使能寄存器是一个16位的CPU寄存器,包含可屏蔽CPU中断(INT1-INT12,DLOGINT和RTOSINT中断)的使能位。
IFR:CPU中断标志寄存器;
extern cregister volatile unsigned int IFR;(Device.h) #define EINT asm( clrc INTM) ( Device.h)
使能CPU中断;INTM只是个位不是寄存器,编程中不会出现,由硬件控制,同时其清除也在中断程序执行完后由硬件自动清除。判断INTM是否为0. 如果为0,CPU保存当前工作状态经过9个周期后开始执行中断。如过INTM为1,则只有等待。一般INTM为1,说CPU正在处理别的中断INTM
Bit?0:中断全局屏蔽位。此位从全局上使能或禁止所有可屏蔽CPU中断(那些可由软件阻止的中断):?
0?可屏蔽中断被全局使能。为了被CPU认可,则可屏蔽中断也必须被中断使能寄存器(IER)局部使能。
1?可屏蔽中断被全局禁止。即使一个可屏蔽中断被IER局部使能,也不会被CPU认可。?
??INTM对非可屏蔽中断没有影响,包括硬件复位或软件复位中断NMI。此外,当CPU在实时仿真模式下被停止时,由IER和DBGIER使能的中断将被响应,即使INTM设置为禁止可屏蔽中断。?
显示全部