2、汇总的中断中有三种类型的中断
(1)直接有INTPND便可判断的中断
(2)由子中断汇总的中断 (3)EINT4_7 和EINT8_23 对于情况2:比如关于串口方面的中断INT_RXD0,INT_TXD0,INT_ERR0,此三个中断只要有一个发生了,且没有被屏蔽,则三者在INTPND中的标示 均为INT_UART0,光是看INTPND还无法分辨具体哪一个中断发生,此时需要用到SUBSRCPND寄存器, SUBSRCPND 的位[2]标志INT_ERR0 SUBSRCPND 的位[1]标志INT_TXD0 SUBSRCPND 的位[0]标志INT_RXD0 同理,其他由子中断汇总的中断都能在SUBSRCPND找到自己子中断的标示。这中子中断在S3C2440中有15个,即在SUBSRCPND需要15位标示,汇总到 INTPND中由6位标示,总的映射关系如下 INT_UART0 :INT_RXD0,INT_TXD0,INT_ERR0 INT_UART1 :INT_RXD1,INT_TXD1,INT_ERR1 INT_UART2 :INT_RXD2,INT_TXD2,INT_ERR2 INT_ADC :INT_ADC_S, INT_TC INT_CAM :INT_CAM_C, INT_CAM_P INT_WDT_AC97 :INT_WDT, INT_AC97 对于第三种情况EIN4~EINT 7和EINT8~EINT23这几个外部中断,在INTPND中的标示为EINT4_7 和EINT8_23 映射关系如下 EINT4_7 :EIN4~EINT7 EINT8_23 :EINT8~EINT23 故而光是参考INTPND寄存器无法知道具体发生的中断,这是还需要参考EINTPEND寄存器,这个寄存器中标示了具体发生的中断 这里插放中断流程图 使用中断的步骤: (1)设置好中断模式和快速中断模式下的栈 (2)准备好中断处理函数,即设置中断向量表,中断向量地址0x00000018 _start: b start_code ldr pc, _undefined_instruction ldr pc, _software_interrupt ldr pc, _prefetch_abort ldr pc, _data_abort ldr pc, _not_used ldr pc, _irq ldr pc, _fiq 然后写中断服务程序,即判断是哪个中断发生,采取什么样的措施 最后清除中断,清除中断位置可以在中断服务程序前,也可以在其后,清中断是从源头开始,例如从SUBSRPND,到SRCPND到INTPND 注意:SRCPND和INTPND之间的关系,他俩都是中断的汇总,相应位标志的中断一样,INTPND经由SRCPND屏蔽和优先级而来,INTPND同一时刻只能 标示一种中断,因为同一时刻只能相应一个中断,而SRCPND可能标示了多个中断,这表明有多个中断同时发生了,不过要经过屏蔽和优先级确定 响应哪个中断。在前面说过有三类中断,这里的屏蔽主要屏蔽第二类中断,因为第一类和第三类中断在进入SRCPND标示之前已经被屏蔽了 (3)进入、退出中断模式或快速中断模式时,需要保存、恢复中断程序的运行环境 对于IRQ代码如下 sub lr ,lr ,#4 stmdb sb!,{r0-r12,lr} ...... ldmid sp!,{r0-r12,pc}^ (4)根据具体中断,设置相关外设。比如设置触发条件,设置引脚功能(中断),设置自己的屏蔽寄存器 (5)对于第一类和第三类中断,设置屏蔽寄存器 (6)设置主屏蔽寄存器INTMASK (7)启动中断功能,即设置CPSR寄存器 在UBOOT的第一阶段代码中对中断的处理如下 (1)关闭中断使能 mrs r0, cpsr bic r0, r0, #0x1f orr r0, r0, #0xd3 msr cpsr, r0 (2)屏蔽所有中断 # define INTMSK 0x14400008 mov r1, #0xffffffff ldr r0, =INTMSK str r1, [r0]