s3c2440外部中断操作详解

发布者:tyloo820最新更新时间:2017-11-12 来源: 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)
              ;     
}

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

上一篇:s3c2440的LCD应用详解
下一篇:ARM中断函数定义

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

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>的电视发射机控制单元设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

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