ARM中断

中断触发方式

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();
}
   }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值