2440 外部中断

2440外部中断的使用

1、设置io为外部中断引脚

  通过2440数据手册可以知道需要使用io的外部中断需要配置那些位

  

  a、通过上面的表格可以看出,如果要使用io的外部中断需要把对应的位设置为10

  例如:GPF0和GPF2这两个io需要使用外部中断

GPFCON &= ~((3<<0)|(3<<4));//清除相应位
GPFCON |=  ((2<<0)|(2<<4));//设置相应位为外部中断引脚

  

  b、通过上面这个表格可以看出,需要设置外部中断的触发,可以通过设置相对应的位实现,低电平,高电平,下降沿,上升沿,双边沿触发

   例如:GPF0和GPF2这两个io需要使用双边沿触发,就是下降沿上升沿都触发。

    

EXTINT0 |= ((7<<0)|(7<<8));// config eint0 and eint2 is both edge triggered双边沿触发

  

    c、通过上面这个表格可以看出,外部中断的使能是需要操作EINTMASK这个寄存器的。外部中断0-3不需要设置这个寄存器,默认是使能的。

    例如:需要EINT11 和EINT19的外部中断可以这样设置

    

EINTMASK &=~(1<<11);//使能外部中断11
EINTMASK &=~(1<<19);//使能外部中断19

    通过上面三个步骤,外部中断的IO设置就可以了

2、设置中断控制器允许外部中断

    

      这里需要设置,INTMSK寄存器,使得中断屏蔽寄存器无效,不屏蔽对应的中断。

      例如:这里关闭了,EINT0,TINT2,EINT8_23的中断屏蔽      

INTMSK &=~((1<<0)|(1<<2)|(1<<5));

3、开启中断总开关CPSR的I位

  

     

//保存现场
        ldr sp, =0x33d00000//指定sp到64m的最高地址
        sub lr,lr,#4
        stmdb sp!,{r0-r12,lr}//保存r0-r12 和lr寄存器中的值到堆栈中
        //lr是异常处理完后的返回地址,也要保存
        //处理函数
        bl interrupt_fun
        //恢复现场    
        ldmia sp!,{r0-r12,pc}^// 恢复现场,从堆栈中取出r0-r12 和lr寄存器的值

//切换到urs mode
    mrs r0,cpsr    //读出cpsr
    bic r0,r0,#0xf //修改m4-m0为0xb10000,进入urs模式
    bic r0,r0,#(1<<7)// 开启cpu的中断允许开关
    msr cpsr,r0    //将r0存入cpsr
    //设置sp
    ldr sp,=0x33f00000

    中断向量表:

 

_start:
    b hede         //Reset addr                复位地址         0x0
    ldr pc,undefin  //Undefined instructoin 未定义异常        0x4
    ldr pc,swi_addrs//software interrupt    软中断             0x8
    b halt           //pretetch abort                         0xc
    b halt         //data abort                          0x10
    b halt         //reserved                            0x14
    ldr pc,irq_addrs //irq interrupt        中断异常         0x18
    b halt         //fiq                    快中断异常        0x1c

4、处理中断

  a、分辨中断源通过 INTOFFSET中的值判断是什么中断

  

    

int bit = INTOFFSET;
    //调用对应的处理函数
    if(bit ==0 ||bit == 2 ||bit == 5)
        {
            key_eint_irq(bit);
        }

  b、中断处理  EINTPEND(外部中断等待寄存器)寄存器中存放的值判断是外部中断几

    

  c、清除中断  清除中断是从源头开始清除的 。

    1)清除EINTPEND中的对应位  EINTPEND是一个可读可写的寄存器,所以只需要读出什么值,就写入什么值就可以清除中断等待位

      

     2)清除SRCPND寄存器

      

     3)清除INTPND寄存器

      

原文地址:https://www.cnblogs.com/hjxzjp/p/8735188.html