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寄存器
2440 外部中斷