中断类型和中断信号如下:
三种中断类型:RESET#,NMI,INT4-INT15,优先顺序如下:
复位中断:
最高级别,用来停止CPU工作,并返回到一个已知的状态.
-
它是低电平有效,其他的中断是转向高电平的上升沿有效.
-
为了正确初始化CPU,在RESET#再次变成高电平之前必须保持10个时钟.
-
复位操作使得所有的指令执行都被打断,所有的寄存器返回到他们的默认状态.
-
复位中断服务取指包必须放在地址为0的内存中.
-
复位不受转移指令的影响.
-
不可屏蔽中断NMI
它通常用来向CPU发出严重硬件中断的警报.为了实现NMI,在中断使能寄存器中的不可屏蔽中断使能位(NMIE)必须置1.如果NMIE置1,阻止NMI处理的唯一可能是包括屏蔽中断发生在转移指令的延迟间隙里. -
INT4-INT15
C6000有12个可屏蔽中断,他们被连接到芯片外部或片内外设,也可以由软件控制或者不用.中断发生时,将中断标志寄存器(IFR)得相应位置置1.假如一个INT不发生在转移指令的间隙里,它还必须满足下列条件才能得到响应. -
状态控制寄存器(CSR)中的全局中断使能位置1
中断使能寄存器(IER)中断NMIE位置1.
IER中的相应使能位置置1。
在IFR中没有更高优先级的中断标志(IF)位为1 -
中断响应信号(IACK ,INUMx)
IACK ,INUMx信号用来通知C6000片外硬件:在CPU内一个中断已经发生并且正在处理时,会由IACK信号指出CPU已经开始处理一个中断,INUMx 信号(INUM3~INUM0)指出正在处理的是哪一个中断(即IFR中的中断位).例如如果INUMx信号从高到低为0111,表明正在处理INT7中断.
二:中断服务表(IST)
中断服务表(IST)是包含中断服务代码的取指包的一个地址表当CPU开始处理一个中断时,他要参照IST进行.IST包包含16个连续取指包,每个服务取指包都含有8条(32位字)指令.因此中断服务表中的地址以32字节增长. -
控制状态寄存器CSR
它有低两位用来控制中断,bit0---GIE,bit1---PGIE.
PGIE保存先前的GIE值,即在响应可屏蔽中断时,保存GIE的值,而GIE被清0,这样在处理一个可屏蔽中断时,就防止了另外的一个可屏蔽中断的发生.当从中断返回时,通过BIRP指令可使PGIE的值重新回到GIE. -
中断初始化的过程
1. 初始化中断服务表指针(ISTP):intr_init();
2. 选择用哪一个中断: intr_map(CPU_INT7,ISN_EXT_INT7);
3. 清中断: INTR_CLR_FLAG(CPU_INT7);
4. 中断服务子程序与中断号挂钩: intr_hook(Int7_ISR,CPU_INT7);
5. 打开非屏蔽中断: INTR_ENABLE(CPU_INT_NMI);
6. 打开所选中断: INTR_ENABLE(CPU_INT7);
7. 全局中断使能: INTR_GLOBAL_ENABLE();
其中的第二条中的两个参数分别可以为下列的值: -
中断处理函数都是小写的,而宏定义都是大写的,在 C 语言的语法里是要注意的,否则会出现找不到函数或者函数未定义。
-
example:
中断源需要映射到CPU中断,这个是通过加载中断选择数到需要的中断选择域中.intr_map(CPU_INT8,ISN_DMA_INT0);
当中断多路器寄存器配置后,ISR就可以跟CPU挂钩并使能了.
interrupt void exampleISR(void)
{
isrFlag= TRUE;
return;
}
intr_hook( exampleISR, CPU_INT8 );
INTR_ENABLE( CPU_INT8 );
现在DMA通道0的中断事件就可以调用exampleISR .