2440裸机编程之四 外部中断
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();
}
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裸机编程之四 外部中断相关推荐
- 51单片机:外部中断实现流水灯
51单片机:外部中断实现流水灯 作业要求: 按照给定的实验板电路图编程实现外部中断控制流水灯,初始上电时,实验板右下侧的流水灯区域只有最右侧LED灯亮,其他灯全都熄灭,每按下一次按键,流水灯从右向左流 ...
- S5PV210裸机之外部中断
S5PV210中断体系介绍 一.什么是中断? (1)中断的发明是用来解决宏观上的并行需要的.宏观就是从整体上来看,并行就是多件事情都完成了. (2)微观上的并行,就是指的真正的并行,就是精确到每一 ...
- 一起学mini2440裸机开发(十)--mini2440外部中断实验
我今天一整天都在试着将TQ2440的那种处理中断的方法(即安装中断向量表)移植到MDK中的mini2440,但是一直没成功,这种方法一直没成功,后来又想,还是先从最简单的开始吧,就是不利用中断向量表, ...
- 51单片机外部中断的C51编程
51单片机外部中断的C51编程 相关知识: 1.51单片机的5大中断源:串行口中断.定时中断1.外部中断1.定时中断0.外部中断0: 2.中断源的编号: 串行口中断为4.定时中断1为3.外部中断1为2 ...
- 51单片机——中断系统、外部中断、定时器中断、串口通信C语言入门编程
目录 中断系统: 外部中断: 1.外部中断0.1:当触发时,LED状态取反 定时器中断: 1.定时器0.1:LED以1S为周期闪烁 串口通信: 1.串口中断:通过串口发送什么数据给单片机,单片机再通过 ...
- TQ210裸机编程(4)——按键(中断法)
S5PV210有4个向量中断控制器(VIC),每个向量中断控制器包含32个中断源. 当某个中断源产生中断时,CPU会自动的将VICxVECTADDRy(x=0,1,2,3,y=0-31)寄存器的值赋给 ...
- BSP板机支持包、linux启动分析、ARM裸机编程
文章目录 一.BSP 二.驱动 驱动的基本要素 三.启动分析 1.uboot 2.uboot的作用 3.uboot相关命令 关键的内容: 1)bootargs,启动参数 2)启动命令 3)修改启动延时 ...
- 【Linux驱动编程】Linux中断上半部和下半部
前言 cpu在执行程序时,如果有外部中断触发时,如定时器中断.串行总线中断等,cpu停止当前任务从而转去响应中断处理.对于中断函数的处理,原则是尽快处理完事务并退出中断,这一点也比较好理解,尽快处 ...
- MCU裸机编程的状态机框架--第一部分
MCU裸机编程的状态机框架--第一部分 1 状态机的概念 1.1 状态机的要素 1.2 状态迁移表 1.3 状态机思路实现一个时钟程序 1.4 状态机应用的注意事项 1.5 更复杂的状态机 2 单片机 ...
最新文章
- JS DOM 操作实现代码
- 软件问题造成的经济损失案例_公司印章管理使用哪些行为会造成法律风险隐患...
- JavaScript函数节流(throttle)与函数去抖(debounce)解析与应用举例
- AVL树双旋转+图解
- spring boot 入门-使用spring boot构建简单应用
- java三板斧_Java 枚举使用三板斧
- 做论坛签名外链 我们需要注意什么?
- android里canvas视频帧,移动端用canvas截取视频封面,如何不截取第一帧,而是截取其它的帧?...
- mysql的每隔1分钟定时_深入研究MySQL(四)、备份与恢复
- atxserver运行没有反应_关于厌氧反应器的酸化现象与恢复措施!
- Mysql8.0 15安装后怎么打开_最新最全mysql8.0.15安装配置及连接Navicat教程
- CSDN 积分的作用
- 二叉树遍历算法的应用——复制二叉树
- 【2021版】想要专升本你不得不看的全干货_吐血整理_专升本_计算机文化基础(三)
- 申请微信公众测试号一直配置失败,在线等大佬帮忙。
- JDK	安装教程——图文细讲
- PC版免费京东全民营业自动化做任务脚本(多号版)
- 未來用工新趨勢_2019年社会化用工成新趋势
- 【泰国留学那些事】水灯节--泰国人极致浪漫的艺术画像
- win10打开蓝牙,蓝牙开关消失,蓝牙和其他设备设置,蓝牙开关不见了
热门文章
- 【C 语言】C 项目开发代码规范 ( 形参合法性判断 | 函数返回值局部变量 | 函数中不用全局变量 | 函数中使用局部变量接收形参 | 函数返回值 | 形参作返回值 | 形参返回值处理 )
- 【Android 逆向】arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 分析 malloc 函数的 arm 汇编语言 )
- 【Android 异步操作】Android 线程切换 ( 判定当前线程是否是主线程 | 子线程中执行主线程方法 | 主线程中执行子线程方法 )
- 【组合数学】组合恒等式 ( 递推 组合恒等式 | 变下项求和 组合恒等式 简单和 | 变下项求和 组合恒等式 交错和 )
- 【运筹学】线性规划数学模型 ( 知识点回顾 | 可行解 | 最优解 | 阶梯型矩阵 | 阶梯型矩阵向量 | 基 | 基向量 | 基变量 | 非基变量 )
- 实时机器学习是什么,面临哪些挑战?
- windows下定时利用bat脚本实现ftp上传和下载
- LeetCode: Unique Binary Search Trees [095]
- java的WebService实践(cxf)
- a href=#与 a href=javascript:void(0) 的区别 打开新窗口链接的几种办法