⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eint.c

📁 嵌入源代码式系统实验 跑马灯 键盘扫描 中断
💻 C
字号:
/*****************************************
  NAME: eint.c
  DESC: External interrupt test
  HISTORY:
  2001.04.03:purnnamu: draft ver 0.0
 *****************************************/

#include "2410addr.h" 

static void __irq Eint2Int(void)
{
    rSRCPND = BIT_EINT2;  //Clear pending bit
    rINTPND = BIT_EINT2;
    rINTPND;     
    Uart_Printf("EINT2 interrupt is occurred.\n");

}

static void __irq Eint3Int(void)
{
    rSRCPND = BIT_EINT3;  //Clear pending bit
    rINTPND = BIT_EINT3;
    rINTPND;     
    Uart_Printf("EINT3 interrupt is occurred.\n");

}


static void __irq Eint1Int(void)
{
    rSRCPND = BIT_EINT1;  //Clear pending bit
    rINTPND = BIT_EINT1;
    rINTPND;     

    Uart_Printf("EINT1 interrupt is occurred.\n");

}


static void __irq Eint7_9Int(void)
{
    if(rEINTPEND==(1<<7))
    {
	Uart_Printf("EINT7 interrupt is occurred.\n");
	rEINTPEND=(1<<7);
    }
    rSRCPND = BIT_EINT4_7;  //Clear pending bit
    rINTPND = BIT_EINT4_7;
    

}
/*****************************************
  EXTERNAL INTERRUPT REQUEST TEST
  函数名: Test_Eint
  描述: 外部中断测试函数
  返回值:void
 *****************************************/

// SMDK2410 EINT S/W
// EINT1/2/3/7
void Test_Eint(void)
{
   //int i;
    int extintMode;

    Uart_Printf("[External Interrupt Test through PF0/2/11/19]\n");

    Uart_Printf("1.L-LEVEL  2.H-LEVEL  3.F-EDGE  4.R-EDGE  5.B-EDGE\n");
    Uart_Printf("Select the external interrupt type.\n");
    extintMode=Uart_Getch();

   //设置相关中断的I/O口寄存器
    rGPFCON = (rGPFCON & 0x3103)|(1<<3)|(1<<5)|(1<<15)|(1<<7);		//PF0/2 = EINT1/2/3/7
    rGPGCON = (rGPGCON & 0xfffffff3)|(1<<3);	//PG3/11 = EINT9
    
   //选择外部中断触发方式

    rSRCPND = rSRCPND|0xe;
    
    rGPBCON=rGPBCON|0x154000;
    rGPBCON=rGPBCON&0x157fff;//pb789/10=output
    rGPBDAT=rGPBDAT&0x7f;


    switch(extintMode)
    {
    case '1':
    	rEXTINT0 = (rEXTINT0 & ~((7<<4)|(0x7<<12)| (0x7<<8)|(0x7<<28))) | 0x0<<4 | 0x0<<8| 0x0<<28| 0x0<<12; //EINT1/2/3/7=low level triggered
    	break;
    case '2':
    	rEXTINT0 = (rEXTINT0 & ~((7<<4)|(0x7<<12)  | (0x7<<8)|(0x7<<28))) | 0x1<<4 | 0x1<<8| 0x1<<28| 0x1<<12; //EINT1/2/3/7=high level triggered
    	break;
    case '3':
    	rEXTINT0 = (rEXTINT0 & ~((7<<4)|(0x7<<12)  | (0x7<<8)|(0x7<<28))) | 0x2<<4 | 0x2<<8| 0x2<<28| 0x2<<12; //EINT1/2/3/7=falling edge triggered
    	break;
    case '4':
    	rEXTINT0 = (rEXTINT0 & ~((7<<4)|(0x7<<12)  | (0x7<<8)|(0x7<<28))) | 0x4<<4 | 0x4<<8| 0x4<<28| 0x4<<12; //EINT1/2/3/7=rising edge triggered
     	break;
    case '5':
    	rEXTINT0 = (rEXTINT0 & ~((7<<4)|(0x7<<12)  | (0x7<<8)|(0x7<<28))) | 0x6<<4 | 0x6<<8| 0x6<<28| 0x6<<12; //EINT1/2/3/7=both edge triggered
    	break;
    default:
    	break;
    }


    Uart_Printf("==Press the exint buttons or Press any key to exit.==\n");
    rEINTPEND = 0xffffff;
    rSRCPND = BIT_EINT2|BIT_EINT1|BIT_EINT3|BIT_EINT4_7; //to clear the previous pending states
    rINTPND = BIT_EINT2|BIT_EINT1|BIT_EINT3|BIT_EINT4_7;
    
    //外部中断函数声明
    pISR_EINT2=(unsigned)Eint2Int;
    pISR_EINT1=(unsigned)Eint1Int;
    pISR_EINT4_7=(unsigned)Eint7_9Int;
    pISR_EINT3=(unsigned)Eint3Int;

    
    rEINTMASK=~( (1<<7)|(1<<9) );
    rINTMSK=~(BIT_EINT2|BIT_EINT1|BIT_EINT3|BIT_EINT4_7);
    
    
    //若有外部输入,种屏蔽中断
    Uart_Getch();
    
    rEINTMASK=0xffffff;
    rINTMSK=BIT_ALLMSK;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -