编程实现将EINT0 和EINT1设置为边沿触发, EINT2设置为高电平触发发方式

S3C2440系统中断_Linux编程_Linux公社-Linux系统门户网站
你好,游客
S3C2440系统中断
来源:Linux社区&
作者:mr_raptor
3C2440系统中断
l查询方式:CPU不停的去查询每一个硬件的当前状态,根据硬件的状态决定处理与否。好比是工厂里的检查员,不停的检查各个岗位工作状态,发现情况及时处理。这种方式实现起来简单,通常用在只有少量外设硬件的系统中,如果一个计算机系统中有很多硬件,这种方式无疑是耗时,低效的,同时还大量占用CPU资源,并且对多任务系统反应迟钝。
l中断方式:当某个硬件产生需要CPU处理的事件时,主动通过一根信号线“告知”CPU,同时设置某个寄存器里对应的位,CPU一旦发现这根信号线上的电平有变化,就会中断当前程序,然后去处理发出该中断请求。这就像是医院重危病房,病房每张病床床头有一个应急按钮,该按钮连接到病房监控室里控制台一盏指示灯,只要该张病床出现紧急情况病人按下按钮,病房监控室里电铃会响起,通知医护人员有紧急情况,医护人员这时查看控制台上的指示灯,找出具体病房,病床号,直接过去处理紧急情况。中断处理方式相对查询方式要复杂的多,并且需要硬件的支持,但是它处理的实时性更高,嵌入式系统里基本上都使用这种方式来处理。
系统中断是嵌入式硬件实时地处理内部或外部事件的一种机制。对于不同CPU而言,中断的处理只是细节不同,大体处理流程都一样,S3C2440A的中断控制器结构如下图所示:
UART串口中断源信号复合示意图
信号除上述分法之外,还可以按照硬件位置分为:外部中断源和内部中断源。
l内部中断源:它是嵌入式系统中常见硬件产生的中断信号,比如:UART串口中断源,时钟Timer中断源,看门狗中断源等
l外部中断源:有时嵌入式系统里要在外部接口上挂载一些外部设备,这些设备并不是一个通用嵌入式系统里必备硬件,比如:蓝牙模块,各种传感器,WIFI无线通信模块,这些硬件也要产生中断让CPU来处理数据,因此这些外设硬件通过中断信号线连接到中断控制器上,它们产生的中断叫做外部中断信号。它们有着和内部中断一样的处理机制,只不过,它没有一个固定的中断号与之对应,硬件与嵌入式系统的连接方式与中断处理完全由系统硬件与软件设计者实现。
相关资讯 & & &
& (10/27/:33)
& (06/15/:08)
& (05月03日)
& (10/23/:19)
& (05/31/:15)
图片资讯 & & &
   同意评论声明
  ??发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
第八章 外部中断
下载积分:800
内容提示:
文档格式:PPT|
浏览次数:0|
上传日期: 17:36:32|
文档星级:
该用户还上传了这些文档
第八章 外部中断.PPT
官方公共微信第八章外部中断_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
第八章外部中断
阅读已结束,如果下载本文需要使用
想免费下载本文?
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢06linux系统驱动编程_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
文档贡献者
评价文档:
06linux系统驱动编程
L​i​n​u​x​系​统​驱​动​编​程
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
大小:1.87MB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢您现在的位置: &
s3c2440外部中断操作
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 *)0x) //Port B control
  #define rGPBDAT&&& (*(volatile unsigned *)0x) //Port B data
  #define rGPBUP&&&& (*(volatile unsigned *)0x)& //Pull-up control B
  #define rGPFCON&&& (*(volatile unsigned *)0x) //Port F control
  #define rEXTINT0&& (*(volatile unsigned *)0x)& //External interrupt control register 0
  #define rEINTMASK& (*(volatile unsigned *)0x) //External interrupt mask
  #define rEINTPEND& (*(volatile unsigned *)0x) //External interrupt pending
  static void __irq Key1_ISR(void)&& //EINT1
  &&&&&&
  &&&&&& 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
  &&&&&&
  &&&&&& 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
  &&&&&&
  &&&&&& 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
  &&&&&&
  &&&&&& 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)
  &&&&&&
  &&&&&&
  &&&&&& rGPBCON = 0x015550;
  &&&&&& rGPBUP = 0x7
  &&&&& &rGPFCON = 0
  &&&&&& rSRCPND = 0x17;
  &&&& & rINTMSK = ~0x17;
  &&&&&& rINTPND =0x17;
  &&&&& &rEINTPEND = (1&&4);
  &&&&&& rEINTMASK = ~(1&&4);
  &&&&& &rEXTINT0 = 0x20222;
  &&&&& &light = 0x0;
  &&&&& &rGPBDAT = ~
  &&&&&&&
  &&&&& &pISR_EINT0 = (U32)Key4_ISR;
  &&&&&& pISR_EINT1 = (U32)Key1_ISR;
  &&&&& &pISR_EINT2 = (U32)Key3_ISR;
  &&&&&& pISR_EINT4_7 = (U32)Key2_ISR;
  &&&&&&
  &&&&&& while(1)
  &&& &&&&& &&& ;&&&&&
&&&主编推荐
&&&热门试卷
&&&最新视频
&&&热门阅读
&&&最新问答
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&湘教QS2-164&&增值电信业务经营许可证湘B2-

我要回帖

更多关于 边沿触发 电平触发 的文章

 

随机推荐