ARMアーキテクチャを深く理解する(S 3 C 6410)---外部割込み制御例

2106 ワード

本文はmuge 0913によって編纂されます.転載は出典を明記してください.http://blog.csdn.net/muge0913/article/details/7415075
作者:张同浩、メールアドレス:[email protected]
S 3 C 6410の中断問題について、ネット上で多くの達人が分析しました.ここでは主にS 3 C 6410の実現過程を分析し、自分で作成した簡単なプログラムです.
私はミニ6410のk 1キーを使って外部の中断を実現します.
キー初期化:
void Key_Init()
{
	rGPNCON|=(1<<1);  // GPN0       
	rGPNPUD&=~(1<<0);//    
	rEINT0CON0|=(3<<0); //     
	rEINT0MASK&=~(1<<0);  //    
	rEINT0FLTCON0|=(1<<7);  //    
}
注意:私はこれでピンを初期化しました.つまりGPNCON 0です.
キー中断プログラム:
void Key_ISR() __irq  //      
{
	i++;
	
	if(i%2==0)Led_Display(0x0);//               
	else Led_Display(0xf);
	
	rEINT0PEND|=(1<<0);// 1    
	INTC_ClearVectAddr();//           
}
/*
      ,           
*/
void INTC_ClearVectAddr(void)
{
   rVIC0ADDR = 0x0;
   rVIC1ADDR = 0x0;
}
割込み初期化関数:
void INTC_Init(void) 
{
  //      
  rVIC0INTENCLEAR = 0xffffffff; 
  rVIC1INTENCLEAR = 0xffffffff; 
  
  //    IRQ
  rVIC0INTSELECT = 0x0;
  rVIC1INTSELECT = 0x0;
  
  INTC_ClearVectAddr();
  
}
イネーブル中断関数:
//       

int INTC_Enable(unsigned int intNum)
{
    if(intNum > INT_LIMIT)//    
     {
        return -1;
     }
     
	

	if(intNum<32)//   vic0 
	{
		
		rVIC0INTENABLE |= (1<<intNum);
		
	}
	else//   vic1 
	{
	    rVIC1INTENABLE |= (1<<(intNum -32));	    			
	}

	return 0;

}
割込みプログラム関数を指定します.
void INTC_SetIntISR(unsigned int intNum, void (*isr)(void) __irq)
{
  if(intNum > INT_LIMIT)//    
     {
        return ;
     }
     
     if(intNum < 32)//   vic0 
     {
         VIC0VECTADDR[intNum] = (unsigned )isr;
        
     }
     else//   vic1 
     {
         VIC1VECTADDR[intNum-32] = (unsigned )isr;
     }
}
作成メール関数:
	Led_Init();//led   
	
	Led_Display(0x0);//  led
	
	Key_Init();//     
	INTC_Init();//     
	INTC_Enable(INT_EINT0);//    
	INTC_SetIntISR(INT_EINT0,Key_ISR);//        
	
	while(1);//