S3C2440外部中断之按键中断

要做2440的中断实验。首先要了解ARM的中断体系结构。ARM体系CPU有七种工作模式。分别是:

用户模式(usr):ARM处理器正常程序执行状态。

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

中断模式(irq):用于通用的中断处理。

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

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

系统模式(sys):运行具有特权的操作系统任务。

未定义指令终止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真。

此外,ARM体系的CPU有两种工作状态,分别是:ARM状态、Thumb状态。

实际上,CPU一上电就工作在ARM状态,所以我们不必关心CPU工作状态。

 

每一种工作模式对应相应的寄存器,这里就不详细说了。可以自己查阅相关资料。

CPU处理不预期事件有以下两种方法:

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

2.当某些事件发生时,硬件会设置某个寄存器;CPU在每执行完一个指令时,通过硬件查看这个寄存器,如果发现所关注的事件发生了,则中断当前程序流程,跳转到一个固定的地址处理这件事,最后返回继续执行被中断的程序。

 

我们来看一个中断处理框图:

《S3C2440外部中断之按键中断》 可以看出带子中断的要比不带子中断的处理过程多两个寄存器。这里面涉及到的寄存器就要看s3c2440的芯片手册了。 我们再来看一张图,来了解各个寄存器的关系。   《S3C2440外部中断之按键中断》   现在来看一下2440外部中断的引脚 《S3C2440外部中断之按键中断》 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文件中。如图:
《S3C2440外部中断之按键中断》

    原文作者:菜鸟冲锋号
    原文地址: https://blog.csdn.net/beishafengjiang/article/details/22818023
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞