在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            ARM入門筆記(8)

            作者: 時(shí)間:2016-12-02 來源:網(wǎng)絡(luò) 收藏
            中斷控制實(shí)驗(yàn)

            一.背景

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

            二.實(shí)驗(yàn)?zāi)康?br />
            在IRQ中斷向量地址(0x18)處設(shè)置一個(gè)斷點(diǎn)后全速運(yùn)行,用按鈕產(chǎn)生PIO中斷輸入信號(hào),使產(chǎn)生中斷,而跳轉(zhuǎn)到設(shè)置的斷點(diǎn)處。

            三.實(shí)驗(yàn)程序和參數(shù)設(shè)置

            1>連接器選項(xiàng)設(shè)置與上個(gè)實(shí)驗(yàn)相同
            2> 啟動(dòng)代碼

            與前幾個(gè)實(shí)驗(yàn)相比,使能了IRQ中斷后再跳到C語言的主函數(shù)。

            AREA init,CODE,READONLY
            CODE32
            Mode_USR EQU0x10 ;CPSR中各種處理器模式對(duì)應(yīng)的控制位
            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; //使能系統(tǒng)時(shí)鐘寄存器的處理器時(shí)鐘
            *AT91C_PMC_PCER = 1 91C_ID_PIOA; //使能PIOA外圍時(shí)鐘
            *AT91C_PIOA_PER = SW_MASK; //使能KEY引腳的I/O口功能
            *AT91C_AIC_IDCR = 1 91C_ID_PIOA; //禁止PIO外圍中斷功能
            *AT91C_PIOA_ODR = SW_MASK;//使能4個(gè)KEY管腳的輸入功能
            AT91C_BASE_AIC -> AIC_SMR[AT91C_ID_PIOA] = AT91C_AIC_PRIOR_HIGHEST| AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED;//中斷模式(優(yōu)先級(jí)和觸發(fā)模式)
            *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);
            }

            四.出現(xiàn)的問題與解決方法

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

            原因是打開了Memory窗口,觀察中斷相關(guān)的寄存器。AXD軟件為了在Memory窗口中刷新這些寄存器值,在程序運(yùn)行過程中會(huì)訪問CPU中相應(yīng)寄存器值。當(dāng)中斷源觸發(fā)后,在跳到IRQ的中斷入口之前,IRQ的中斷向量寄存器AIC_IVR就因?yàn)樯鲜鲈虮蛔x過 ,這時(shí)CPU就認(rèn)為已經(jīng)完成對(duì)IRQ中斷的處理,因此就不再跳轉(zhuǎn)到IRQ中斷入口。

            2> 剛一執(zhí)行“MSR CPSR_c,#Mode_USR”語句使能IRQ中斷,CPU就立即產(chǎn)生IRQ中斷。

            原因當(dāng)上一次產(chǎn)生IRQ中斷后,沒有讀PIO的中斷狀態(tài)寄存器,將其清零。因?yàn)橹袛酄顟B(tài)寄存器置1時(shí)表示自從上一次讀取此寄存器,至少檢測(cè)到了一次電平變化。所以當(dāng)沒有讀該寄存器時(shí),該狀態(tài)位會(huì)一直保持著。又因?yàn)樵谥匦卵b載程序進(jìn)行調(diào)試時(shí),沒有復(fù)位目標(biāo)CPU,所以當(dāng)使能IRQ中斷后,由于PIO中斷狀態(tài)寄存器為1的原因而產(chǎn)生中斷。

            五.總結(jié)

            個(gè)人認(rèn)為ARM的中斷與51的中斷,在本質(zhì)上并沒有多大的區(qū)別,出現(xiàn)上述的問題是由于它們?cè)诜抡?、調(diào)試時(shí)的差異造成。在用普通的51仿真器進(jìn)行仿真、調(diào)試時(shí),如果我們不進(jìn)行如單步、全速等執(zhí)行程序運(yùn)行,內(nèi)部的各種寄存器、狀態(tài)寄存器等是不會(huì)改變的,此時(shí)目標(biāo)的CPU處于停止一樣。而用ARM仿真器進(jìn)行仿真、調(diào)試時(shí),當(dāng)你不進(jìn)行如單步、全速等執(zhí)行程序運(yùn)行,內(nèi)部的各種寄存器、狀態(tài)寄存器還可能會(huì)改變,目標(biāo)的CPU還會(huì)處處響應(yīng)外部,這種情況在調(diào)試內(nèi)部定時(shí)器時(shí)會(huì)更加明顯。


            關(guān)鍵詞: ARM入門筆記中斷控

            評(píng)論


            技術(shù)專區(qū)

            關(guān)閉