微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM系统中断产生流程

ARM系统中断产生流程

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

中断源按照硬件位置分为外部中断源和内部中断源,外部中断源和内部中断源又包含子外部中断源和子内部中断源,如上图所示(画了一整天)。
1.子内部中断源的产生
以UART0接收数据产生INT_RXD0中断为例,INT_RXD0产生后进入SUBSRCPND子中断源暂存寄存器,设置INT_RXD0对应的中断位,中断信号经过INTSUBMSK子中断屏蔽寄存器,如果INT_RXD0信号对应位没有被置位(屏蔽掉),中断信号继续向前传递,经过子内部中断源聚合器,将INT_RXD0聚合成对应的中断源信号INT_UART0,设置SRCPND中断源暂存寄存器里INT_UART0位,经过INTMSK中断屏蔽寄存器,如果INT_UART0信号没有被屏蔽掉,中断信号进入INTMOD中断模式寄存器判断是否为快速中断,如果被编程为快速中断,直接打断ARM内核,进入中断处理,如果中断信号为一般中断,进入中断优先级仲裁器进入优先级仲裁,如果INT_UART0信号为最高优先级或只有INT_UART0中断信号产生,则该中断信号被记录到INTPND最高优先级中断暂存寄存器,同时设置INTOFFSET的值为中断号28,最终将中断信号打断ARM内核进行中断处理。如果同时产生多个中断且INT_UART0不是最高优先级,则该中断信号不会被处理,等最高优先级信号处理完后,再次进行优先级仲裁,也就是说中断信号不消失,一直保存在SRCPND里,只到被处理为止。
2.内部中断源的产生
该过程在子内部中断处理过程中已经包含,中断信号产生后直接进入SRCPND里,然后经历上述子内部中断后期处理过程。
3.子外部中断的产生
外部中断源共有24个,其中EINT0~EINT3为外部中断源,EINT4_7,EINT8_23为复合中断源,他们包含有子外部中断源。
由于外部硬件直接挂接到I/O Ports(详见S3C2440A硬件手册第9章)上的,我们要想让外设硬件中断得到处理,要先从EINT0~EINT23里选择中断信号,我们以EINT11为例,介绍子外部中断处理过程。
通常CPU内部引出引脚都是复用的,也就是说一根CPU引脚可以有多种功能,可以设置其为输入信号线,输出信号线或中断信号线,要想让硬件产生中断,首先要对可以产生中断的引脚进行编程,设置该引脚为中断信号线。EINT11中断信号对应CPU引脚为GPG3,通过设置GPGCON[7:6] = 0b10,可以设置该引脚为中断信号线。
表3-14 GPGCON寄存器


设置了CPU管脚为中断信号线之后,还要通过设置EXTINT0寄存器来指定中断信号的触发方式:高电平触发,低电平触发,电平上升沿,下除沿,双沿触发。


图3-9电平信号触发示意图
由于按键按下时让它产生中断,也就是从高电平变为低电平时产生(上节按键中断原理),因此我们设置EINT11中断信号的触发方式为下降沿触发,EXTINT1[14:12] = 0b01x
表3-15 EXTINT1寄存器


设置完触发方式之后,当外设中断信号线上的电平达到触发条件时,通过外部中断产生器产生中断信号,然后将子外部中断暂存寄存器EINTPND中对应的EINT11位置1,中断信号再进入EINTMSK子外部中断屏蔽寄存器,如果EINT11中断源信号没有被屏蔽,则EINT11中断信号进入子外部中断聚合器,复合成EINT8_23中断信号,然后再经历与前面子内部中断信号一样的处理机制。
(1)EINTPEND外部中断暂存寄存器
表3-16外部中断暂存寄存器(EINTPEND)
寄存器名地址是否读写描述复位默认值
EINTPEND0x560000A8R/W外部中断信号暂存寄存器
0:没有中断请求信号
1:中断请求信号产生
0x0000000

EINTPEND描述初始值
EINT23[23]0 =未产生中断1 =产生中断0
EINT4[4]0 =未产生中断1 =产生中断0
保留位[3:0]0000

(2)EINTMASK外部中断屏蔽寄存器
表3-17外部中断屏蔽寄存器(EINTMASK)
寄存器名地址是否读写描述复位默认值
EINTMASK0x560000A4R/W外部中断信号屏蔽寄存器
0:未屏蔽,中断可用
1:屏蔽中断信号
0x000FFFFF

EINTMASK描述初始值
EINT23[23]0 =未屏蔽1 =屏蔽中断1
EINT4[4]0 =未屏蔽1 =屏蔽中断1
保留位[3:0]1111
4.外部中断源的产生
外部中断产生过程读者可以根据上面中断图自行分析。

按键控制LED灯实验



本实验分三个版本,分别针对三种开发板:友善之臂QQ2440,友善之臂MINI2440,天嵌TQ2440。每种开发板对应工程在:“sys_irq_开发板名”目录下。下面实验内容为针对MINI2440开发板。
head.s:
主要实现安装异常向量表,处理复位异常,初始化必要硬件,中断入口处理等功能。

;**********************************************************************
;系统中断实验(MINI2440)
;**********************************************************************
GPBCONEQU0x56000010
GPBDATEQU0x56000014
EXPORT SYS_IRQ
AREASYS_IRQ,CODE,READONLY
ENTRY
;**********************************************************************
;设置中断向量,除Reset和HandleIRQ外,其它异常都没有使用(如果不幸发生了,
;将导致死机)
;**********************************************************************
; 0x00:复位Reset异常
bReset

; 0x04:未定义异常(未处理)
HandleUndef
bHandleUndef

; 0x08:软件中断异常(未处理)
HandleSWI
bHandleSWI

; 0x0c:指令预取异常(未处理)
HandlePrefetchAbt
bHandlePrefetchAbt

; 0x10:数据访问中止异常(未处理)
HandleDataAbt
bHandleDataAbt

; 0x14:未使用异常(未处理)
HandleNotUsed
bHandleNotUsed

; 0x18:一般中断异常,跳往HandleIRQ
bHandleIRQ

; 0x1c:快速中断异常(未处理)
HandleFIQ
bHandleFIQ

Reset;复位异常处理入口
;关闭看门狗
ldrr0, = 0x53000000
movr1, #0
strr1, [r0]

blinitmem

ldrsp,=0x32000000;设置管理模式栈指针

IMPORT

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

网站地图

Top