210中断 笔记

/*interrupt registes*/
#define EXT_INT_2_CON       *((volatile unsigned int *)0xE0200E08)   
#define EXT_INT_2_MASK      *((volatile unsigned int *)0xE0200F08)       
#define VIC0INTENABLE       *((volatile unsigned int *)0xF2000010)   
#define key_VICADDR         *((volatile unsigned int *)0xF2000140)     
#define VIC0ADDRESS         *((volatile unsigned int *)0xF2000F00)   
#define EXT_INT_2_PEND      *((volatile unsigned int *)0xE0200F48)  

void key_isr()
{
    volatile unsigned int key_code;
     /* 计算返回地址:PC的值等于当前执行的地址+8,当CPU正要执行某条指令时(还未执行),被中断, 
     这是这条刚要执行的指令的地址刚好=PC-4 */  
    __asm__( 
    
    "sub lr, lr, #4\n"  
    "stmfd sp!, {r0-r12, lr}\n"     /* 保护现场 */    
    : 
    : 
   );

 
    key_code = EXT_INT_2_PEND & 0b11; //清中断挂起寄存器,向该寄存器写1就可以清除
							//查看具体中断源。判断具体哪个按键按下。
    switch(key_code) 
    {
        case 1: //K1
            led_on();
            break;
		
        case 2: //K2
            led_off();
            break;
		
        default:
            break;
    }
	
    /* 清除中断 */    
    EXT_INT_2_PEND =  ~0x0;  //清中断挂起寄存器,向该寄存器写1就可以清除
    VIC0ADDRESS = 0;/* 清中断向量寄存器 */ 
   
    __asm__( 
    "ldmfd sp!, {r0-r12, pc}^ \n"        /* ^表示把spsr恢复到cpsr */  
    : 
    : 
  );
}



void init_irq()
{
    EXT_INT_2_CON = 0b010 | (0b010<<4);    /*下降沿触发中断*/
    EXT_INT_2_MASK = 0;                   /* 取消屏蔽外部中断*/  
 
    VIC0INTENABLE = 0b1<<16;              /* 选择外部中断EXT_INT[16]为IRQ类型的中断 */  
    key_VICADDR = (int)key_isr;           /*由于key1~key4属于同一中断源,所以只需设置一个地址*/
    
    __asm__( 
    /*开中断*/  
    "mrs r0,cpsr\n"
    "bic r0, r0, #0x80\n"
    "msr cpsr_c, r0\n"            
    : 
    : 
  );
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值