您的位置 首页 解答

S3C2440外部中止之按键中止

要做2440的中断实验。首先要了解ARM的中断体系结构。ARM体系CPU有七种工作模式。分别是:用户模式(usr):ARM处理器正常程序执行状态。快…

要做2440的中止试验。首先要了解ARM的中止系统结构。ARM系统CPU有七种作业形式。分别是:

用户形式(usr):ARM处理器正常程序履行状况。

快速中止形式(fiq):用于高速数据传输或通道处理。

中止形式(irq):用于通用的中止处理。

管理形式(svc):操作系统运用的保护形式。

数据拜访停止形式(abt):当数据或指令预取停止时进入该形式,可用于虚拟存储及存储保护。

系统形式(sys):运转具有特权的操作系统使命。

未界说指令停止形式(und):当未界说的指令履行时进入该形式,可用于支撑硬件协处理器的软件仿真。

此外,ARM系统的CPU有两种作业状况,分别是:ARM状况、Thumb状况。

实际上,CPU一上电就作业在ARM状况,所以咱们不用关怀CPU作业状况。

每一种作业形式对应相应的寄存器,这儿就不具体说了。能够自己查阅相关材料。

CPU处理不预期事情有以下两种办法:

1.查询方法:程序循环的查询各个设备的状况并作出相应的反响。

2.当某些事情产生时,硬件会设置某个寄存器;CPU在每履行完一个指令时,通过硬件检查这个寄存器,假如发现所重视的事情产生了,则中止当时程序流程,跳转到一个固定的地址处理这件事,最终回来持续履行被中止的程序。

咱们来看一个中止处理框图

能够看出带子中止的要比不带子中止的处理进程多两个寄存器。这儿面涉及到的寄存器就要看s3c2440的芯片手册了。
咱们再来看一张图,来了解各个寄存器的联系。
现在来看一下2440外部中止的引脚

I/O引脚F脚与外部中止引脚EINT复用引脚。

现在结合代码来阐明中止处理进程。


#include “2440addr.h”
#define U32 unsigned int

static void __irq Key1_ISR(void) //EINT3
{
int led;
rSRCPND = rSRCPND | (0x1<<3);//EINT1开中止请求 EINT3方位一
rINTPND = rINTPND | (0x1<<3);//通过裁定器选出优先级高的中止后,这个中止在INTPND寄存器中相应方位一
led = rGPBDAT & (0x1<<6);
if (led ==0)
rGPBDAT = rGPBDAT | (0x1<<6);//原本是亮的,平息
else
rGPBDAT = rGPBDAT & ~(0x1<<6);//原本是灭的,点亮
}

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<<5);
if (led ==0)
rGPBDAT = rGPBDAT | (0x1<<5);
else
rGPBDAT = rGPBDAT & ~(0x1<<5);
}
}

static void __irq Key3_ISR(void) //EINT2
{
int led;
rSRCPND = rSRCPND | (0x1<<2);
rINTPND = rINTPND | (0x1<<2);
led = rGPBDAT & (0x1<<8);
if (led ==0)
rGPBDAT = rGPBDAT | (0x1<<8);
else
rGPBDAT = rGPBDAT & ~(0x1<<8);
}

void __irq Key4_ISR(void) //EINT0
{
int led;
rSRCPND = rSRCPND | 0x1;
rINTPND = rINTPND | 0x1;
led = rGPBDAT & (0x1<<10);
if (led ==0)
rGPBDAT = rGPBDAT | (0x1<<10);
else
rGPBDAT = rGPBDAT & ~(0x1<<10);
}

void Main(void)
{
int light;

rGPBCON = 0x155550;//0000 0001 0101 0101 0101 0000
rGPBUP = 0x7ff;//上拉无效
rGPFCON = 0xaaaa;//1010 1010 1010 1010 GPF管脚均设为中止形式

rSRCPND = 0x1d;//0001 1101 EINT0、2、3、4_7开
rINTMSK = ~0x1d;//屏蔽关
rINTPND =0x1d;
rEINTPEND = (1<<4);
rEINTMASK = ~(1<<4);
rEXTINT0 = 0x22222;//0010 0010 0010 0010 0010 规划触发方法 均设为下降沿

light = 0x0;
rGPBDAT = ~light;

pISR_EINT0 = (U32)Key4_ISR;
pISR_EINT3 = (U32)Key1_ISR;
pISR_EINT2 = (U32)Key3_ISR;
pISR_EINT4_7 = (U32)Key2_ISR;

while(1)
;
}
//******************************************************************************/

SRCPND/INPND设置要保持一致,担任哪些中止的开关。INTMSK是总的中止屏蔽。EINTPEND/EINTMASK只要外部中止EINT4-EINT23需求设置,在EXTINT0寄存器中设置触发方法。

//********************************************************************************/

pISR_EINT0-pISR_EINT4_7 界说的是中止向量进口地址,在2440addr.h文件中。如图:

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/jieda/274435.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部