微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > S3C2440中断体系结构

S3C2440中断体系结构

时间:11-13 来源:互联网 点击:

断IRQ,可能同时有几个中断被触发,未被INTMSK寄存器屏蔽的中断经过比较后,选出优先级最高的中断,此中断在INTPND寄存器中的 相应位被置1,然后CPU进入中断模式进行处理。中断服务程序通过读取INTPND或者INTOFFSET来确定中断源

三、中断控制寄存器

1)SUBSRCPND寄存器

它用来表示INT_RXD0、INT_TXD0等中断是否发生,每位对应一个中断,当这些中断发生并且没有被INTSUBMSK寄存器屏蔽,则它们中的若干位将汇集出现在SRCPND寄存器的某一位上。要清除中断,往此寄存器中某位写1

2)INTSUBMSK寄存器

它用来屏蔽SUBSRCPND寄存器所标识的中断,INTSUBMSK寄存器中某位设置1时,对应的中断被屏蔽

3)SRCPND寄存器

它每一位被用来表示一个或一类中断是否发生,要清除某一位,往此位写1,具体参考数据手册

4)INTMSK寄存器

用来屏蔽SRCPND寄存器所标识的中断。INTMSK寄存器中某位被设为1时,对应的中断被屏蔽,它只能屏蔽IRQ中断,不能屏蔽FIQ

5)INTMOD寄存器

它某位被设为1时,对应的中断被设为FIQ,同一时间,INTMOD只能有一位被设为1

6)PRIORITY寄存器

当有多个IRQ同时发生时,中断控制器选出最高优先级的中断,首先处理它。中断优先级通过7个仲裁器来完成,结构图如下所示:

每个仲裁器基于一个位仲裁器模式控制(ARB_MODE)和选择控制信号(ARB_SEL)的两位来处理 6个中断请求。

如果ARB_SEL位是 00b,优先级是REQ0,REQ1,REQ2,REQ3,REQ4,和REQ5.

如果ARB_SEL位是 01b,优先级是REQ0,REQ2,REQ3,REQ4,REQ1,和REQ5.

如果ARB_SEL位是 10b,优先级是REQ0,REQ3,REQ4,REQ1,REQ2,和REQ5.

如果ARB_SEL位是 11b,优先级是REQ0,REQ4,REQ1,REQ2,REQ3,和REQ5.

注 意仲裁器的 REQ0 总是有最高优先级,REQ5 总是有最低优先级。此外通过改变ARB_SEL 位,我们可以翻转 REQ1 到 REQ4 的优先级。如果ARB_MODE位置0,ARB_SEL位不会自动改变,使得仲裁器在一个固定优先级的模式下操作(注意在此模式下,我们通过手工改变 ARB_SEL 位来配置优先级)。另外,如果 ARB_MODE 位是 1,ARB_SEL 位以翻转的方式改变。例如如果 REQ1 被服务,则ARB_SEL位自动的变为01b,把REQ1放到最低的优先级。ARB_SEL变化的详细规则如下:

如果REQ0 或REQ5 被服务,ARB_SEL位完全不会变化。

如果REQ1 被服务,ARB_SEL位变为 01b。

如果REQ2 被服务,ARB_SEL位变为 10b。

如果REQ3 被服务,ARB_SEL位变为 11b。

如果REQ4 被服务,ARB_SEL位变为 00b。

7)INTPND寄存器

经过中断优先级选出优先级最高的中断后,这个中断在INTPND寄存器中的相应位被置1,随后CPU进入中断模式处理它

同一时间,此寄存器只有一位被置1,在ISR中,可以根据这个位确定是哪个中断,清除中断时,往此位写入1

8)INTOFFSET寄存器

用来表示INTPND寄存器中哪位被置1了,即INTPND寄存器中位[x]为1时,INTOFFSET寄存器的值为x(x为0-31)

清除SRCPND、INTPND寄存器时,INTOFFSET寄存器被自动清除

四、中断控制器操作实例:外部中断

开发板上,K1-K4四个按键所接的CPU引脚可以设为外部中断,本程序的功能是,当按下某个按键时,CPU调用中断服务程序点亮对应的LED

@******************************************************************************

@ File:head.S

@ 功能:初始化,设置中断模式、系统模式的栈,设置好中断处理函数

@******************************************************************************

.extern main

.text

.global _start

_start:

@******************************************************************************

@ 中断向量,本程序中,除Reset和HandleIRQ外,其它异常都没有使用

@******************************************************************************

b Reset

@ 0x04: 未定义指令中止模式的向量地址

HandleUndef:

b HandleUndef

@ 0x08: 管理模式的向量地址,通过SWI指令进入此模式

HandleSWI:

b HandleSWI

@ 0x0c: 指令预取终止导致的异常的向量地址

HandlePrefetchAbort:

b HandlePrefetchAbort

@ 0x10: 数据访问终止导致的异常的向量地址

HandleDataAbort:

b HandleDataAbort

@ 0x14: 保留

HandleNotUsed:

b HandleNotUsed

@ 0x18: 中断模式的向量地址

b HandleIRQ

@ 0x1c: 快中断模式的向量地址

HandleFIQ:

b HandleFIQ

Reset:

ldr sp, =4096 @ 设置栈指针,以下都是C函数,调用前需要设好栈

bl disable_watch_dog @ 关闭WATCHDOG,否则CPU会不断重启

msr cpsr_c, #

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top