S3C2440A中的中断控制器接受来自60个中断源的请求。提供这些中断源的是内部外设,如DMA控制器、UART、IIC等等。在这些中断源中,UARTn、AC97和EINTn中断对于中断控制器而言是“或”关系。任意一个中断发生都会触发总中断

当从内部外设和外部中断请求引脚收到多个中断请求时,中断控制器在仲裁步骤后请求ARM920T内核的FIQ或IRQ。

仲裁步骤由硬件优先级逻辑决定并且写入结果到帮助用户通告是各种中断源中的哪个中断发生了的中断挂起寄存器中。

中断源有两种,一种是直接中断源,比如触摸屏中断,还有一种是带子中断的中断,类似于串口带有子终端入RXTX中断,通过SUBMASK也就是中断允许之后挂起到系统,系统根据用户设置确定是否响应该中断,然后依靠优先级分批响应,中断优先级依靠硬件决定

至于中断的处理过程,在解析启动代码的时候有讲到,请自行查阅

下面以按键的外部中断为例讲解中断的使用方法

1.       首先,要使用外部中断需要在rGPXCON里面将引脚模式设置为中断功能,对应是0x10

2.       需要在对应的寄存器中设置中断触发模式(EXINTx),例如GPF7中断,关联的中断引脚是EINT7,而EINT7是属于EXTINT0的,如下

所以对EXTINT0赋值选择相应中断触发模式

3.       此时,中断还不能被触发,因为还没有设置上图的MASK,mode,接下来在INTMOD中选择中断属于那个分组,如下

一般选择为IRQ中断,关于FIQ中断相关资料后期说明

4.       接下来使能相关的中断服务,寄存器为INTMSK

5.       现在就可以进行中断了,但是为了保险起见,再打开中断之前最好将中断标志位都清除掉,中断标志位有两个,两个系统级一个子中断级,系统级里面分别是SRCPND和INTPND

子中断的意思就是现在开的中断代表EINT4-7那到底是哪一个还能确定,依靠INTPEND

注意,只有多个中断公用一个通道的时候才有这个,比如EINT0-3是独立中断,直接在系统中断寄存器里面清除就好了

最后,开启中断

同样,这个也是多个中断公用通道的时候使用

另外,针对外部中断可以设置滤波过程,请查阅手册

现在我们来看,差不多的对应关系是

EINTMASK , ---------------------------SUBMASK子中断开关

INTMASK-----------------------------MASK总中断开关

INTMODE-------------------------------MODE模式开关

SPRPND-----------------------------源挂起标志

INTPND----------------------------中断请求标志

EINTPEND----------------------子中断挂起

当一个通道对应多个中断的时候要依靠子中断挂起来判定到底是哪一个中断发生了

以下是按键中断代码

Exit.c

#include "exti.h"

//按键中断处理函数
void __irq IRQ_KEY1(void)
{ rSRCPND |=(1<<1); //清除中断标志位
rINTPND |=(1<<1); keyValue = KEY_UP;
} void __irq IRQ_KEY2(void)
{ rSRCPND |=(1<<4); //清除中断标志位
rINTPND |=(1<<4);
if(rEINTPEND & (1<<4))//EINT4包含4-7四个中断源
{
rEINTPEND |=(1<<4); //清除ENIT4的中断标志位
keyValue = KEY_DOWN;
}
} void __irq IRQ_KEY3(void)
{ rSRCPND |=(1<<2); //清除中断标志位
rINTPND |=(1<<2); keyValue = KEY_LEFT;
} void __irq IRQ_KEY4(void)
{ rSRCPND |=1<<0; //清除中断标志位
rINTPND |=1<<0; keyValue = KEY_RIGHT;
} void ExtiInit(void)
{
rGPFCON &= ~((3<<0)|(3<<2)|(3<<4)|(3<<8));//0 1 2 4清零
rGPFCON |= ((2<<0)|(2<<2)|(2<<4)|(2<<8));//选择中断复用
rEXTINT0 &= ~((7<<0)|(7<<4)|(7<<8)|(7<<16));//清除中断模式
rEXTINT0 |= ((2<<0)|(2<<4)|(2<<8)|(2<<16));//选择下降沿触发
rSRCPND |= ((1<<0)|(1<<1)|(1<<2)|(1<<4));//清除中断标志
rINTPND |= ((1<<0)|(1<<1)|(1<<2)|(1<<4));//清除中断挂起
rINTMOD &= ~((1<<0)|(1<<1)|(1<<2)|(1<<4));//设置中断为IRQ中断
rINTMSK &= ~((1<<0)|(1<<1)|(1<<2)|(1<<4));//去除中断屏蔽,打开中断
rEINTPEND |= (1<<4);//EINT4中断服务有效//对于EINT4这种带子中断的中断的额外操作,清除子中断
rEINTMASK &= ~(1<<4); //EINT4中断服务有效//对于EINT4这种带子中断的中断的额外操作,打开子中断
//建立中断函数连接
pISR_EINT1 = (unsigned)IRQ_KEY1; //建立中断服务函数链接
pISR_EINT4_7 = (unsigned)IRQ_KEY2;
pISR_EINT2 = (unsigned)IRQ_KEY3;
pISR_EINT0 = (unsigned)IRQ_KEY4;
}

Exit.h

#ifndef __EXTI_H_
#define __EXTI_H_
#include "2440addr.h"
#include "def.h"
#include "key.h" void ExtiInit(void);//使用GPIOF 0 1 2 4 #endif

S3C2440外部中断系统详解的更多相关文章

  1. S3C2440串口及其中断系统详解

    个独立异步串行I/O(SIO)端口,每个都可以是基于中断或基于DMA模式的操作.换句话说,UART可以通过产生中断或DMA请求来进行CPU和UART之间的数据传输. 字节的FIFO给发送和接收. 字节 ...

  2. java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET

    java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET 亲,“社区之星”已经一周岁了!      社区福利快来领取免费参加MDCC大会机会哦    Tag功能介绍—我们 ...

  3. linux-2.6.26内核中ARM中断实现详解(转)

    转载:http://www.cnblogs.com/leaven/archive/2010/08/06/1794293.html 更多文档参见:http://pan.baidu.com/s/1dDvJ ...

  4. Bootstrap栅格系统详解,响应式布局

    Bootstrap栅格系统详解 栅格系统介绍 Bootstrap 提供了一套响应式.移动设备优先的流式栅格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列. 栅格系统用于通 ...

  5. Vmware12安装centos系统详解

    vmware12安装centos7系统详解 用虚拟机12安装centos7系统详细安装过程,后附centos7下载地址. 工具/原料 虚拟机12 centos7系统镜像 方法/步骤 1 1.百度搜索c ...

  6. centos7.2环境nginx+mysql+php-fpm+svn配置walle自动化部署系统详解

    centos7.2环境nginx+mysql+php-fpm+svn配置walle自动化部署系统详解 操作系统:centos 7.2 x86_64 安装walle系统服务端 1.以下安装,均在宿主机( ...

  7. syslog之一:Linux syslog日志系统详解

    目录: <syslog之一:Linux syslog日志系统详解> <syslog之二:syslog协议及rsyslog服务全解析> <syslog之三:建立Window ...

  8. “全栈2019”Java第一百零四章:匿名内部类与外部成员互访详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. 利用python求解物理学中的双弹簧质能系统详解

    利用python求解物理学中的双弹簧质能系统详解 本文主要给大家介绍了关于利用python求解物理学中双弹簧质能系统的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 物理的 ...

随机推荐

  1. Android简单逐帧动画Frame的实现(二)

    Android简单逐帧动画Frame的实现   Android简单逐帧动画Frame的实现 1.逐帧动画 即是通过播放预先排序好的图片来实现动态的画面,感觉像是放电影. 2.实现步骤: 1. 在工程里 ...

  2. 用for、while、do-while循环输出10句“好好学习,天天向上!”

    #include "stdio.h" void main() { int time; ;time<=;time++) printf("%d.好好学习,天天向上!\n ...

  3. 快学Scala-第一章 基础

    知识点: Scala程序并不是一个解释器,实际发生的是,你输入的内容被快速的编译成字节码,然后这段字节码交由Java虚拟机执行. 以val定义的值是一个常量,以var定义的值是一个变量,声明值或变量但 ...

  4. HBase Coprocessor 剖析与编程实践(转载http://www.cnblogs.com/ventlam/archive/2012/10/30/2747024.html)

    HBase Coprocessor 剖析与编程实践 1.起因(Why HBase  Coprocessor) HBase作为列族数据库最经常被人诟病的特性包括:无法轻易建立“二级索引”,难以执行求和. ...

  5. java 设计模式之单利模式以及代理模式(静态)

    1:单利模式: public class Singleton { private static Singleton uniqueInstance = null; private Singleton() ...

  6. Git学习 -- 标签管理

    新建标签 git tag <tagname>   默认为HEAD,也可以指定一个commit id eg.   git tag v0.9  git tag v1.0 31aa59c git ...

  7. s5pv210 AD转换

    1:ADC:Analog-to-Digital Converter,模拟信号转数字信号,自然界一般为模拟信号,而SoC需要数字信号,所以之间通信需要ADC. 2:转换原理: 以逐次逼近式AD转换为例: ...

  8. 解决phpmyadmin 点击表结构时卡顿、一直加载、打不开的问题

    本文内容是转自其它站点,亲测可用. 第一步,打开 ./version_check.php文件,找到以下代码: $save = true; $file ='http://www.phpmyadmin.n ...

  9. 最短路径算法专题2----Dijkstra

    这个算法适用于求单源最短路径,从一点出发,到其余个点的最短路径. 算法要点: 1.用二维数组存放点到点的距离-----不能相互到达的点用MAX代替距离 2.用dis数组存放源点到任意其他一点的距离-- ...

  10. Entity Framework 学习初级篇7--基本操作:增加、更新、删除、事务

    本节,直接写通过代码来学习.这些基本操作都比较简单,与这些基本操作相关的内容在之前的1至6节基本介绍完毕. l           增加: 方法1:使用AddToXXX(xxx)方法:实例代码如下: ...