ARM中断

来源:互联网 发布:无法连接主机 端口23 编辑:程序博客网 时间:2024/05/17 08:28

中断触发方式

1.边沿触发:上、下、双

2.电平触发:高、低


中断处理流程:
1. 中断控制器汇集各类外设发出的中断信号,然后告诉CPU
2.CPU保存当前程序的运行环境,调用中断服务程序ISR来处理中断(如数据的压栈)
3. 在ISR中通过读取中断控制寄存器、外设的相关寄存器来识别是哪个中断,并进行相应的处理
4.清除中断:通过读写相关中断控制寄存器和外设相关寄存器来实现。最后恢复被中断程序的环境,继续执行


中断控制寄存器

SUBSRCPND寄存器(SUB SOURCE PENDING)
INTSUBMSK寄存器(INTERRUPT SUBMSK)
SRCPND寄存器(SOURCE PENDING)
INTMSK寄存器(INTERRUPT MASK)
INTMOD寄存器(INTRRUPT MODE)
PRIORITY寄存器
INTPND寄存器(INTERRUPT PENDING)
INTOFFSET寄存器(INTERRUPT OFFSET)


s3c2440

按键中断点亮LED

void key_init(void);
static void __irq key_handler(void);

/*************************************************
延时函数
**************************************************/
void delay(int times)
{
    int i,j;
    for(i=0;i<times;i++)
       for(j=0;j<400;j++);
}


/*************************************************
LED初始化
**************************************************/
void Led1_init(void)
{
   rGPBCON &= ~(3<<10);// ÇåÁã
   rGPBCON |= (1<<10);
}


/*************************************************
点亮LED
**************************************************/
void Led1_run(void)
{
   rGPBDAT &=~(1<<5); /*LEDÁÁ»¹ÊÇÃð£¿*/
   delay(1000);
   rGPBDAT |=(1<<5);
   delay(1000);
}


/*************************************************
主函数
**************************************************/
void Main(void)
{
   MMU_Init();
   Led1_init();
   key_init();
   
   while(1);
}


/*************************************************
按键初始化
**************************************************/
void key_init(void)
{
    rGPGCON &= ~(0x3<<0);     
    rGPGCON |=  (0x2<<0);
    
    rEXTINT1 &= ~(0xf<<0);  
    rEINTPEND |= (1<<8);    
    rEINTMASK &= ~(1<<8);   
    
    /*ÉèÖÃISR*/
    pISR_EINT8_23=(U32)key_handler;
    EnableIrq(BIT_EINT8_23);
}    


/*************************************************
按键中断处理函数
**************************************************/
static void __irq key_handler(void)
{
    if(rINTPND==BIT_EINT8_23) 
    {
ClearPending(BIT_EINT8_23);

if(rEINTPEND&(1<<8))
   { 
       rEINTPEND |= 1<< 8;
       Led1_run();
   }
   
    }
}


轮询按键点亮LED

/*************************************************
延时函数
**************************************************/
void delay(int times)
{
    int i,j;
    for(i=0;i<times;i++)
       for(j=0;j<400;j++);
}


/*************************************************
LED初始化
**************************************************/
void Led1_init(void)
{
   rGPBCON &= ~(3<<10);// ÇåÁã
   rGPBCON |= (1<<10);
}


/*************************************************
点亮LED
**************************************************/
void Led1_run(void)
{
   rGPBDAT &=~(1<<5); /*LEDÁÁ»¹ÊÇÃð£¿*/
   delay(1000);
   rGPBDAT |=(1<<5);
   delay(1000);
}


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

按键初始化
***************************************************/
void key_init(void)
{
    rGPGCON &= ~((3<<0) | (3<<6) | (3<<10) | (3<<12) | (3<<14) | (3<<22)) ;
}


/*************************************************
主函数
**************************************************/
void Main(void)
{
   MMU_Init();
   Led1_init();
   key_init();
   
   while(1)
{
        if(!(rGPGDAT & (1<<0)))
{
   Led1_run();
}
else if(!(rGPGDAT & (1<<3)))
{
   Led1_run();
}
else if(!(rGPGDAT & (1<<5)))
{
   Led1_run();
}
else if(!(rGPGDAT & (1<<6)))
{
   Led1_run();
}
else if(!(rGPGDAT & (1<<7)))
{
   Led1_run();
}
else if(!(rGPGDAT & (1<<11)))
{
   Led1_run();
}
   }
}


原创粉丝点击