在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,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>

            新聞中心

            2440test中按鍵的分析

            作者: 時間:2016-12-02 來源:網(wǎng)絡(luò) 收藏
            這里分析了4個按鍵,還有 ENIT8 和 EINT19沒有,不過原理一樣的。
            4個按鍵,分別是
            EINT11 / GPG3
            EINT13 / GPG5
            EINT14 / GPG6
            EINT15 / GPG7
            外部上拉電阻。
            EINT 8-23 共用一個IRQ向量。

            初始化步驟
            1,設(shè)置IO的功能,00 輸入 01輸出 02 第二功能 P292
            設(shè)置的方法是
            rGPGCON &= ~(3<<3*2 | 3<<5*2 | 3<<6*2 | 3<<7*2);
            rGPGCON |= (2<<3*2 | 2<<5*2 | 2<<6*2 | 2<<7*2);
            2,設(shè)置 EXTINT 系列寄存器,設(shè)定中斷觸發(fā)的類型 P301
            其中這次用到的 EINT11 13-15是分布在 EXTINT1 中
            觸發(fā)類型
            000 低電平 001 高電平 01x 下降弦 10x 上升弦 11x 邊緣觸發(fā)
            rEXTINT1 &= ~(7<<12 | 7<<20 | 7<<24 | 7<<28);
            rEXTINT1 |= (2<<12 | 2<<20 | 2<<24 | 2<<28);
            3,設(shè)置 EINTPEND,P306
            如果發(fā)生中斷,該寄存器對應(yīng)的位置一,沒有中斷則為0
            清零的辦法比較特殊,對對應(yīng)位置一的話表示清零。
            所以這里要這樣做:
            rEINTPEND |= (1<<11)|(1<<13)|(1<<14)|(1<<15);
            4,設(shè)置 EINTMASK 寄存器,P305
            0表示允許對應(yīng)位中斷,1表示禁止對應(yīng)位中斷,默認(rèn)是禁止的
            rEINTMASK &= ~((1<<11)|(1<<13)|(1<<14)|(1<<15));
            5,先清一下IRQ中斷
            作為初始化,需要先清一下,注意,剛才 EINTPEND 是清次中斷,
            EXTINT 8-23 都遞屬于 IRQ的中斷號 5,所以這里清的是主IRQ中斷
            ClearPending(BIT_EINT8_23);
            其中 ClearPending(); 是一個內(nèi)聯(lián)函數(shù),原型在 2440addr.h
            由于在頭文件里面不適宜放函數(shù)的實現(xiàn),所以這次移植將函數(shù)體放到
            2440lib.c 里面,而 2440addr.h 保留函數(shù)的定義
            __inline void ClearPending(int bit)
            {
            register i;
            rSRCPND = bit;
            rINTPND = bit;
            i = rINTPND;
            }
            函數(shù)很簡單,跟前面一樣,在 INTPND對應(yīng)位置1就能清除該位的中斷
            標(biāo)志了。SRCPND可以有多位置1表示多個發(fā)生中斷,INTPND 表示經(jīng)過
            優(yōu)先級裁決之后,所以同一時間只能有1位是置一的。
            參考 datasheet P391
            #define BIT_EINT8_23(0x1<<5)
            初始化的時候有必要將這兩個東西都清一下

            6,設(shè)置 IRQ Handleer執(zhí)行中斷任務(wù)
            #define pISR_EINT8_23(*(unsigned *)(_ISR_STARTADDRESS+0x34))
            pISR_EINT8_23 = (U32)Key_ISR;
            這部分的原理在中斷移植的時候已經(jīng)分析過了。這里可以簡單的理解為
            當(dāng)外部中斷8-23發(fā)生的時候,執(zhí)行中斷服務(wù)程序 Key_ISR 。
            注意這個函數(shù)的原型,中斷服務(wù)程序,所以不能有參數(shù),也不能返回。
            void Key_ISR(void)
            7,允許中斷
            EnableIrq(BIT_EINT8_23);
            這個宏也在剛才的 2440addr.h 里面,原型是:
            #defineEnableIrq(bit)rINTMSK &= ~(bit)
            很簡單,就是設(shè)置 INTMSK 對應(yīng)的位而已。
            8,分析按鍵中斷處理函數(shù) Key_ISR
            首先
            EnterCritical(&r); 看名字也大概猜出是什么東西了,玩過uCOS應(yīng)該很
            熟悉,進(jìn)入臨界區(qū),臨界區(qū)這里的意思是不允許其他中斷,也就是說在
            處理的過程中禁止其他的IRQ中斷,也就是說IRQ中斷不能嵌套,這樣做
            的話就方便很多了。
            .globalEnterCritical
            EnterCritical:
            mrsr1, cpsr
            strr1, [r0]
            orrr1, r1, #NOINT
            msrcpsr_cxsf, r1
            MOV_PC_LR
            在 2440slib.s 中定義匯編函數(shù),其實功能非常簡單,先讀出 cpsr,保存
            到R0中,因為這里是根據(jù)ATPCS的匯編和C的參數(shù)傳遞規(guī)則,R0中應(yīng)該放的
            是參數(shù) &r,也就是說,r寄存器的地址,然后將 I 位置一(1表示禁止,
            0表示開啟),最后返回。
            那么相對應(yīng)的 ExitCritical 函數(shù)也就沒啥懸念了。
            .globalExitCritical
            ExitCritical:
            ldrr1, [r0]
            msrcpsr_cxsf, r1
            MOV_PC_LR
            將 r 寄存器的數(shù)值讀出來,恢復(fù)到 cpsr中
            至于 cpsr_cxsf 是什么東西,百度一下就知道了。

            if(rINTPND==BIT_EINT8_23)
            首先判斷當(dāng)前的 IRQ 中斷是否 EINT 8-23,是的話再根絕 EINTPEND 分析
            是哪個外部中斷源。
            ClearPending(BIT_EINT8_23); 每次中斷都要清一下的,以便能接受下一次
            中斷,
            if(rEINTPEND&(1<<11))
            這里就很簡單了,判斷 EINTPEND 對應(yīng)的位是否為1則能判斷出是否該路
            rEINTPEND |= 1<< 11;
            同樣了,知道是哪個中斷還得清一下標(biāo)志位。


            關(guān)鍵詞: 2440test按

            評論


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

            關(guān)閉