S3C2440A 中的中断控制器接受来自 60 个中断源的请求。提供这些中断源的是内部外设,如 DMA 控制器、 UART、IIC 等等。在这些中断源中,UARTn、AC97 和 EINTn 中断对于中断控制器而言是“或”关系。 当从内部外设和外部中断请求引脚收到多个中断请求时,中断控制器在仲裁步骤后请求 ARM920T 内核的 FIQ 或 IRQ。
s3c2440A中断处理框图
对于IRQ处理过程详解
一、中断控制器操作
1、程序状态寄存器(PSR)的 F 位和 I 位
如果 ARM920T CPU 中的 PSR 的 F 位被置位为 1,CPU 不会接受来自中断控制器的快中断请求(FIQ)。同 样的如果 PSR 的 I 位被置位为 1,CPU 不会接受来自中断控制器的中断请求(IRQ)。因此,中断控制器可以通过 清除 PSR 的 F 位和 I 位为 0 并且设置 INTMSK 的相应位为 0 来接收中断。
2、中断模式
ARM920T 有两种中断模式的类型:FIQ 或 IRQ。所有中断源在中断请求时决定使用哪种类型。
3、中断挂起寄存器
S3C2440A 有两个中断挂起寄存器:源挂起寄存器(SRCPND)和中断挂起寄存器(INTPND)。这些挂起寄 存器表明一个中断请求是否为挂起。当中断源请求中断服务,SRCPND 寄存器的相应位被置位为 1,并且同时在仲 裁步骤后 INTPND 寄存器仅有 1 位自动置位为 1。如果屏蔽了中断,则 SRCPND 寄存器的相应位被置位为 1。这 并不会引起 INTPND 寄存器的位的改变。当 INTPND 寄存器的挂起位为置位,每当 I 标志或 F 标志被清除为 0 中 断服务程序将开始(异常处理开始)。SRCPND 和 INTPND 寄存器可以被读取和写入,因此服务程序必须首先通过写 1 到 SRCPND 寄存器的相应位来清除挂起状态并且通过相同方法来清除 INTPND 寄存器中挂起状态。
4、中断屏蔽寄存器
此寄存器表明如果中断相应的屏蔽位被置位为 1 则禁止该中断。如果某个 INTMSK 的中断屏蔽位为 0,将正常 服务中断。如果 INTMSK 的中断屏蔽位为 1 并且产生了中断,将置位源挂起位。
二、以外部中断K为例设置寄存器
1、初始化
(1)配置INIMSK(开关)中断源
调整EINT8_23为可服务状态
(2)配置触发方式
配置其触发方式为下降沿触发,例如开关按下的时候
(3)配置引脚(GPB0)
配置GPB0引脚为TOUT0模式
2、配置CPSR
使能CPSR中的I位,需要保证其在有特权的模式下进行这步
deal_irq
sub lr, lr, #4
stmfd sp!, {r4-r12, lr} ; 保护现场
import irq_handle
bl irq_handle
ldmfd sp!, {r4-r12, pc}^ ; 带模式切换的恢复现场
第一句的操作是因为保证在切换模式后返回模式时,pc能够正确的跳转,因为在异常的进入和退出时,pc有以下的规律
3、处理中断
(1)判断终端偏移(INTOFFSET)
(2)配置EINTMASK
配置其为使能中断
(3)根据偏移量,配置EINTPEND(需要注意的时在此之前,一定要保证工作模式的切换,不然后续程序的跳转回出现问题)
(4)清除挂起标志,及配置到的PEND都需要置1清除