DSP

DSP中断类型和中断信号简记(转)

2019-07-13 18:53发布

中断类型和中断信号简记

http://hi.baidu.com/lhjwd0322/blog/item/75c5f42dfd50653c359bf77b.html 中断类型和中断信号如下: 三种中断类型:RESET#,NMI,INT4-INT15,优先顺序如下:   复位中断:

最高级别,用来停止CPU工作,并返回到一个已知的状态.
  1. 它是低电平有效,其他的中断是转向高电平的上升沿有效.
  2. 为了正确初始化CPU,在RESET#再次变成高电平之前必须保持10个时钟.
  3. 复位操作使得所有的指令执行都被打断,所有的寄存器返回到他们的默认状态.
  4. 复位中断服务取指包必须放在地址为0的内存中.
  5. 复位不受转移指令的影响.
  • 不可屏蔽中断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 .