- 相关推荐
中断寄存器
一.
S3C2440A 中的中断控制器接受来自60 个中断源的请求。
提供这些第一文库网中断源的是内部外设,如DMA 控制器、UART、IIC 等等。在这些中断源中,UARTn、AC97 和EINTn 中断对于中断控制器而言是“或”关系。
当从内部外设和外部中断请求引脚收到多个中断请求时,中断控制器在仲裁步骤后请求ARM920T 内核的FIQ或IRQ。仲裁步骤由硬件优先级逻辑决定并且写入结果到帮助用户通告是各种中断源中的哪个中断发生了的中断挂起寄存器中
二.中断控制器操作
用来选择FIQ或IRQ
程序状态寄存器(PSR)的F 位和I 位
如果ARM920T CPU 中的PSR 的F 位被置位为1,CPU 不会接受来自中断控制器的快中断请求(FIQ)。同样的如果PSR 的I 位被置位为1,CPU 不会接受来自中断控制器的中断请求(IRQ)。因此,中断控制器可以通过清除PSR 的F 位和I 位为0 并且设置INTMSK 的相应位为0 来接收中断。
.中断控制器特殊寄存器
此处中断控制器中有5 个控制寄存器:源挂起寄存器、中断模式寄存器、屏蔽寄存器、优先级寄存器和中断挂
起寄存器。
所有来自中断源的中断请求首先被记录到源挂起寄存器中。基于中断模式寄存器,它们被分配到2 个组中,包
括快中断请求(FIQ)和中断请求(IRQ)。IRQ 的多仲裁过程是基于优先级寄存器。
三.中断挂起寄存器
S3C2440A 有两个中断挂起寄存器:源挂起寄存器(SRCPND)和中断挂起寄存器(INTPND)。这些挂起寄存器表明一个中断请求是否为挂起。
当中断源请求中断服务,SRCPND 寄存器的相应位被置位为1,并且同时在仲裁步骤后INTPND 寄存器仅有1 位自动置位为1。如果屏蔽了中断,则SRCPND 寄存器的相应位被置位为1。这
并不会引起INTPND 寄存器的位的改变。
当INTPND 寄存器的挂起位为置位,每当I 标志或F 标志被清除为0 中断服务程序将开始。
SRCPND 和INTPND 寄存器可以被读取和写入,因此服务程序必须首先通过写1 到SRCPND寄存器的相应位来清除挂起状态并且通过相同方法来清除INTPND 寄存器中挂起状态。
四.中断屏蔽寄存器
此寄存器表明如果中断相应的屏蔽位被置位为1 则禁止该中断。如果某个INTMSK 的中断屏蔽位为0,将正常服务中断。如果INTMSK 的中断屏蔽位为1 并且产生了中断,将置位源挂起位。
源挂起(SRCPND)寄存器
SRCPND 寄存器由32 位组成,其每一位都涉及一个中断源。如果中断源产生了中断则相应的位被设置为1 并且等待中断服务。因此此寄存器指示出是哪个中断源正在等待请求服务。注意SRCPND 寄存器的每一位都是由中断源自动置位,其不顾INTMASK 寄存器中的屏蔽位。另外SRCPND 寄存器不受中断控制器的优先级逻辑的影响。在指定中断源的中断服务程序中,必须通过清除SRCPND 寄存器的相应位来正确的获得来自相同源的中断请求。如果从ISR 中返回并且未清除相应位,则中断控制器的操作就好像其它中断请求已经从同一个源进入了。换句话说,如果SRCPND 寄存器的指定位被设置为1,其通常被认作一个有效中断请求正在等待服务。清除相应位的时间依赖于用户的需要。如果希望收到来自相同源的其它有效请求,则应该首先清除相应位
并且接着使能中断。
可以通过写入一个数据到此寄存器来清除SRCPND 寄存器的指定位。其只清除那些数据中被设置为1 的相应位置的SRCPND 位。那些数据中被设置为0 的相应位置的位保持不变。
中断模式(INTMOD)寄存器
此寄存器由32 位组成,其每一位都都涉及一个中断源。如果某个指定位被设置为1,则在FIQ(快中断)模式
中处理相应中断。否则则在IRQ 模式中处理。特别注意,只能有一个中断设置为快速中断模式。
中断屏蔽(INTMSK)寄存器
此寄存器由32 位组成,其每一位都涉及一个中断源。如果某个指定为被设置为1,则CPU 不会去服务来自
相应中断源(请注意即使在这种情况中,SRCPND 寄存器的相应位也设置为1)的中断请求。如果屏蔽位为0,则可以服务中断请求。
中断挂起(INTPND)寄存器
中断挂起寄存器中32 位的每一位都表明了是否相应未屏蔽并且正在等待中断服务的中断请求具有最高的优先
级。当INTPND 寄存器在优先级逻辑后被定位了,只有1 位可以设置为1 并且产生中断请求IRQ 给CPU。IRQ 的
中断服务程序中可以读取此寄存器来决定服务32 个中断源的哪个源。
就如SRCPND 寄存器,必须在中断服务程序中清除了SRCPND 寄存器后清除此寄存器。可以通过写入数据
到此寄存器中来清除INTPND 寄存器的指定位。只会清除数据中设置为1 的相应INTPND 寄存器位的位置。数据
中设置为0 的相应位的位置则保持不变。特别注意:在清除源挂起寄存器和中断挂起寄存器时,是向寄存器中的相应位写1,不是写0,这是由寄存器的硬件结构决定的。
次级源挂起(SUBSRCPND)寄存器
可以通过写入数据到此寄存器来清除SUBSRCPND 寄存器的指定位。只有数据中那些被设置为1 的相应
SUBSRCPND 寄存器的位的位置才能被清除。数据中那些被设置为0 的相应位的位置则保
持不变。
中断次级屏蔽(INTSUBMSK)寄存器
此寄存器有11 位,其每一位都与一个中断源相联系。如果某个指定位被设置为1,则相应中断源的中断请求
不会被CPU 所服务(请注意即使在这种情况中,SRCPND 寄存器的相应位也设置为1)。如果屏蔽位为0,则可以
服务中断请求。
还有就是清除中断时有子中断的要先清除子中断位,再清除中断位,有子中断的要设置子中断屏蔽寄存器打开子中断。
中断顺序
1.设置好中断模式以及相关的栈,可看三星提供的初始化文件。
2.在异常向量表设置好相应的跳转指令。那么当产生中断的时候,PC指针就会跳到该向量表处,那么就会执行跳转指令到相应的服务程序入口。
3.在设置异常模式下CPU模式和相关的栈之后(三星的初始化文件),就可以用跳转指令,跳到我们的C语言部分。
4.在C语言部分,就可以写我们的程序啦:
中断——>次级中断源挂起寄存器——>*中断次级屏蔽寄存器——>源挂起寄存器——>*中断屏蔽寄存器——>*中断模式控制寄存器——>*(1)优先级寄存器——>中断挂起寄存器——>IRQ
参考:
书籍:S3C2440手册