《嵌入式linux应用程序开发完全手册》中断控制器操作(外部中断)学习笔记

2019-07-13 03:57发布

 《嵌入式linux应用程序开发完全手册》中断控制器操作(外部中断)学习笔记   .ARM中断体系 当一个“异常”发生时,或者说当收到一个中断触发信号时,ARM9将会自动完成如下一些工作: (1)       在异常工作模式的连接寄存器R14中保存前一个工作模式的下一条指令地址,即是pc+4或者pc+8 (2)       CPSR的值复制到异常模式的SPSR中。 (3)       CPSR工作模式位设为这个异常对应的工作模式。 (4)       PC值等于这个异常模式在异常向量表中的地址,即跳转去执行异常向量表中的相应指令。既是执行中断服务程序。  当从异常模式恢复至之前的工作模式时,软件需要完成如下工作: (1)       将前面进入异常时保存在R14中的指令地址减去适当值后赋给PC寄存器。 异常模式 退出异常时PC 进入异常模式时R14 Svc MOVS PC,R14 PC+4 Und MOVS PC,R14 PC+4 Fiq SUBS PC,R14,#4 PC+4 Irq SUBS PC,R14,#4 PC+4 Abt 指令预取终止 SUBS PC,R14,#4 PC+4 指令读取终止 SUBS PC,R14,#8 PC+8   (2)       SPSR的值复制回CPSR . S3C2440中断控制器 其实,无论哪种CPU,中断处理过程都是类似的: 1.       中断控制器汇集各类外设发出的中断信号,然后告诉CPU 2.       CPU保存当前程序的运行环境,调用中断服务程序来处理中断。 3.       ISR(interrupt Service Routine)中通过读取中断控制器,外设的相关寄存器来识别这是哪个中断,并进行相应的处理。 4.       清除中断:通过读写中断控制器和外设的相关寄存器来实现。 5.       最后恢复被中断程序的运行环境,继续执行中断前的程序。 当然,对于不同的CPU体系结构,具体的寄存器操作自然就不同了。 对于S3C2440,寄存器SUBSRCPNDSRCPND表明有哪些中断被触发了,正在等待处理(pending),INTSUMMSKINTMSK寄存器用于屏蔽某些中断 基本中断处理过程如下: 中断源被触发过后,SUBSRCPND寄存器中的相应位会被置位,如果此中断没有被INTMSK寄存器屏蔽掉,它将会进一步处理。在SRCPND寄存器中,被触发的中断相应位被置1,等待处理。如果被触发的中断源中有FIQ,则CPU进入FIQ Mode进行处理。如果被触发的是一般的IRQ,可能同时有几个中断被触发,未被INTMSK寄存器屏蔽的中断经过比较,选出优先级最高的中断,此中断在INTPND寄存器中的相应位被置1,然后CPU进入IRQ Mode进行处理。中断服务程序可以通过读取INTPND寄存器或者 INTOFFSET寄存器来确定中断源。 综上,使用中断的步骤如下: 1.       设置好中断模式和快速中断模式下的栈。 2.       准备好中断处理函数。包括异常向量表,ISR,清除中断。 清除中断的方法: (1)    操作具体外设清除中断信号。 (2)    清除SUBSRCPNDSRCPND寄存器中的相应位。 (3)    清除INTPND寄存器中的相应位。 3.       进入和退出时需要对中断程序的运行环境进行保护和恢复。 1)进入和退出IRQ的一般处理:   2)进入和退出FIQ的一般处理:     4.       根据具体中断,设置相关外设,比如对于GPIO中断,需要将相应引功能设置为“外部中断”,设置中断触发条件等等。 5.       INTSUBMSK寄存器相应位设为0,如果需要的话。 6.       确定使用中断的方式:FIQ或者 IRQ 7.       如果是FIQ,则INTMOD寄存器中设置相应位为1;如果是IRQ,则在PRIORITY寄存器中设置优先级。 8.        如果是IRQ,将INTMSK寄存器相应位设为0FIQ不受INTMSK寄存器控制。 9.       设置CPSR寄存器中的I (IRQ)或者 F(FIQ),全能IRQ或者FIQ 中断控制寄存器: (1)      子中断源未决寄存器SUBSRCPND,地址:0x4A000018 (2)      子中断屏蔽寄存器INTSUBMSK,地址:0x4A00001C (3)      中断源未决寄存器SRCPND,地址:0x4A000000 (4)      中断屏蔽寄存器INTMSK,地址:0x4A000008 (5)      中断模式寄存器INTMOD,地址:0x4A000004 (6)      优先级寄存器PRIORITY,地址:0x4A00000C (7)      中断未决寄存器INTPND,地址:0x4A000010 (8)      中断偏移寄存器INTOFFSET,地址:0x4A000014 各个寄存器的具体操作说明请参考S3C2440datasheet .KEY对应的中断连接  EINT19(GPG11)-------K1  EINT11(GPG3)-------K2 EINT2GPF2)-------K3 EINT0GPF0)-------K4 将这几个I/O口设置成外部中断功能。如果某个key按下时就产生中断,点亮对应的led . 按键中断实验代码 1)初始化,设置中断模式、系统模式的栈,设置好中断处理函数     2)初始化,关闭watchdog,,初始化GPIO引脚为外部中断。         (3)      真正的ISR