S3C2440中断控制系统

发布者:SparklingSoul最新更新时间:2024-06-11 来源: elecfans关键字:S3C2440  中断控制系统  中断源 手机看文章 扫描二维码
随时随地手机看文章

1.1  S3C2440系统中断

CPU和外设构成了计算机系统,CPU和外设之间通过总线进行连接,用于数据通信和控制,CPU管理监视计算机系统中所有硬件,通常以两种方式来对硬件进行管理监视:

l 查询方式:CPU不停的去查询每一个硬件的当前状态,根据硬件的状态决定处理与否。好比是工厂里的检查员,不停的检查各个岗位工作状态,发现情况及时处理。这种方式实现起来简单,通常用在只有少量外设硬件的系统中,如果一个计算机系统中有很多硬件,这种方式无疑是耗时,低效的,同时还大量占用CPU资源,并且对多任务系统反应迟钝。

l 中断方式:当某个硬件产生需要CPU处理的事件时,主动通过一根信号线“告知”CPU,同时设置某个寄存器里对应的位,CPU一旦发现这根信号线上的电平有变化,就会中断当前程序,然后去处理发出该中断请求。这就像是医院重危病房,病房每张病床床头有一个应急按钮,该按钮连接到病房监控室里控制台一盏指示灯,只要该张病床出现紧急情况病人按下按钮,病房监控室里电铃会响起,通知医护人员有紧急情况,医护人员这时查看控制台上的指示灯,找出具体病房,病床号,直接过去处理紧急情况。中断处理方式相对查询方式要复杂的多,并且需要硬件的支持,但是它处理的实时性更高,嵌入式系统里基本上都使用这种方式来处理。

系统中断是嵌入式硬件实时地处理内部或外部事件的一种机制。对于不同CPU而言,中断的处理只是细节不同,大体处理流程都一样,S3C2440A的中断控制器结构如下图所示:

 

图3-3 S3C2440中断控制器

中断请求由硬件产生,根据中断源类型分别将中断信号送到SUBSRCPND(SubSourcePending)和SRCPND(SourcePending)寄存器,SUBSRCPND是子中断源暂存寄存器,用来保存子中断源信号,SRCPND是中断源暂存寄存器,用来保存中断源信号。中断信号可通过编程方式屏蔽掉,SUBMASK是子中断源屏蔽寄存器,可以屏蔽指定的子中断信号, MASK功能同SUBMASK用来屏蔽中断源信号。中断分为两种模式:一般中断的和快速中断,MODE是中断模式判断寄存器,用来判断当前中断是否为快速中断,如果为快速中断直接将快速中断信号送给ARM内核,如果不是快速中断,还要将中断信号进行仲裁选择。S3C2440A支持多达60种中断,很有可能多个硬件同时产生中断请求,这时要求中断控制器做出裁决,Priority是中断源优先级仲裁选择器,当多个中断产生时,选择出优先级最高的中断源进行处理,INTPND是中断源结果寄存器,里面存放优先级仲裁出的唯一中断源。


1 中断的产生-中断源

S3C2440A支持60种中断源,基本上满足了开发板内部,外部设备等对中断的需求。其中每一个中断源对应寄存器中的一位,显然要支持60种中断至少需要二个32位寄存器,SUBSRCPND和SRCPND分别保存中断源信号。S3C2440A对60种中断源的管理是按层级分的。如图3-4所示:

 

图3-4中断源信号复合示意图

S3C2440A将中断源分为两级:中断源和子中断源,中断源里包含单一中断源和复合中断源,复合中断源是子中断源的复合信号。如实时时钟中断,该硬件只会产生一种中断,它是单一中断源,直接将其中断信号线连接到中断源寄存器上。对于复合中断源,以UART串口为例进行说明,S3C2440A可以支持3个UART串口,每个串口对应一个复合中断源信号INT_UARTn,每个串口可以产生三种中断,也就是三个子中断:接收数据中断INT_RXDn,发送数据中断INT_TXDn,数据错误中断INT_ERRn,这三个子中断信号在中断源寄存器复合为一个中断信号,三种中断任何一个产生都会将中断信号传递给对应的中断源INT_UARTn,然后通过中断信号线传递给ARM内核。

 

图3-5UART串口中断源信号复合示意图

总中断源详下面表中列出了S3C2440A部分中断源,它分别对应中断源寄存器里某个位:详细中断源请查看S3C2440A硬件手册。

表3-5部分中断源信号

中断源

描述

优先级仲裁分组

INT_ADC

数模转换和触摸屏中断

ARB5

INT_RTC

实时时钟中断

ARB5

INT_UART0

UART0中断(包含子中断)

ARB5

INT_NFCON

NandFlash控制中断

ARB4

INT_WDT_AC97

看门狗中断

ARB1

EINT8-23

外部中断8~23(包含外部子中断)

ARB1

EINT4-7

外部中断4~7(包含外部子中断)

ARB1

EINT3

外部中断3

ARB0

EINT2

外部中断2

ARB0

EINT1

外部中断1

ARB0

EINT 0

外部中断0

ARB0

中断信号除上述分法之外,还可以按照硬件位置分为:外部中断源和内部中断源。

l 内部中断源:它是嵌入式系统中常见硬件产生的中断信号,比如:UART串口中断源,时钟Timer中断源,看门狗中断源等

l 外部中断源:有时嵌入式系统里要在外部接口上挂载一些外部设备,这些设备并不是一个通用嵌入式系统里必备硬件,比如:蓝牙模块,各种传感器,WIFI无线通信模块,这些硬件也要产生中断让CPU来处理数据,因此这些外设硬件通过中断信号线连接到中断控制器上,它们产生的中断叫做外部中断信号。它们有着和内部中断一样的处理机制,只不过,它没有一个固定的中断号与之对应,硬件与嵌入式系统的连接方式与中断处理完全由系统硬件与软件设计者实现。

外设硬件通过输入输出接口I/O Ports挂接到嵌入式系统上,I/O Ports向外设提供外部中断信号线,输出电源,频率时钟和输入输出信号线,外部硬件根据自己需要连接到I/O Ports上,产生中断时向外部中断信号线上送出中断信号,通过外部中断信号线传递到中断控制器。

按键Key可以认为最为简单的一种硬件设备了,如下图所示:

 

图3-6按键硬件接线原理图

它功能很简单,可以将电路接通,按键K1~K6一端接地为低电平,另外一端接电源正极为高电平,EINT8,EINT11,EINT13,EINT14,EINT15,EINT19六根中断信号线分别和高电平端按键相连,当按键按下时电路接通,整个电路变成低电平,中断信号线上电压产生变化,通过设置中断触发方式,产生外部中断请求,输入到CPU内部,从而实现按键中断控制。

S3C2440A可以支持EINT0~EINT23共24种外部中断,完全可以满足小型嵌入式设备外设硬件的需求。

外部中断源也分为外部中断源和外部子中断源,其处理方式和内部中断源基本一样。

1.1.1  中断优先级

S3C2440A支持60种中断,多个硬件可能同时产生中断请求,由于CPU只能处理一个中断,中断控制器怎么选择出一个最佳的中断,交给ARM内核进行处理呢?中断控制器采用优先级仲裁比较的方式进行选择,找出优先级最高的中断源。中断控制器将60种中断源分成7组,如下图所示,它类似体育赛事里的比赛方式,所有参赛选手在小组赛PK,选择出小组赛最优秀选手,然后进入决赛阶段和其它小组最优先选择再PK,最后优胜者就是总冠军。其中ARBITER0~ARBITER5为“小组赛”阶段,中断源信号在各自小组里进行优先级仲裁,选择出最高优先级中断信号,每小组选出的中断信号送到ARBITER6,也就是决赛阶段,选择出最高优先级中断信号,交给ARM内核。

 

图3-7S3C2440优先级仲裁示意图

中断信号在7个分组里PK时的优先级是可编程的,通过PRIORITY寄存器进行优先级设置。如下表(只列出PRIORITY寄存器部分位):

表3-6中断优先级控制寄存器(PRIORITY)

寄存器名

地址

是否读写

描述

复位默认值

PRIORITY

0x4A00000C

R/W

中断优先级控制寄存器

0x7F

 

PRIORITY

描述

初始值

ARB_SEL6

[20:19]

仲裁组6优先级排序方式

00 = REQ 0-1-2-3-4-5 

01 = REQ 0-2-3-4-1-5

10 = REQ 0-3-4-1-2-5 

11 = REQ 0-4-1-2-3-5

0x00

ARB_SEL5

[18:17]

仲裁组5优先级排序

00 = REQ 1-2-3-4

01 = REQ 2-3-4-1

10 = REQ 3-4-1-2

11 = REQ 4-1-2-3

00

ARB_MODE6

[6]

仲裁组6优先级是否轮转:

0 = 不轮转,    1 = 轮转

1

ARB_MODE5

[5]

仲裁组5优先级是否轮转:

0 = 不轮转,    1 = 轮转

1

通过设置仲裁组n优先级排序方式位,设置每个仲裁组内中断信号的优先级顺序,比如:ARB_SEL5分组时包含四个中断信号:REQ1 INT_UART0, REQ2 INT_SPI1, REQ3 INT_RTC, REQ4 INT_ADC,ARB_SEL5位采用默认值:00,当INT_UART0和INT_RTC中断信号同时产生时,INT_UART0会被选出,通过可编程方式改变优先级排序方式来改变中断信号优先级。

ARB_MODE0~ ARB_MODE6为每个仲裁分组的优先级轮转设置位,采用默认值时,当前中断信号被选择处理之后,再次产生中断请求时,它的优先级自动轮转到该组最低,这样可以保证优先级低的中断信号可以被及时处理,不至于出现优先级高且中断请求频繁的中断每次都被优先处理,而优先级低的被“饿死”的情况。显然,这种方式更民主,实时性更佳。

2  中断控制器相关寄存器

(1)SUBSRCPND子中断源暂存寄存器

表3-7子中断源暂存寄存器(SUBSRCPND)

寄存器名

地址

是否读写

描述

复位默认值

SUBSRCPND

0x4A000018

R/W

子中断源暂存寄存器,保存中断请求状态:

0:没有中断请求信号

1:中断请求信号产生

0x00000000

 

SUBSRCPND

对应SRCPND

描述

初始值

Reserved

[31:15]

未使用

0

INT_AC97

INT_WDT_AC97

[14]

0 = 未产生中断 1 =产生中断

0

INT_RXD0

INT_UART0

[0]

0 = 未产生中断 1 =产生中断

0

该寄存器用来标识保存子中断源信号,当某个子中断信号产生之后,SUBSRCPND对应位被自动置1,该位会一直保持被置位,只到中断处理程序将其清除为止,需要注意一下,清除中断是通过向对应位写入1来清除,而不是写入0,写入0无效。

(2)INTSUBMSK子中断源屏蔽寄存器

表3-8子中断源屏蔽寄存器(INTSUBMSK)

寄存器名

地址

是否读写

描述

复位默认值

INTSUBMSK

0x4A00001C

R/W

子中断源信号屏蔽存寄存器,设置相应位来屏蔽中断信号:

0:未屏蔽,中断可用

1:屏蔽中断信号

0xFFFF

 

INTSUBMSK

描述

初始值

Reserved

[31:15]

未使用

0

INT_AC97

[14]

0 = 未屏蔽1 =屏蔽中断

1

INT_RXD0

[0]

0 = 未屏蔽1 =屏蔽中断

1

该寄存器用来屏蔽子中断源信号,默认值为全部子中断都被屏蔽掉,因此要想处理某个硬件中断,必须要打开中断屏蔽位,通过写入0来取消屏蔽中断。

(3)SRCPND中断源暂存寄存器

表3-9中断源暂存寄存器(SRCPND)

寄存器名

地址

是否读写

描述

复位默认值

SRCPND

0x4A000000

R/W

中断源暂存寄存器,保存中断请求状态:

0:没有中断请求信号

1:中断请求信号产生

0x00000000

 

SRCPND

描述

初始值

INT_ADC

[31]

0 = 未产生中断 1 =产生中断

0

EINT0

[0]

0 = 未产生中断 1 =产生中断

0

该寄存器用来保存中断源信号,当某个中断信号产生之后, SRCPND对应位被自动置1,该位会一直保持被置位,只到中断处理程序将其清除为止,需要注意一下,清除中断是通过向对应位写入1来清除,而不是写入0,写入0无效。


(4)INTMSK中断源屏蔽寄存器

表3-10中断源屏蔽寄存器(INTMSK)

寄存器名

地址

是否读写

描述

复位默认值

INTMSK

0x4A000008

R/W

中断源信号屏蔽存寄存器,设置相应位来屏蔽中断信号:

0:未屏蔽,中断可用

1:屏蔽中断信号

0xFFFFFFFF

 

INTMSK

描述

初始值

INT_ADC

[31]

0 = 未屏蔽1 =屏蔽中断

1

EINT0

[0]

0 = 未屏蔽1 =屏蔽中断

1

该寄存器用来屏蔽中断源信号,默认值为全部中断都被屏蔽掉,因此要想处理某个硬件中断,必须要打开中断屏蔽位,通过写入0来取消屏蔽中断。

(5)INTPND最高优先级中断暂存寄存器

表3-11最高优先级中断暂存寄存器(INTPND)

寄存器名

地址

是否读写

描述

复位默认值

INTPND

0x4A000010

R/W

最高优先级中断暂存寄存器里面保存有经过优先级仲裁的结果:

0:没有中断请求信号

1:中断请求信号产生

0x00000000

 

INTPND

描述

初始值

INT_ADC

[31]

0 = 未产生中断 1 =产生中断

0

EINT0

[0]

0 = 未产生中断 1 =产生中断

0

该寄存器保存了经过优先级仲裁出的中断信号位,它是所有当前中断请求里优先级别最高的中断,因此该寄存器里的值最多有一位被置1,通常中断处理程序中会通过读取该寄存器的值来获得当前正在处理的中断请求。中断处理完成之后,通过写入1来清除中断。

(6)INTOFFSET中断号偏移量寄存器

表3-12中断号偏移量寄存器(INTOFFSET)

寄存器名

地址

是否读写

描述

复位默认值

INTOFFSET

0x4A000014

R

中断号偏移量寄存器,用来保存当前处理的中断号

0x0000000

该寄存器里存放的是经过优先级仲裁出的中断信号对应的中断号,是一个0~31之间的整数,其实它就是INTPND里对应的位号,比如:INT_UART0产生了中断,INTPND里第28位置1,INTOFFSET里保存的整数就是28,多出来这个寄存器的目的主要是方便中断处理程序查询中断源,清除中断源:

#define TIMER0_IRQ_OFT      10               // 时钟0定时中断

#define EINT0_IRQ_OFT      0                  // 开发板K1按键1对应外部中断EINT0

void handle_irq()

{

   unsigned long irqOffSet = INTOFFSET;   // 取得中断号

   switch(irqOffSet)

   {

                 case TIMER0_IRQ_OFT:              // 当前中断为定时器0中断

                   do_timer();                            // 跳入定时器0处理程序

                       break;

                 case EINT0_IRQ_OFT:                 // 当前中断为K1按键触发

                      do_key1_pressed();              // 处理K1按下事件

                       break;

   }

   

   SRCPND &= (1<   INTPND = INTPND;                             // 清除最高优先级中断暂存寄存器中断

}

 

(7)INTMOD中断模式寄存器

表3-13中断模式寄存器(INTMOD)

寄存器名

地址

是否读写

描述

复位默认值

INTMOD

0x4A000004

R/W

中断模式寄存器,指定对应中断模式:

0 = IRQ一般中断模式

1 = FIQ快速中断模式

0x0000000

 

INTMOD

描述

初始值

INT_ADC

[31]

0 = IRQ 1 = FIQ

0

EINT0

[0]

0 = IRQ 1 = FIQ

0

通过设置ARM内核产生中断。需要注意的是,快速中断不存在优先级仲裁,只能有一位被设置为FIQ模式。


关键字:S3C2440  中断控制系统  中断源 引用地址:S3C2440中断控制系统

上一篇:S3C2440上RTC时钟驱动
下一篇:ARM Linux S3C2440 之中断分析

推荐阅读最新更新时间:2026-03-22 10:29

80c51是几位单片机 80c51单片机有几个中断
  80c51是几位单片机   80C51是一种8位微处理器,也被称为8051,由Intel公司推出。它是最早的商用单片机之一,由于它的简单易用、灵活可靠,被广泛应用于许多嵌入式系统中。在80C51系列中,最常见的型号包括AT89C51和AT89S52等。   80c51单片机寻址范围有多少   80C51单片机的寻址范围取决于其具体的型号和存储器结构。在最常见的AT89C51和AT89S52型号中,其寻址范围如下:   内部RAM寻址范围:0x00-0x7F(128字节)   内部ROM寻址范围:0x0000-0xFFFF(64KB)   特殊功能寄存器(SFR)寻址范围:0x80-0xFF(128字节)   外部扩展RAM
[单片机]
AT89S51单片机扩充外部中断系统的设计
AT89S51为用户提供两个外部中断请求输入端INT0(的反)和INT1(的反),实际的应用系统中,两个外部中断请求源往往不够用,需对外部中断源进行扩充。下面介绍一种扩充外部中断源的方法。 如下图所示,若系统中有5个外部中断请求源IR0~IR4,它们均为高电平请求有效,这时可按中断请求的轻重缓急进行排队,把其中最高级别的中断请求源IR0直接接到AT89S51的一个外部中断请求源IR0输入端INT0,其余的4个中断请求源IR1~IR4按下图所示的方法通过各自的OC门(集电极开路门)连到AT89S51的另一个外中断源输入端INT1,同时还连到P1口的P1.0~P1.3脚,供AT89S51查询。各外部中断请求源的中断请求由外部设备的
[单片机]
AT89S51单片机扩充外部<font color='red'>中断</font><font color='red'>源</font>系统的设计
STM32中断位置
在...CMSISDeviceSTSTM32F10x中的stm32f10x.h, 然后在结构体IRQn_Type找到对应单片机型号的代码片段。 比如STM32F103C8T6属于STM32F10X_MD, 那对应的中断源为: 再比如STM32F103ZET6对应的是STM32F10X_HD
[单片机]
STM32<font color='red'>中断</font><font color='red'>源</font>位置
外部震荡中断的计时实验
简介:cd4060和2.048M晶体构成的方波震荡源用500Hz的输出连到ATmega16的PD3 ,INT1中断500次是1秒构成计时基准。 PA0-PA7 连到八段数码管的a-p ,PC0-PC5 分别连六个数码管的共阴极 c程序: /***************************************************** This program was produced by the CodeWizardAVR V2.05.5a Evaluation Date : 2011/12/14 Author : Freeware, for evaluation and non-commercial use
[单片机]
ARM中断之定时器中断
实时时钟请求中断。在控制中遇到定时检测和控制,为此常采用一个外部时钟电路(可编程)控制其时间间隔。需要定时时,CPU发出命令使时钟电路开始工作,一旦到达规定时间,时钟电路发出中断请求,由CPU转去完成检测和控制工作。 走到这里,大家肯定对Linux的中断处理有概念了,下面我们通过一个具体的实例,来了解Linux内核处理中断的全过程,那就是定时器中断。在详细分析这个过程之前,我们把Linux时间管理的概念先缕一缕。 在当前的80x86体系结构上,内核显式地与几种时钟和定时器电路打交道,其主要分为了时钟和定时器两大类: - 时钟电路同时用于跟踪当前时间和产生精确的时间度量。 - 定时器电路由内核编程,所以它们以固定的、
[单片机]
STM32 关于外部中断线、中断中断服务函数的问题
中断线问题: 上图可以看出,PA0、PB0...PG0共用的EXTI0中断线,PA1、PB2...PG1共用的EXTI1中断线,也就是 编程里面的(如下图库文件),对应16个中断线,后面三个是专用的中断线,不做讨论。 有人要问,假设:我设置的引脚是PB9和PE9都开启外部中断怎么办?小编告诉你,这还真办不了,我实测过。配置函数的时候后覆盖之前的函数的(如下图所示) 如果这样配置的话,会出现出货光电1的初始化覆盖掉编码盘的初始化,说白了就是编码盘的设置被覆盖掉了,结果是外部中断 出货光电1管脚会触发而编码盘就不起作用了,这也是STM32其中一个问题所在吧! 反过来,结果是外部中断 编码盘 管脚会触发
[单片机]
STM32 关于外部<font color='red'>中断</font>线、<font color='red'>中断</font><font color='red'>源</font>和<font color='red'>中断</font>服务函数的问题
ATmega16L 的中断及在GCC中的中断
ATmega16L 的中断源及在GCC中的中断名 中断源 中断定义 在GCC中的中断名SIG_NAME RESET 复位中断   INT0 外部中断请求0 SIG_INTERRUPT0 INT1 外部中断请求1 SIG_INTERRUPT1 TIMER2 COMP 定时/计时器 2 比较匹配 SIG_OUTPUT_COMPARE2 TIMER2 OVF 定时/计时器 2 溢出 SIG_OVERFLOW2 TIMER1 COMPA 定时/计时器 1 比较匹配 A S
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved