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寄存器