S3C2440外部中断详解

发布者:SparklingRiver最新更新时间:2016-10-08 来源: eefocus关键字:S3C2440  外部中断 手机看文章 扫描二维码
随时随地手机看文章
    要想正确地执行2440的外部中断,一般需要完成两个部分内容:中断初始化和中断处理函数。
    在具体执行中断之前,要初始化好要用的中断。2440的外部中断引脚EINT与通用IO引脚F和G复用,要想使用中断功能,就要把相应的引脚配置成中断模式,如我们想把端口F0设置成外部中断,而其他引脚功能不变,则GPFCON=(GPFCON & ~0x3) | 0x2。配置完引脚后,还需要配置具体的中断功能。我们要打开某一中断的屏蔽,这样才能响应该中断,相对应的寄存器为INTMSK;还要设置外部中断的触发方式,如低电平、高电平、上升沿、下降沿等,相对应的寄存器为EXTINTn。另外由于EINT4到EINT7共用一个中断向量,EINT8到EINT23也共用一个中断向量,而INTMSK只负责总的中断向量的屏蔽,要具体打开某一具体的中断屏蔽,还需要设置EINTMASK。上面介绍的是最基本的初始化,当然还有一些其他的配置,如当需要用到快速中断时,要使用INTMOD,当需要配置中断优先级时,要使用PRIORITY等。
    中断处理函数负责执行具体的中断指令,除此以外还需要把SRCPND和INTPND中的相应的位清零(通过置1来清零),因为当中断发生时,2440会自动把这两个寄存器中相对应的位置1,以表示某一中断发生,如果不在中断处理函数内把它们清零,系统会一直执行该中断函数。另外还是由于前面介绍过的,有一些中断是共用一个中断向量的,而一个中断向量只能有一个中断执行函数,因此具体是哪个外部中断,还需要EINTPEND来判断,并同样还要通过置1的方式把相应的位清零。一般来说,使用__irq这个关键词来定义中断处理函数,这样系统会为我们自动保存一些必要的变量,并能够在中断处理函数执行完后正确地返回。还需要注意的是,中断处理函数不能有返回值,也不能传递任何参数。
    为了把这个中断处理函数与在2440启动文件中定义的中断向量表相对应上,需要先定义中断入口地址变量,该中断入口地址必须与中断向量表中的地址一致,然后把该中断处理函数的首地址传递给该变量,即中断入口地址。
    下面就是一个外部中断的实例。开发板上一共有四个按键,分别连到了EINT0,EINT1,EINT2和EINT4,我们让这四个按键分别控制连接在B5~B8引脚上的四个LED:按一下键则LED亮,再按一下则灭:
#define _ISR_STARTADDRESS 0x33ffff00
#define U32 unsigned int
#define pISR_EINT0            (*(unsigned *)(_ISR_STARTADDRESS+0x20))
#define pISR_EINT1            (*(unsigned *)(_ISR_STARTADDRESS+0x24))
#define pISR_EINT2            (*(unsigned *)(_ISR_STARTADDRESS+0x28))
#define pISR_EINT4_7  (*(unsigned *)(_ISR_STARTADDRESS+0x30))
#define rSRCPND     (*(volatile unsigned *)0x4a000000)      //Interrupt request status
#define rINTMSK     (*(volatile unsigned *)0x4a000008)       //Interrupt mask control
#define rINTPND     (*(volatile unsigned *)0x4a000010)       //Interrupt request status
#define rGPBCON    (*(volatile unsigned *)0x56000010) //Port B control
#define rGPBDAT    (*(volatile unsigned *)0x56000014) //Port B data
#define rGPBUP     (*(volatile unsigned *)0x56000018)  //Pull-up control B
#define rGPFCON    (*(volatile unsigned *)0x56000050) //Port F control
#define rEXTINT0   (*(volatile unsigned *)0x56000088)  //External interrupt control register 0
#define rEINTMASK  (*(volatile unsigned *)0x560000a4) //External interrupt mask
#define rEINTPEND  (*(volatile unsigned *)0x560000a8) //External interrupt pending
static void __irq Key1_ISR(void)   //EINT1
{
       int led;
       rSRCPND = rSRCPND | (0x1<<1);
       rINTPND = rINTPND | (0x1<<1);
       led = rGPBDAT & (0x1<<5);
       if (led ==0)
              rGPBDAT = rGPBDAT | (0x1<<5);
       else
              rGPBDAT = rGPBDAT & ~(0x1<<5);
}
static void __irq Key2_ISR(void)   //EINT4
{
       int led;
       rSRCPND = rSRCPND | (0x1<<4);
       rINTPND = rINTPND | (0x1<<4);
       if(rEINTPEND&(1<<4))
       {
              rEINTPEND = rEINTPEND | (0x1<<4);
              led = rGPBDAT & (0x1<<6);
              if (led ==0)
                     rGPBDAT = rGPBDAT | (0x1<<6);
              else
                     rGPBDAT = rGPBDAT & ~(0x1<<6);
       }
}
static void __irq Key3_ISR(void)   //EINT2
{
       int led;
       rSRCPND = rSRCPND | (0x1<<2);
       rINTPND = rINTPND | (0x1<<2);
       led = rGPBDAT & (0x1<<7);
       if (led ==0)
              rGPBDAT = rGPBDAT | (0x1<<7);
       else
              rGPBDAT = rGPBDAT & ~(0x1<<7);
}
void __irq Key4_ISR(void)   //EINT0
{
       int led;
       rSRCPND = rSRCPND | 0x1;
       rINTPND = rINTPND | 0x1;
       led = rGPBDAT & (0x1<<8);
       if (led ==0)
              rGPBDAT = rGPBDAT | (0x1<<8);
       else
              rGPBDAT = rGPBDAT & ~(0x1<<8);
}
void Main(void)
{
       int light;
       rGPBCON = 0x015550;
       rGPBUP = 0x7ff;
       rGPFCON = 0xaaaa;
       rSRCPND = 0x17;
       rINTMSK = ~0x17;
       rINTPND =0x17;
       rEINTPEND = (1<<4);
       rEINTMASK = ~(1<<4);
       rEXTINT0 = 0x20222;
       light = 0x0;
       rGPBDAT = ~light;
       pISR_EINT0 = (U32)Key4_ISR;
       pISR_EINT1 = (U32)Key1_ISR;
       pISR_EINT2 = (U32)Key3_ISR;
       pISR_EINT4_7 = (U32)Key2_ISR;
       while(1)
              ;     
}
/******************************************************************************************************************************************************************************************************/

1.中断分两大类:内部中断和外部中断。

2.外部中断。24个外部中断占用GPF0-GPF7(EINT0-EINT7),GPG0-GPG15(EINT8-EINT23)。用这些脚做中断输入,则必须配置引脚为中断,并且不要上拉。具体参考datesheet数据手册。

寄存器:EXTINT0-EXTINT2:三个寄存器设定EINT0-EINT23的触发方式。

              EINTFLT0-EINTFLT3:控制滤波时钟和滤波宽度。

              EINTPEND:这个是中断挂起寄存器,清除时要写1,后面还有几个是写1清除。当一个外部中断(EINT4-EINT23)发生后,那么相应的位会被置1。为什么没有EINT0-EINT3,呵呵,看看SRCPND就知道了,里面没有EINT4-EINT23的位子(SRCPND 第[3]位为EINT4-7组,第[4]位为EINT8-23组),所以有了EINTPENDx用以细化补充SRCPND。

              EINTMASK:这个简单,是屏蔽中断用的,也就是说位为1时,此次中断无效。

3.内部中断。内部中断有8个寄存器,下面逐一来看。

寄存器:SUBSRCPND:当一个中断发生后,那么相应的位会被置1,表示一个中断发生了。

              INTSUBMSK:与上一个是一伙的,中断屏蔽寄存器,具体屏蔽什么,自己看手册去吧。

              INTMOD:中断的方式。一个中断可以是普通中断,也可以是快中断,在这里设置,但只能有一个快中断。

              PRIORITY :优先级寄存器,不说了。

              SRCPND :当一个中断发生后,那么相应的位会被置1,表示一个或一类中断发生了。

              INTMSK :中断屏蔽寄存器。

              INTPND :中断发生后,SRCPND中会有位置1,可能好几个(因为同时可 能发生几个中断),这些中断会由优先级仲裁器选出一个最紧迫的,然后把INTPND中相应位置1,所以同一时间只有一位是1。也就是说前面的寄存器置1 是表示发生了,只有INTPND置1,CPU才会处理。

              INTOFFSET :用来表示INTPND中哪一位置1了,好让你查询,普通中断跳转时查询用。清除INTPND、SRCPND时自动清除。

4.各寄存器关系:

 

S3C2440外部中断详解 - 飞 - 飞的博客
 

 

下面看图说明:

5.中断过程。

a 如果是不带子中断的内部中断:发生后SRCPND相应位置1,如果没有被INTMSK屏蔽,那么等待进一步处理。

b 如果是带子中断的内部中断:发生后SUBSRCPND相应位置1,如果没有被INTSUBMSK屏蔽,那么SRCPND相应位置1,等待进一步处理,几个SUBSRCPND可能对应同一个SRCPND,对应表如下:

SRCPND                        SUBSRCPND
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

c 如果是外部中断:EINT0-EINT3发生后SRCPND相应位置1,如果没有被INTMSK屏蔽,那么等待进一步处理。EINT4-EINT23发生后EINTPEND相应位置1,如果没有被EINTMASK屏蔽,那么SRCPND相应位EINT4-7 或EINT8-23置1,如果没有被INTMSK屏蔽,等待进一步处理。几个EINTPEND对应同一个SRCPND,对应表如下:

SRCPND                        EINTPEND

EINT0                             EINT0

EINT1                             EINT1

EINT2                             EINT2

EINT3                             EINT3

EINT4-7                          EINT4 EINT5 EINT6 EINT7

EINT8-23                        EINT8 EINT9 EINT10 EINT11 ……EINT23

三种中断都等待进一步处理了。接下来从SRCPND往下看,看INTMSK。如果中断被屏蔽了,就不用说了。如果没有被屏蔽,那么会进一步到INTMOD。如果是快中断,那么直接出来,进入FIQ(即CPU进入快中断模式处理)。如果是普通中断,那么SRCPND可以有多位为置1(FIQ只能有一个),这时就会经过PRIORITY选出一个优先级高的,然后把根据选出的中断把INTPND相应位置1(注意:只能选出一个),进入IRQ,让CPU处理。

6.中断的开启。

a.如果是不带子中断的内部中断,只需设置INTMSK,让它不屏蔽中断就可以了。

b 如果是带子中断的内部中断,需设置INTSUBMSK和INTMSK,让它们不屏蔽中断就可以了。

c 如果是外部中断,对于EINT8-23需要设置EINTMASK和INTMSK。对于EINT0-EINT3只需设置INTMSK。

7.中断的清除。

a.如果是不带子中断的内部中断,只需清除SRCPND,注意清除需位置1。

b 如果是带子中断的内部中断,需清除SRCPND和SUBSRCPND,注意先清除SUBSRCPND,再清除SRCPND。因为,如果你先清除SRCPND的话,然后在清除SUBSRCPND的过程中,SRCPND会以为又有中断发生,又会置1。也就是说一次中断会响应两次。所以必须先掐断源头。

c 如果是外部中断,对于EINT8-23需要清除EINTPEND和SRCPND(同样注意顺序)。对于EINT0-EINT3只需清除SRCPND。

本文详细分析了S3C2440的中断寄存器,对arm初学者有一定的帮助。


关键字:S3C2440  外部中断 引用地址:S3C2440外部中断详解

上一篇:2440test中按键的分析
下一篇:STM32的ADC DMA USART综合学习

推荐阅读最新更新时间:2024-03-16 15:14

stm32mp1 Cortex M4开发篇4:GPIO外部中断详解
写在前面: 本文章为《ARM Cortex-M4裸机开发篇》系列中的一篇,,全系列总计14篇。笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板),Cortex-M4裸机开发篇除了讲M4裸机开发外,还会讲解通过M4控制资源扩展板上的各种传感器执行器模块(包括空气温湿度传感器、LED灯、数码管、蜂鸣器、震动马达、按键中断、风扇等),本篇是M4控制资源扩展板中的一篇。 资源扩展板是FS-MP1A开发板的扩展模块,主要包含了10余种助主流传感器、执行器件、总线控制器件,非常方便项目扩展用。可拓展开发智慧家庭、智能医疗、智能安防、工业控制、图像识别、环境检测等方向的10个左右综合项目,华清远见开发板也将配套提
[单片机]
stm32mp1 Cortex M4开发篇4:GPIO<font color='red'>外部中断</font>详解
STM32G0技术详解 _ GPIO-EXTI-系统DMA
STM32G0 的复用率是很高的,更多的引脚可以被当做 GPIO引脚 来使用。 G0的GPIO模块与F0的类似,主要有以下 区别 STM32F0系统架构 STM32G0系统架构 主要特性 双向操作最多达60个I/O引脚,从GPIOA~GPIOF共5个端口,每个端口最多16个I/O引脚,全部具有外部中断和唤醒功能,使用BSRR和BRR寄存器进行原子操作(置位和复位),每个端口独立配置。 GPIOx直接挂在IOPORT总线上。 大多数I/O引脚能够支持5V容忍。 引脚的基本结构 操作模式 输入模式:悬浮(无上下拉电阻),输入上拉/下拉,模拟输入模式。 输出模式:推挽,带有可选上拉/下拉的开漏。
[单片机]
STM32G0技术详解 _ GPIO-<font color='red'>EXTI</font>-系统DMA
[单片机框架][bsp层][AT32F415][bsp_exti] EXTI配置和使用
7.2.1 主要特性 EXTI 控制器的主要特性如下: ● 每个中断/事件都有独立的触发和屏蔽 ● 每个中断线都有专用的状态位 ● 支持多达 23 个软件的中断/事件请求 ● 检测脉冲宽度低于 APB2 时钟宽度的外部信号。参见数据手册中电气特性部分的相关参数。 7.2.4 功能说明 要产生中断,必须先配置好并使能中断线。根据需要的边沿检测设置 2 个触发寄存器,同时在中断屏蔽寄存器的相应位写’1’允许中断请求。当外部中断线上发生了期待的边沿时,将产生一个中断请求,对应的挂起位也随之被置’1’。在挂起寄存器的对应位写’1’,将清除该中断请求。 如果需要产生事件,必须先配置好并使能事件线。根据需要的边沿检测设置 2 个触发寄存器
[单片机]
[单片机框架][bsp层][AT32F415][bsp_<font color='red'>exti</font>] <font color='red'>EXTI</font>配置和使用
ARM历程四-LCD
离上次真正写历程已经有10天的时间了。国庆嘛,自己给自己放了几天假——耍耍游戏下下棋什么的。 其实这次写触屏的驱动和对ARM中中断的过程的了解也花了不少时间和脑力。 我就简单分享一下CPU执行某个中断的条件吧,也是我自己的理解,如果有错还请大家指正(以IRQ中断为例吧):   在程序状态寄存器中(CPSR寄存器)i 位为IRQ中断禁止位,若这一位置1那么所有的IRQ中断都不会被CPU响应,如果这一位被清0,CPU也不一定会响应某一个或某些中断(就像是一个总开关)。所以,要想让CPU执行IRQ中断,CPRS中的i位必须要清0!   在2440的CPU中还有两个中断屏蔽寄存器:INTMSK(中断屏蔽寄存器)和IN
[单片机]
ARM裸机学习二:S3C2440的串口使用
1.串口的初始化(仅使用基本功能) 1.首先设置复用引脚,以串口0为例,RXD代表接受数据的引脚,TXD代表发送数据的引脚,这两个是复用引脚,需要在GPHCON寄存器中设置引脚复用 2.设置GPH的上拉 3.设置UCON0寄存器,简单的串口功能需要设置: 第10,11位,选择时钟源,这里可以设置00或者01来选择PCLK; 第0,1位,选择接收模式,这里设置成01,也就是中断或查询模式 第2,3位,选择发送模式,这里设置成01,也就是中断或查询模式 4.设置波特率,通过设置UBRDIV0寄存器来设置,设置的值的计算公式为: UBRDIVn = (int)( UART 时钟 / ( 波特率 × 16) ) –1 这里的 UART
[单片机]
S3C2440的RAM和启动过程!
2440自带的RAM是:16K Instruction cache + 16K data cache + 4K Boot Internal SRAM。但是我们能用到的只有4K Boot Internal SRAM;2440不自带ROM。 2440的启动方式有两种,norflash和nandflash,怎么选择? OM = 01,10为norflash启动,分别对应16bit和32bit,OM = 00为nandflash启动。 两种启动方式:先贴张图。 可以观察到,s3c2440总共有8个内存banks,6个内存bank可以当作ROM或者SRAM来使用,留下的2个bank除了当作ROM 或者SRAM,还可以用SDRAM
[单片机]
<font color='red'>S3C2440</font>的RAM和启动过程!
s3c2440裸机-内存控制器(五、SDRAM编程实现)
配置内存控制器-SDRAM编程配置 2440内存控制器共有13个寄存器。 BANK0--BANK5只需要设置BWSCON和BANKCONx(x为0~5)两个寄存器; BANK6、BANK7外接SDRAM时,除BWSCON和BANKCONx(x为6、7)外,还要设置REFRESH、BANKSIZE、MRSRB6、MRSRB7等4个寄存器。 下面分别说明各个寄存起的设置: 1.位宽和等待控制寄存器BWSCON(BUSWIDTH&WAITCONTROLREGISTER) 我们SDRAM的位宽为32,DW6 设置成10, 没有使用等待信号,所以WS6 =0。 bank7跟随bank6的配置, 因此BWSCON寄存器的值为:
[单片机]
<font color='red'>s3c2440</font>裸机-内存控制器(五、SDRAM编程实现)
基于S3C2440的电视发射机控制单元设计
0 引言 随着广播电视事业的发展,电视发射机技术的应用越来越广泛。为了能有效保证电视信号的质量,对电视发射机监测的重要性更加突出。本文通过对电视发射机信号的监测,给出了利用S3C2440来对电视发射机进行智能控制的设计方法,该方法还可通过与上位机的连接,并利用PC监控计算机来实现遥测遥控。 1 系统组成   本控制器以基于ARM9系列高性能嵌入式 处理器 S3C2440为核心来控制 LCD 触摸 显示屏 、局域网、 RS232 C 接口 ,同时控制模拟输入量接口、数字状态量输入接口和控制输出接口,其系统组成原理框图如图1所示。 为了减小发射机对控制器的干扰,应对控制器的模拟输入量、数字状态量输入和控制
[家用电子]
基于<font color='red'>S3C2440</font>的电视发射机控制单元设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved