内外部中断,除了仿真器中断和复位中断不可屏蔽,其余中断均可屏蔽,除了不可屏蔽中断和引导加载中断EP0I或者LP4I外,所有中断在系统复位时都是默认被屏蔽的。当1个中断正在执行服务期间,ADSP会在每个周期都对中断锁存寄存器ILAT中的相应位清0,以禁止该中断服务程序重复响应。
涉及到中断的主要有以下这几个寄存器:ILAT,IMASK,PMASK,此3个寄存器位定义一致,以及SQCTL下的GIE位控制全局中断,和INTCTL控制IRQ3-0的触发方式、TIME1-0的启动。
寄存器高32位:
寄存器低32位:
ILAT: 中断锁存寄存器,是1个64位的只读寄存器,通过两个32位的寄存器ILATL和ILATH对其进行访问,每位对应一种中断类型,当中断产生时,该寄存器中相应的位置1,中断位按照中断优先级排列,位0对应最低中断类型。PS:对ILATH、ILATL寄存器的置1操作只能通过对ILATSTH、ILATSTL进行,写入ILATST的值跟ILAT的值进行按位或操作,结果重新装入ILAT,因此对ILATST写入1时可将ILAT中相应位置1,对寄存器ILATST写入0则不能改变ILAT中的值;其次对ILAT的清0 操作通过ILATCLH、ILATCLL寄存器进行,写入ILATCL的值跟寄存器ILAT中的值按为与操作,得到结果重新载入ILAT中,因此对ILATCL写入1时,不能改变ILAT的值,写入0,可将ILAT清0。可用ILATST、 ILATCL软件模拟中断事件。
IMASK:中断屏蔽寄存器,只有置1才允许响应相应的中断服务。
PMASK:中断指针屏蔽寄存器,锁存正在执行的中断,如果允许中断嵌套,只有在高于目前PMASK位的中断才可以响应。服务程序执行完毕后,系统执行RTI或RETI指令清0,利用RDS指令可强制清0。
INTCTL:中断控制寄存器,用于定义中断引脚的中断触发类型(电平或边沿触发)、控制定时器0、1运行或停止。
SQCTL:程序控制寄存器,是32位寄存器,高20位保留,对它的操作仅能通过SQCTLST和SQCTLCL进行,SQCTL_GIE位控制全局中断,1使能,0屏蔽。
库函数:
interrupt(SIGIRQ2, irq2_int);//将服务程序的函数指针放入中断向量表,同时开启对应中断。