新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM9 S3C2440—中斷和定時器的初始化配置

        ARM9 S3C2440—中斷和定時器的初始化配置

        作者: 時間:2016-11-28 來源:網絡 收藏

        7、rPRIORITY(P390)設置,可選

        優先級寄存器設置,設置中斷的優先級,一般不設置,使用默認的優先級即可。

        8、設置中斷程序入口,如pISR_TIMER0=(U32)IRQ_Timer0_Handle;

        外部中斷pISR_EINT8_23=(U32)Key_ISR;

        Key_ISR為中斷程序程序函數名,也就是中斷服務函數的入口地址,這里強制轉換為無符號32位整型。

        pISR_EINT8_23在2440addr.h中的宏定義是

        #definepISR_EINT8_23(*(unsigned*)(_ISR_STARTADDRESS+0x34))

        pISR_EINT8_23就是向量表中的一個地址,當發生外部中斷8-23時,程序轉入中斷向量表相應地址處,而向量表中存放著中斷服務函數的入口地址,程序轉而執行中斷服務程序。

        9、允許中斷,如EnableIrq(BIT_TIMER0);

        允許外部中斷EnableIrq(BIT_EINT0|BIT_EINT2|BIT_EINT8_23);

        這個宏定義在2440addr.h中,原型為

        #defineEnableIrq(bit)rINTMSK&=~(bit)

        #defineEnableSubIrq(bit)rINTSUBMSK&=~(bit)

        到這里,所有的中斷和定時器初始化工作就算完成了!

        10、編寫中斷服務程序

        staticvoid__irqKey_ISR(void){}

        _irq是C關鍵字,它告訴編譯器,這段程序是中斷程序,以便做特殊的處理。在中斷程序里,要做的事情主要有:

        (1)、清中斷源掛起寄存器,如ClearPending(BIT_EINT8_23);

        (2)、對于外部中斷,還要給EINTPEND寄存器相關位清零,如

        rEINTPEND|=1<<11;這兩步的目的是為了防止反復進入中斷,有多個中斷源時,要判斷是哪個中斷源,給相應的位清零。

        (3)、完成中斷特點的功能。如按鍵中斷服務程序

        staticvoid__irqKey_ISR(void)

        {

        U8key;

        if(rINTPND==BIT_EINT8_23)

        {

        ClearPending(BIT_EINT8_23);

        if(rEINTPEND&(1<<11))

        {

        rEINTPEND|=1<<11;

        }

        if(rEINTPEND&(1<<19))

        {

        rEINTPEND|=1<<19;

        }

        }

        if(rINTPND==BIT_EINT0)

        {

        ClearPending(BIT_EINT0);

        }

        if(rINTPND==BIT_EINT2)

        {

        ClearPending(BIT_EINT2);

        }//以上都是對相關寄存器的相應位清零,使用多個中斷時,要條件判斷清哪個位

        此處寫特定功能的中斷程序

        }

        定時器初始化

        voidTimer0_init(void)

        {

        //Timer0init

        rTCFG0=49;//pclk/(49+1)

        rTCFG1=0x03;//16分頻=62500HZ

        rTCNTB0=62500/2;//TCNTB0[15:0]=計數值

        rTCMPB0=0;

        rTCON=0x09;//啟動定時器,允許將計數值重載入TCNTB0、TCMPB0

        ClearPending(BIT_TIMER0);

        pISR_TIMER0=(U32)IRQ_Timer0_Handle;

        EnableIrq(BIT_TIMER0);

        }

        定時器中斷處理函數

        staticvoid__irqIRQ_Timer0_Handle(void)

        {

        ClearPending(BIT_TIMER0);

        此處寫特定功能的中斷程序

        }


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 忻城县| 沙洋县| 澄迈县| 绥芬河市| 平和县| 靖宇县| 留坝县| 京山县| 雷波县| 镇宁| 灵山县| 万山特区| 同江市| 东阳市| 新营市| 平罗县| 万州区| 柏乡县| 阿克陶县| 鹤岗市| 根河市| 阳泉市| 黎城县| 弥勒县| 隆安县| 宁国市| 天津市| 紫云| 台前县| 健康| 株洲市| 东乡族自治县| 准格尔旗| 建水县| 股票| 原阳县| 陆良县| 阿勒泰市| 永春县| 武冈市| 岗巴县|