1. 程式人生 > >2440 外部中斷

2440 外部中斷

star 分享 fine 例如 instr src 數據手冊 trigger alt

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 外部中斷