中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 2440test中按鍵的分析

        2440test中按鍵的分析

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

        初始化步驟
        1,設置IO的功能,00 輸入 01輸出 02 第二功能 P292
        設置的方法是
        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,設置 EXTINT 系列寄存器,設定中斷觸發(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,設置 EINTPEND,P306
        如果發(fā)生中斷,該寄存器對應的位置一,沒有中斷則為0
        清零的辦法比較特殊,對對應位置一的話表示清零。
        所以這里要這樣做:
        rEINTPEND |= (1<<11)|(1<<13)|(1<<14)|(1<<15);
        4,設置 EINTMASK 寄存器,P305
        0表示允許對應位中斷,1表示禁止對應位中斷,默認是禁止的
        rEINTMASK &= ~((1<<11)|(1<<13)|(1<<14)|(1<<15));
        5,先清一下IRQ中斷
        作為初始化,需要先清一下,注意,剛才 EINTPEND 是清次中斷,
        EXTINT 8-23 都遞屬于 IRQ的中斷號 5,所以這里清的是主IRQ中斷
        ClearPending(BIT_EINT8_23);
        其中 ClearPending(); 是一個內聯(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對應位置1就能清除該位的中斷
        標志了。SRCPND可以有多位置1表示多個發(fā)生中斷,INTPND 表示經(jīng)過
        優(yōu)先級裁決之后,所以同一時間只能有1位是置一的。
        參考 datasheet P391
        #define BIT_EINT8_23(0x1<<5)
        初始化的時候有必要將這兩個東西都清一下

        6,設置 IRQ Handleer執(zhí)行中斷任務
        #define pISR_EINT8_23(*(unsigned *)(_ISR_STARTADDRESS+0x34))
        pISR_EINT8_23 = (U32)Key_ISR;
        這部分的原理在中斷移植的時候已經(jīng)分析過了。這里可以簡單的理解為
        當外部中斷8-23發(fā)生的時候,執(zhí)行中斷服務程序 Key_ISR 。
        注意這個函數(shù)的原型,中斷服務程序,所以不能有參數(shù),也不能返回。
        void Key_ISR(void)
        7,允許中斷
        EnableIrq(BIT_EINT8_23);
        這個宏也在剛才的 2440addr.h 里面,原型是:
        #defineEnableIrq(bit)rINTMSK &= ~(bit)
        很簡單,就是設置 INTMSK 對應的位而已。
        8,分析按鍵中斷處理函數(shù) Key_ISR
        首先
        EnterCritical(&r); 看名字也大概猜出是什么東西了,玩過uCOS應該很
        熟悉,進入臨界區(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中應該放的
        是參數(shù) &r,也就是說,r寄存器的地址,然后將 I 位置一(1表示禁止,
        0表示開啟),最后返回。
        那么相對應的 ExitCritical 函數(shù)也就沒啥懸念了。
        .globalExitCritical
        ExitCritical:
        ldrr1, [r0]
        msrcpsr_cxsf, r1
        MOV_PC_LR
        將 r 寄存器的數(shù)值讀出來,恢復到 cpsr中
        至于 cpsr_cxsf 是什么東西,百度一下就知道了。

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


        關鍵詞: 2440test按

        評論


        技術專區(qū)

        關閉