新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM入門筆記(8)

        ARM入門筆記(8)

        作者: 時間:2016-12-02 來源:網絡 收藏
        中斷控制實驗

        一.背景

        實際上ARM的中斷與51單片機的中斷類似,都有類似的中斷入口地址(ARM稱異常向量表)。只不過 51給兩個相互的中斷入口之間留有足夠的空間(如外部中斷0的中斷入口在03H處,而定時器0的中斷入口在0BH處),在這段空間中可以放多條指令,這樣在編寫中斷處理程序時非常靈活。ARM總共有7種中斷(或異常)類型,它們的入口分別為00H、04H ┄┄ 1CH,入口與入口之間只夠放一條指令,這條通常為“BXX”或者“LDR PC, ResetAddr”的跳轉指令。

        二.實驗目的

        在IRQ中斷向量地址(0x18)處設置一個斷點后全速運行,用按鈕產生PIO中斷輸入信號,使產生中斷,而跳轉到設置的斷點處。

        三.實驗程序和參數設置

        1>連接器選項設置與上個實驗相同
        2> 啟動代碼

        與前幾個實驗相比,使能了IRQ中斷后再跳到C語言的主函數。

        AREA init,CODE,READONLY
        CODE32
        Mode_USR EQU0x10 ;CPSR中各種處理器模式對應的控制位
        USR_Stack EQU0x00204000 ;定義RAM的最高地址,無重映射
        ENTRY
        B InitReset ; 0x00 Reset handler
        Undefvec B undefvec ; 0x04 Undefined Instruction
        swivec B swivec ; 0x08 Software Interrupt
        pabtvec B pabtvec ; 0x0C Prefetch Abort
        dabtvec B dabtvec ; 0x10 Data Abort
        rsvdvec B rsvdvec ; 0x14 reserved
        irqvec B irqvec ; 0x18 IRQ
        fiqvec B fiqvec ; 0x1c FIQ
        InitReset
        MSR CPSR_c,#Mode_USR ;使能FIQ,IRQ中斷
        LDR SP,=USR_Stack
        IMPORT main
        b main
        END

        3> C語言代碼

        #i nclude "AT91SAM7S64.h"
        #i nclude "Board.h"
        unsigned int Key_Val;
        unsigned int key;
        int main(void)
        {
        *AT91C_PMC_SCER = 0x1; //使能系統時鐘寄存器的處理器時鐘
        *AT91C_PMC_PCER = 1 91C_ID_PIOA; //使能PIOA外圍時鐘
        *AT91C_PIOA_PER = SW_MASK; //使能KEY引腳的I/O口功能
        *AT91C_AIC_IDCR = 1 91C_ID_PIOA; //禁止PIO外圍中斷功能
        *AT91C_PIOA_ODR = SW_MASK;//使能4個KEY管腳的輸入功能
        AT91C_BASE_AIC -> AIC_SMR[AT91C_ID_PIOA] = AT91C_AIC_PRIOR_HIGHEST| AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED;//中斷模式(優先級和觸發模式)
        *AT91C_AIC_ICCR = 1 91C_ID_PIOA; //中斷清除
        *AT91C_PIOA_IDR = 0xffffffff; //禁止所有PIO口的中斷功能
        *AT91C_PIOA_IER = SW3_MASK; //使能PIO的SW3腳中斷功能
        *AT91C_AIC_IECR = 1 91C_ID_PIOA; //使能PIO外圍中斷功能
        while (1);
        }

        四.出現的問題與解決方法

        1> CPU進不了中斷,即跳不到IRQ中斷向量入口地址。

        原因是打開了Memory窗口,觀察中斷相關的寄存器。AXD軟件為了在Memory窗口中刷新這些寄存器值,在程序運行過程中會訪問CPU中相應寄存器值。當中斷源觸發后,在跳到IRQ的中斷入口之前,IRQ的中斷向量寄存器AIC_IVR就因為上述原因被讀過 ,這時CPU就認為已經完成對IRQ中斷的處理,因此就不再跳轉到IRQ中斷入口。

        2> 剛一執行“MSR CPSR_c,#Mode_USR”語句使能IRQ中斷,CPU就立即產生IRQ中斷。

        原因當上一次產生IRQ中斷后,沒有讀PIO的中斷狀態寄存器,將其清零。因為中斷狀態寄存器置1時表示自從上一次讀取此寄存器,至少檢測到了一次電平變化。所以當沒有讀該寄存器時,該狀態位會一直保持著。又因為在重新裝載程序進行調試時,沒有復位目標CPU,所以當使能IRQ中斷后,由于PIO中斷狀態寄存器為1的原因而產生中斷。

        五.總結

        個人認為ARM的中斷與51的中斷,在本質上并沒有多大的區別,出現上述的問題是由于它們在仿真、調試時的差異造成。在用普通的51仿真器進行仿真、調試時,如果我們不進行如單步、全速等執行程序運行,內部的各種寄存器、狀態寄存器等是不會改變的,此時目標的CPU處于停止一樣。而用ARM仿真器進行仿真、調試時,當你不進行如單步、全速等執行程序運行,內部的各種寄存器、狀態寄存器還可能會改變,目標的CPU還會處處響應外部,這種情況在調試內部定時器時會更加明顯。


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 应城市| 仪征市| 孝昌县| 唐海县| 察哈| 都匀市| 云和县| 民勤县| 无为县| 理塘县| 报价| 上饶市| 瑞金市| 广安市| 崇信县| 治多县| 西贡区| 玛多县| 岳池县| 阳朔县| 建水县| 义马市| 淮阳县| 临海市| 威宁| 赫章县| 内黄县| 开原市| 咸阳市| 广水市| 焉耆| 武强县| 民勤县| 大悟县| 乌什县| 固镇县| 井陉县| 平顶山市| 叶城县| 昌黎县| 德惠市|