1、 SUBSRCPND 寄存器(SUB SOURCE PENDING)
SUBSRCPND 寄存器被用来标识 INT_RXD0、INT_TXD0 等中断(S3C2410中这类中断有 11 个,而 S3C2440 中有 15 个)是否已经发生,每位对应一个中断。当这些中断发生并且没有被 INTSUBMSK 寄存器屏蔽,则它们中的若干位将“汇集”出现在 SRCPND 寄存器的一位上。比如 SUBSRCPND 寄存器中的 3 个中断 INT_RXD0、INT_TXD0、INT_ERR0,只要有一个发生了并且它没有被屏蔽,则 SRCPND 寄存器中的 INT_UART0 位被置 1。
要清楚中断时,往 SUBSRCPND 寄存器中某位写入 1 即可令此位为 0;写入 0 无效果,数据保持不变。
SUBSRCPND 寄存器中各位对应的中断、SUBSRCPND 寄存器中哪几位“汇集”成 SRCPND 寄存器中的哪一位,参考数据手册。
2、 INTSUBMSK 寄存器(INTERRUPT SUB MASK)
INTSUBMSK 寄存器被用来屏蔽 SUBSRCPND 寄存器所标识的中断。 INTSUBMSK 寄存器中某位被设为 1 时, 对应的中断被屏蔽。
3、SRCPND 寄存器(SOURCE PENDING)
SRCPND 中每一位被用来表示一个(或一类)中断是否已经发生,“SPCPND”的两类中断:使用 SUBSRCPND/INTSUBMSK 控制的中断,不使用 SUBSRCPND/INTSUBMSK 控制的中断。
SRCPND 寄存器的操作与 SUBSRCPND 寄存器相似,若想清除某一位,往此位写入 1.
SRCPND 寄存器中各位对应哪个(或哪类)中断,参考数据手册。
4、INTMSK 寄存器(INTERRUPT MASK)
INTMSK 寄存器被用来屏蔽 SRCPND 寄存器所标识的中断。 INTMSK 寄存器中某位被设为 1 时,对应的中断被屏蔽。
INTMSK 寄存器只能屏蔽被设为 IRQ 的中断,不能屏蔽被设为 FIQ 的中断。
5、 INTMOD 寄存器(INTERRUPT MODE)
当 INTMOD 寄存器中某位被设为 1 时,它对应的中断被设为 FIQ,即此中断发生时, CPU 将进入快速中断模式,这通常用来处理特别紧急的中断。
注意:同一时间里, INTMOD 寄存器中只能有一位被设为 1.
6、 PRIORITY 寄存器
上面 INTMOD 寄存器中,将设为 1 的中断称为快速中断(FIQ),将其余设为 0 的中断称为普通中断(IRQ)。
当有多个普通中断同事发生时,中断控制器将选出最高优先级的中断,首先处理它。终端优先级的判选通过 7 个仲裁器来完成,包括 6 个一级仲裁器和 1 一个二级仲裁器。
每个仲裁器含 6 个输入引脚 REQ0 ~ REQ5。对于每个仲裁器, PRIORITY 寄存器使用三位来控制其行为:一位被用于选择仲裁器工作模式,称为 ARB_MODE;两位被用于控制各输入信号的优先级,称为 ARB_SEL。
ARM_SEL 的取值和 REQ0 ~ REQ5 的优先级如下。
ARB_SEL | 优先级(从高到低) |
00b | REQ0, REQ1, REQ2, REQ3, REQ4, REQ5 |
01b | REQ0, REQ2, REQ3, REQ4, REQ1, REQ5 |
10b | REQ0, REQ3, REQ4, REQ1, REQ2, REQ5 |
11b | REQ0, REQ4, REQ1, REQ2, REQ3, REQ5 |
当某个仲裁器的 ARB_MODE 被设为 0 时, 它的 ARB_SEL 位是不会自动变化的,此时这个仲裁器的 6 个输入引脚的优先级固定不变(当然,可以通过软件修改 ARB_SEL 来改变它们的优先级)。当 ARB_MODE 位被设为 1 时, ARB_SEL 会随着“已经被服务的 REQx”(x 为 1 ~ 4)自动变化,变化顺序如下。
已经被服务的REQx | ARB_SEL 的新值 |
REQ0/REQ5 | 维持不变 |
REQ1 | 01b |
REQ2 | 10b |
REQ3 | 11b |
REQ4 | 00b |
PRIORITY 寄存器中位[0:6]对应这 7 个仲裁器的 ARB_MODE 位(位[0]是 ARB_MODE0,依次类推),位[7:20]位对应这 7 个 仲裁器的 ARB_SEL ([7:8]是 ARB_SEL0,依次类推)
7、INTPND 寄存器(INTERRUPT PENDING)
经过中断优先级仲裁器选出优先级最高的中断后,这个中断在 INTPND 寄存器中的相应位被置 1 ,随后,CPU将进入中断模式处理它。
同一时间内,此寄存器只有一位被置 1; 在 ISR 中,可以根据这个位确定是哪个中断。清除中断时,往这个位写入 1。
8、INTOFFSET 寄存器(INTERRUPT OFFSET)
这个寄存器被用来表示 INTPND 寄存器中那位被置 1 了, 即 INTPND 寄存器中位 [x] 为 1 时, INTOFFSET 寄存器的值为 x(x 为 0 ~ 31)。
在清除 SRCPND、 INTPND 寄存器时, INTOFFSET 寄存器被自动清除。