新聞中心

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

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

        作者: 時間:2016-11-28 來源:網絡 收藏
        ARM9S3C2440的寄存器特別多,這也是它和單片機不同處之一,對ARM的編程主要也是對寄存器的操作,可是寄存器多了以后,就很容易忘記對某個寄存器的設置,如果能夠總結一下寄存器配置的步驟,使得其有章可循,那么應用的時候就可以對號入座了。如果長時間不去使用ARM的話,再次使用的時候重新翻看煩人的芯片用戶手冊,顯得就浪費時間了,這樣,趁著熟悉的時候記錄下這些要點,以后稍加翻看就能喚起記憶,這也是自己寫這些博客的緣由。

        定時器初始化配置步驟主要有:

        本文引用地址:http://www.104case.com/article/201611/322616.htm

        1、rTCFG0和rTCFG1的設置

        首先要設置定時器的時鐘頻率,

        TimerinputclockFrequency=PCLK/{prescalervalue+1}/{dividervalue}

        TCFG0的[7:0]保存的是定時器0和定時器1的prescalervalue,[15:8]保存的是定時器2和定時器3以及定時器4的prescalervalue。

        TCFG1從低位開始每四位表示dividervalue。

        0000=1/2

        0001=1/4

        0010=1/8

        0011=1/16

        01xx=ExternalTCLK0

        比如:rTCFG0=49;//pclk/(49+1)

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

        2、rTCNTBx和rTCMPBx的設置

        設置TCON啟動定時器x(x表示0-4,2440有5個16位的定時器,定時器0-3有PWM功能,有輸出引腳,定時器4沒有輸出引腳),這時TCNTBx→TCNTx,TCMPBx→TCMPx,在定時器的工作頻率下,TCNTx開始減1,其值可以讀取TCNTOx獲取。當TCNTx=TCMPx時,定時器x的輸出管腳TOUTx反轉,TCNTx繼續減1計數,當TCNTx=0時,其輸出管腳TOUTx再次反轉,并觸發定時器x的中斷。所以作為中斷用的計時值由rTCNTBx確定,用作PWM功能時,PWM的頻率由rTCNTBx確定,占空比由rTCMPBx確定,占空比等于rTCMPBx/rTCNTBx。TOUTx(x=0~3)外接蜂鳴器控制蜂鳴器的頻率或者外接LED燈控制LED燈的亮度,占空比越大,蜂鳴器頻率越大,LED燈越亮。如果不作為PWM用途時,一般將rTCMPB0設置為0。

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

        rTCMPB0=0;

        3、rTCON的設置

        TCON寄存器控制著定時器的啟動(1表示啟動)、是否自動裝載初值(TCNTBx和TCMPBx,1表示自動裝載)、PWM死區是否啟動(,1表示啟用死區)、TOUTx反轉啟動(1表示允許反轉)。

        如:rTCON=0x09;//,啟動定時器,并允許重載TCNTB0、TCMPB0

        4、清IRQ或FIQ中斷,如調用ClearPending(BIT_TIMER0)函數。

        對于子中斷使用ClearSubPending(intbit)。

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

        #defineBIT_TIMER0(0x1<<10)

        ClearPending函數的在頭文件2440addr.h中的定義為:

        __inlinevoidClearPending(intbit)

        {

        registeri;

        rSRCPND=bit;

        rINTPND=bit;

        i=rINTPND;

        }

        __inlinevoidClearSubPending(intbit)

        {

        registeri;

        rSUBSRCPND=bit;

        i=rINTPND;

        ClearPending和ClearSubPending是內聯函數,編譯時,類似宏替換,使用函數體替換調用處的函數名而不是去調用這兩個函數,用增加程序代碼大小的代價換取程序運行的效率,因為函數調用需要保護現場,入棧和出棧耗用CPU時間。

        SRCPND、SUBSRCPND、INTPND相應位為1表示有相應的中斷發生,SRCPND、SUBSRCPND可以有多位同時置1,表示有多個中斷發生,但是INTPND寄存器是經過優先級裁決后的,所以同一時間只能有一位為1。

        另外值得注意的是SRCPND、INTPND、SUBSRCPND三個掛起寄存器的清零不是直接寫入0,而是將對應的位置1,這個一定要注意,當然了,編程的時候直接調用這兩個函數就行,它已經包含在頭文件中,但是了解這個特殊之處還是很有意思的。

        5、rEXTINTx(P301)、rEINTPEND(P306)、rEINTMASK(P305)的設置

        這三種寄存器是對外部中斷而言的,定時器是內部中斷,定時器初始化無需對這些寄存器配置,當用到按鍵、開關等外部中斷就要對這幾個寄存器配置。

        EXTINTx寄存器用于設置25個外部中斷的中斷觸發方式,000=低電平,001高電平,01x=下降沿,0x上升沿,11x邊沿觸發Bothedgetriggered。比如設置外部中斷11,13-15中斷觸發方式為下降沿觸發。

        rEXTINT1&=~(7<<12|7<<20|7<<24|7<<28);
        rEXTINT1|=(2<<12|2<<20|2<<24|2<<28);

        EINTPEND寄存器相應位為1表示相應的外部中斷發生,0表示沒有相應中斷發生,初始化中要對該寄存器清零,防止原有中斷干擾,清零的方式和SRCPND、SUBSRCPND、INTPND三個寄存器的清零方式一樣,向相應位寫入1,但是沒有類似ClearPending的函數調用,必須自己寫。比如外部中斷11,13-15中斷掛起寄存器清零:

        rEINTPEND|=(1<<11)|(1<<13)|(1<<14)|(1<<15);

        EINTMASK寄存器0表示允許對應位中斷,1表示禁止對應位中斷,默認是禁止的,如外部中斷11,13-15中斷允許,相應位寫入0
        rEINTMASK&=~((1<<11)|(1<<13)|(1<<14)|(1<<15));

        另外也要使用ClearPending(BIT_EINT1|BIT_EINT2|BIT_EINT8_23)清中斷掛起寄存器,注意,剛才EINTPEND是清次中斷,EXTINT8-23都遞屬于IRQ的中斷號5,所以這里清的是主IRQ中斷。

        6、rINTMOD(P386)的設置,可選

        一般可以不設置,因為默認為IRQ模式中斷,除非要設置成FIQ模式,INT相應位為1,中斷源為FIQ模式,0表示IRQ模式,FIQ通常用于處理特別緊急的中斷。


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 高碑店市| 长治市| 新野县| 高雄市| 景东| 东山县| 南昌县| 化隆| 海伦市| 博罗县| 新蔡县| 偏关县| 卢氏县| 巫溪县| 大冶市| 象州县| 常德市| 南陵县| 新竹市| 大邑县| 图们市| 乌拉特前旗| 长汀县| 克什克腾旗| 二连浩特市| 瑞安市| 积石山| 武夷山市| 四平市| 茂名市| 娄烦县| 邵阳市| 隆尧县| 宁海县| 郴州市| 丹寨县| 成都市| 宜川县| 化隆| 南郑县| 同德县|