2440有60个中断源(有的中断源还有几个子中断源),中断原理如下图:

中断源使中断源请求寄存器(SRCPND)的相应位置一,中断模式寄存器(INTMOD)选择是IRQ还是FIQ模式,如果是IRQ,在中断屏蔽寄存器(INTMSK)不屏蔽的情况下,会产生中断,同时中断请求寄存器(INTPND)的相应位被置一。
2440 外部中断 编程步骤:
外部中断初始化()
{
引脚初始化: 设置相应引脚为外部中断功能 GPxCON
  选择相应触发模式    EXTINT
中断初始化: 清除SRCPNF、INTPND中的相应中断标志位
  中断例程地址 -> 中断向量表 pISR_EINTx
  使能相应中断 rINTMSK
}
中断例程()  __irq
{
  ……中断程序……
  清除SRCPNF(先)、INTPND(后)中的相应中断标志位
}
这是一个外部中断0的实验程序(GPF0作外部中断源):
//********************************************************************
void Main(void)
{     
    int i;
    ……硬件初始化……

Eint0_init();
while(1);

}
void  Eint0_init(void)  //EINT0初始化
{
Uart_Printf("\n外部中断实验:Eint0\n"); 
rGPFCON = rGPFCON & ~7 |  2  ; //设置GPF0 为 外部中断模式
rEXTINT0 = rEXTINT0 & ~7 | 2   ;//设置EINT0 为 下降沿触发
rSRCPND = 1;     //SRCPND写1清0
rINTPND = 1;     //INTPND写1清0
pISR_EINT0 = (U32)Eint0_ISR; //向向量表申请中断向量
rINTMSK = rINTMSK & ~(1);  //禁止EINT0的屏蔽
}

void   Eint0_ISR(void) __irq  //EINT0中断例程
{
Uart_Printf("你按了一次Eint0引脚的按键\n"); 
rSRCPND = 1;  //清楚EINT0中断标志
rINTPND = 1; 
}
//*******************************************************************

运行结果如图:

注意中断标志的清除顺序:SUBSRCPND(如果有)->SRCPND->INTPND  ,如果不这样做,中断例程结束后,还会再次引起额外的中断
注意 pISR_EINT0 = (U32)Eint0_ISR;每一个中断例程运行之前,都要把它的地址交给中断向量表(此指60个中断源的eboot中断向量表,非地址0处的异常中断向量表,IRQ发生时,PC先指向异常中断向量表的IRQ位置,再跳转到eboot中断向量表),以在中断发生时,正确进入相应的中断例程,其实是把INTOFFSET中的中断号转换成(在eboot中断向量表的)偏移地址。

外部中断又24个,但不都是一致的,如下图:
EINT0、EINT1、EINT2、EINT3是四个独立的中断源,而EINT4~7组成一个中断源,EINT8~23组成一个中断源。
那么EINT4~7的中断程序如何写,显然不能用EINT0的方式,不然EINT4~EINT7的四个源相互之间无法被区分开,EINT8~23也同理。
所以为了区分它们,要用到EINTMASK和EINTPEND,EINTMASK每一位对应EINT4~EINT23的屏蔽,其他位保留;EINTPEND每一位对应EINT4~EINT23的中断请求,其他位保留;这样就可以顺利区分EINT4~EINT23了。
下面是Eint2和Eint11的中断程序
//********************************************************************
void Main(void)
{     
    int i;
    ……硬件初始化……

Uart_Printf("\n外部中断实验:Eint2 和 Eint8_23\n");

Eint2_init();
Eint8_23_init(); //EINT11初始化
while(1);
}
void  Eint2_init(void)  //EINT2初始化
{
rGPFCON = rGPFCON & ~3<<4 |  2<<4  ; //设置GPF2 为 外部中断模式
rEXTINT0 = rEXTINT0 & ~7<<8 | 4<<8   ;//设置EINT2 为 上升沿触发
rSRCPND = 1<<2;     //SRCPND写1清0
rINTPND = 1<<2;     //INTPND写1清0
pISR_EINT2 = (U32)Eint2_ISR;  //填入Eint2的中断向量
rINTMSK = rINTMSK & ~(1<<2);  //禁止EINT2的屏蔽
}

void   Eint2_ISR(void) __irq  //EINT2中断例程
{
Uart_Printf("你按了一次Eint2引脚的按键\n"); 
rSRCPND = 1<<2;  //清楚EINT2中断标志
rINTPND = 1<<2;
}

void  Eint8_23_init(void)  //Eint8_23初始化
{
rGPGCON = rGPGCON & ~3<<6 |  2<<6  ; //设置GPG3 为 外部中断模式
rEXTINT1 = rEXTINT1 & ~7<<12 | 2<<12   ;//设置EINT11 为 下降沿触发
rEINTPEND = 1<<11;    //***EINTPEND中的 EINT11位 清0
rSRCPND = 1<<5;     //SRCPND中的 Eint8_23位 清0
rINTPND = 1<<5;     //INTPND中的 Eint8_23位 清0
pISR_EINT8_23 = (U32)Eint8_23_ISR;  //填入Eint8_23的中断向量
rEINTMASK = rEINTMASK & ~(1<<11);  //***禁止EINT11的屏蔽
rINTMSK = rINTMSK & ~(1<<5);  //禁止Eint8_23的屏蔽
}

void   Eint8_23_ISR(void) __irq  //EINT2中断例程
{
Uart_Printf("你按了一次Eint8_23引脚的按键\n");
rEINTPEND = 1<<11;    //***EINTPEND中的 EINT11位 清0
rSRCPND = 1<<5;     //SRCPND中的 Eint8_23位 清0
rINTPND = 1<<5;     //INTPND中的 Eint8_23位 清0
}
//*******************************************************************

结果如下:

2440裸机编程之四 外部中断相关推荐

  1. 51单片机:外部中断实现流水灯

    51单片机:外部中断实现流水灯 作业要求: 按照给定的实验板电路图编程实现外部中断控制流水灯,初始上电时,实验板右下侧的流水灯区域只有最右侧LED灯亮,其他灯全都熄灭,每按下一次按键,流水灯从右向左流 ...

  2. S5PV210裸机之外部中断

    S5PV210中断体系介绍 一.什么是中断?  (1)中断的发明是用来解决宏观上的并行需要的.宏观就是从整体上来看,并行就是多件事情都完成了.  (2)微观上的并行,就是指的真正的并行,就是精确到每一 ...

  3. 一起学mini2440裸机开发(十)--mini2440外部中断实验

    我今天一整天都在试着将TQ2440的那种处理中断的方法(即安装中断向量表)移植到MDK中的mini2440,但是一直没成功,这种方法一直没成功,后来又想,还是先从最简单的开始吧,就是不利用中断向量表, ...

  4. 51单片机外部中断的C51编程

    51单片机外部中断的C51编程 相关知识: 1.51单片机的5大中断源:串行口中断.定时中断1.外部中断1.定时中断0.外部中断0: 2.中断源的编号: 串行口中断为4.定时中断1为3.外部中断1为2 ...

  5. 51单片机——中断系统、外部中断、定时器中断、串口通信C语言入门编程

    目录 中断系统: 外部中断: 1.外部中断0.1:当触发时,LED状态取反 定时器中断: 1.定时器0.1:LED以1S为周期闪烁 串口通信: 1.串口中断:通过串口发送什么数据给单片机,单片机再通过 ...

  6. TQ210裸机编程(4)——按键(中断法)

    S5PV210有4个向量中断控制器(VIC),每个向量中断控制器包含32个中断源. 当某个中断源产生中断时,CPU会自动的将VICxVECTADDRy(x=0,1,2,3,y=0-31)寄存器的值赋给 ...

  7. BSP板机支持包、linux启动分析、ARM裸机编程

    文章目录 一.BSP 二.驱动 驱动的基本要素 三.启动分析 1.uboot 2.uboot的作用 3.uboot相关命令 关键的内容: 1)bootargs,启动参数 2)启动命令 3)修改启动延时 ...

  8. 【Linux驱动编程】Linux中断上半部和下半部

    前言   cpu在执行程序时,如果有外部中断触发时,如定时器中断.串行总线中断等,cpu停止当前任务从而转去响应中断处理.对于中断函数的处理,原则是尽快处理完事务并退出中断,这一点也比较好理解,尽快处 ...

  9. MCU裸机编程的状态机框架--第一部分

    MCU裸机编程的状态机框架--第一部分 1 状态机的概念 1.1 状态机的要素 1.2 状态迁移表 1.3 状态机思路实现一个时钟程序 1.4 状态机应用的注意事项 1.5 更复杂的状态机 2 单片机 ...

最新文章

  1. JS DOM 操作实现代码
  2. 软件问题造成的经济损失案例_公司印章管理使用哪些行为会造成法律风险隐患...
  3. JavaScript函数节流(throttle)与函数去抖(debounce)解析与应用举例
  4. AVL树双旋转+图解
  5. spring boot 入门-使用spring boot构建简单应用
  6. java三板斧_Java 枚举使用三板斧
  7. 做论坛签名外链 我们需要注意什么?
  8. android里canvas视频帧,移动端用canvas截取视频封面,如何不截取第一帧,而是截取其它的帧?...
  9. mysql的每隔1分钟定时_深入研究MySQL(四)、备份与恢复
  10. atxserver运行没有反应_关于厌氧反应器的酸化现象与恢复措施!
  11. Mysql8.0 15安装后怎么打开_最新最全mysql8.0.15安装配置及连接Navicat教程
  12. CSDN 积分的作用
  13. 二叉树遍历算法的应用——复制二叉树
  14. 【2021版】想要专升本你不得不看的全干货_吐血整理_专升本_计算机文化基础(三)
  15. 申请微信公众测试号一直配置失败,在线等大佬帮忙。
  16. JDK 安装教程——图文细讲
  17. PC版免费京东全民营业自动化做任务脚本(多号版)
  18. 未來用工新趨勢_2019年社会化用工成新趋势
  19. 【泰国留学那些事】水灯节--泰国人极致浪漫的艺术画像
  20. win10打开蓝牙,蓝牙开关消失,蓝牙和其他设备设置,蓝牙开关不见了

热门文章

  1. 【C 语言】C 项目开发代码规范 ( 形参合法性判断 | 函数返回值局部变量 | 函数中不用全局变量 | 函数中使用局部变量接收形参 | 函数返回值 | 形参作返回值 | 形参返回值处理 )
  2. 【Android 逆向】arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 分析 malloc 函数的 arm 汇编语言 )
  3. 【Android 异步操作】Android 线程切换 ( 判定当前线程是否是主线程 | 子线程中执行主线程方法 | 主线程中执行子线程方法 )
  4. 【组合数学】组合恒等式 ( 递推 组合恒等式 | 变下项求和 组合恒等式 简单和 | 变下项求和 组合恒等式 交错和 )
  5. 【运筹学】线性规划数学模型 ( 知识点回顾 | 可行解 | 最优解 | 阶梯型矩阵 | 阶梯型矩阵向量 | 基 | 基向量 | 基变量 | 非基变量 )
  6. 实时机器学习是什么,面临哪些挑战?
  7. windows下定时利用bat脚本实现ftp上传和下载
  8. LeetCode: Unique Binary Search Trees [095]
  9. java的WebService实践(cxf)
  10. a href=#与 a href=javascript:void(0) 的区别 打开新窗口链接的几种办法