S3C2440之中断控制

如下,ARM管脚配置

 

概述:中断控制器中的5个寄存器,源挂起寄存器、中断模式寄存器、屏蔽寄存器、优先级寄存器、和中断挂起寄存器

源挂起寄存器(SRCPEND):该寄存器由32位组成,每一位涉及一个中断,如果中断源产生了中断,则相应的位将被置1,表示某个中断源正在请求中断服务,可以手动清楚该位

中断模式寄存器(INTMOD):用于每个中断源是选择FIQ中断模式,还是IRQ模式

中断屏蔽寄存器(INTMASK):此寄存器由32位组成,每一位涉及一个中断,如果某位设置为1,则CPU不会去服务来自中断的相应,反之将相应

中断优先级寄存器(PRIOPITY):控制中断的优先级,由仲裁器控制中断的顺序。其中REQ0和REQ5的优先级是固定的,REQ1-REQ4可以通过ARB_SELn来改变优先级

仲裁器图如下:

 

中断挂起寄存器(INTPND):该寄存器32位,每一位对应一个中断请求

 

中断偏移寄存器(INTOFFSET):功能不了解?????日后再分析

 

次级源挂起寄存器(SUBSRCPND):

 源码如下:

static void __irq Key_ISR(void)
{
 U8 key;
 U32 r;
 int i;
#define OFFSET 5
 
 EnterCritical(&r);
 if(rINTPND==BIT_EINT1)
 {
  Uart_Printf("eint1\n");
  ClearPending(BIT_EINT1);
  rGPBDAT &= ~(1 << (OFFSET + 1));
  Delay(1000);
  rGPBDAT |= (1 << (OFFSET + 1));
 }
 if(rINTPND==BIT_EINT4_7)
 {
  ClearPending(BIT_EINT4_7);
  if(rEINTPEND&(1<<4))
  {
   Uart_Printf("eint4\n");
   rEINTPEND |= 1<< 4;
   rGPBDAT &= ~(1 << (OFFSET + 3));
   Delay(1000);
   rGPBDAT |= (1 << (OFFSET + 3));
  }
 }
 if(rINTPND==BIT_EINT0)
 {
  Uart_Printf("eint0\n");
  ClearPending(BIT_EINT0);
  rGPBDAT &= ~(1 << (OFFSET + 0));
  Delay(1000);
  rGPBDAT |= (1 << (OFFSET + 0));
 }
 if(rINTPND==BIT_EINT2)
 {
  Uart_Printf("eint2\n");
  ClearPending(BIT_EINT2);  
  rGPBDAT &= ~(1 << (OFFSET + 2));
  Delay(1000);
  rGPBDAT |= (1 << (OFFSET + 2));
 }

 key=Key_Scan();
 if( key == 0xff )
  Uart_Printf( "Interrupt occur... Key is released!\n") ;
 else
  Uart_Printf( "Interrupt occur... K%d is pressed!\n", key) ;

 ExitCritical(&r);
 
 rGPBDAT |= 0x0f << (OFFSET);
 for (i = 0; i < 4; i++)
 {
  rGPBDAT |= (0 << (OFFSET + i));
  Delay(1000);
  rGPBDAT |= (0 << (OFFSET + i));
 }
 
}

 

void My_Int_Key_Display(void)
{
 Uart_Printf("\nMy Interrupt Key Test Begin\n");

 //GPIO Pin Configure LED LIGHT
 rGPBCON |= 0x15400;//CONFIGURE PINS: SET PB5、PB6、PB7、PB8  OUTPUT
 rGPBUP |= 0x1E0; //set pins pull-up

 //GPIO Pin Configure interrupt;
 rGPHCON &= ~(0XAA);
 rGPHCON |= 0XAA; //SET FUNCTION EINT0,EINT1,EINT2,EINT3
 rGPHUP &= 0x0F; //SET PIN PULL-UP

 rEXTINT0 |= 0x1111; //SET INTTURRPT HIGH LEVEL

 
 rEINTPEND |= (1<<4);       //clear eint 4
 rEINTMASK &= ~(1<<4);      //enable eint 4
 ClearPending(BIT_EINT0|BIT_EINT1|BIT_EINT2|BIT_EINT4_7);
 pISR_EINT0 = pISR_EINT1 = pISR_EINT2 = pISR_EINT4_7 = (U32)Key_ISR;
 EnableIrq(BIT_EINT0|BIT_EINT1|BIT_EINT2|BIT_EINT4_7); 

  while( Uart_GetKey() != ESC_KEY ) ;
  DisableIrq(BIT_EINT0|BIT_EINT1|BIT_EINT2|BIT_EINT4_7); 
}

 

int main(void)

{

     My_Int_Key_Display();

}

终端运行结果:

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值