新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 飛思卡爾那些事之定時中斷(PIT)

        飛思卡爾那些事之定時中斷(PIT)

        作者: 時間:2016-11-27 來源:網絡 收藏
        前言:
        上次說到因為源于對英文的恐懼,沒有閱讀英文DATASHEET,想當然的認為XS128單片機中的定時器模塊也和DG128中定時器模塊一樣。結果造成了致命性的錯誤,最后在瘋狂的熬夜中才將問題檢測到。
        當然,找到問題,解決起來就簡單多了。后頭拿起DATASHEET狂肯,終于有所收獲,同時也知道了在XS128單片機中用于定時的另一個模塊:PIT(定時中斷)。為了測試一下定時中斷的,同時也解決之前單片機一直沒辦法進入中斷的問題,特寫了一個簡單的基于定時器中斷的閃爍燈程序。
        目的:
        1、學習使用XS128PIT模塊。
        2、測試XS128核心板的中斷木塊。
        功能描述:
        通過定時中斷實現500MS定時。當定時中斷觸發時,對IO口進行取反操作即可以實現LED500MS的閃爍。
        資源:
        1、XS128核心板,8個LED接XS128的B口。
        2、XS128的PIT模塊。
        PIT說明:
        S12PIT24B4CV1是一個模數遞減計數器。首先給計數寄存器設定一個初值,每經過一個總線周期,計數器進行一次減一操作,當計數器自減溢出時,觸發中斷。因為總線周期是已知的,即可以通過計數器自減實現定時。
        在XS128PIT模塊中,需要用到得是如下幾個寄存器。
        1)、PIT Contorl and force Lad Micro Timer Register(PITCFLMT)
        該寄存器用于PIT模塊的使能設置和工作方式設置。通常設置該寄存器中的PITE為即可,即PITCFLMT_PITE=1,使PIT使能。
        2)、PIT Channel Enable Register(PITCE)
        該寄存器用于對PIT模塊中的4個通道使能進行設置。如果使用某個通道時,對對應位進行置一即可,即PITCE_PCEx=1,其中x代表通道序號,為0~3。
        3)、PIT Micro Timer Load Register 0 to 1 (PITMTLD0-1)
        該寄存器用于設置PIT模塊中的8位計數器初值,以實現24位的計數。設定值為0到255范圍。
        4)、PIT Load Register 0 to 3(PITLD0-3)
        該寄存器用于設置PIT模塊中的16位計數器初值,和8位計數器配合而成24位計數器。設定值范圍0-65535。
        5)、PIT Multiplex Register(PITMUX)
        該寄存器對定時器通道的8位時基進行選擇。因為8位計數器只有兩個,所以在將8位計數器和16位計數器連接時,可以選擇不同的8位時基。
        當設置為0時,對應通道選擇時基0;置一時,對應通道選擇時基1。
        如PITMUX_PMUX0=1為通道0選擇時基1。
        6)、PIT Interrupt Enable Register(PITINTE)
        該寄存器為中斷使能寄存器,為不同的PIT通道中斷使能。設定為0時,相應通道中斷禁止。置一時,相應通道使能。
        如PITINTE_PINTE0=1時,PIT通道0定時中斷使能,當計數器遞減溢出時,申請中斷。
        7)、PIT Time-Out Flag Register(PITTF)
        該寄存器為溢出標志位,當某一通道的8位計數器和16位計數器遞減到0時,該位置一。給改位寫1則清除該標志位。
        可以通過查詢該位來判斷定時是否完成。

        CODE:
        #include
        #include
        #pragma LINK_INFO DERIVATIVE "mc9s12xs128"
        //==================================================
        //定時中斷函數
        //定時中斷0實現500MS定時
        //author:yangtze
        //time:2009/5/2
        //==================================================
        #define PITTIME5000//設定為50MS定時
        unsigned int vTmpPIT=0;

        void pllclk(void)//24MHz,外部時鐘為16MHz
        {
        CLKSEL=0X00;
        PLLCTL=0xe1;
        SYNR=2;//PLLCLK =2*OSCCLK*(SYNR + 1)/(REFDV + 1)
        REFDV=1;
        PLLCTL=0X60;
        asmNOP;
        asmNOP;
        asmNOP;
        while((CRGFLG&0X08)==0);//時鐘校正同步
        CLKSEL=0X80;
        }
        void initIOBoutput(void)//IO口初始化,B口為輸出
        {
        DDRB=0XFF;
        PORTB=0XFF;
        }
        void initPIT(void)//定時中斷初始化函數 50MS定時中斷設置
        {
        PITCFLMT_PITE=0; //定時中斷通道0關
        PITCE_PCE0=1;//定時器通道0使能
        PITMTLD0=240-1;//8位定時器初值設定。240分頻,在24MHzBusClock下,為0.1MHz。即
        10us.
        PITLD0=PITTIME-1;//16位定時器初值設定。PITTIME*0.01MS
        PITINTE_PINTE0=1;//定時器中斷通道0中斷使能
        PITCFLMT_PITE=1;//定時器通道0使能
        }

        void main(void)
        {
        pllclk();
        initIOBoutput();
        initPIT();
        EnableInterrupts;
        for(;;) {}

        }

        #pragma CODE_SEG __NEAR_SEG NON_BANKED
        void interrupt 66 PIT0(void)
        {
        vTmpPIT++;
        if(vTmpPIT==10)
        {
        PORTB=~PORTB;//輸出取反
        vTmpPIT=0;
        }
        PITTF_PTF0=1;//清中斷標志位
        }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 马鞍山市| 太白县| 石渠县| 潢川县| 琼海市| 遵义县| 阿合奇县| 横峰县| 三明市| 唐海县| 宜章县| 星座| 大田县| 济宁市| 抚顺市| 谷城县| 黑水县| 临泽县| 北碚区| 茌平县| 诏安县| 阳新县| 景宁| 金乡县| 伊吾县| 成都市| 金华市| 大石桥市| 和硕县| 罗源县| 娄烦县| 海淀区| 松原市| 凌云县| 赤城县| 城口县| 晋宁县| 班玛县| 五莲县| 南江县| 资兴市|