新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Freescale 9S12 系列單片機應用筆記(ECT 模塊) 1

        Freescale 9S12 系列單片機應用筆記(ECT 模塊) 1

        作者: 時間:2016-11-20 來源:網絡 收藏
        9S12系列單片機ECT(EnhancedCaptureTimerModule)模塊是在原68HC12的StandardTimermodule基礎上加以增強功能形成的。

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

        ECT模塊主要由以下幾部分組成,參看圖1:

        • 一個帶可編程預分頻的16位向上計數的自由運行計數器
        • 8個獨立的定時器通道,每個通道具備輸入捕捉/輸出比較功能
        • 4個8位脈沖累加器,也可設置成2個16位脈沖累加器
        • 一個帶可編程預分頻的16位的向下計數的計數器

        圖1ECT模塊結構示意圖

        從上面示意圖中可以就看出,ECT模塊相當的復雜,不是簡單的幾句話就能說明白的。我也是通過很長時間的學習實踐,才逐步掌握了ECT模塊的使用。

        本文將通過一系列的實例,從最簡單的功能開始,逐步展開。一步一步的展示ECT模塊的強大功能。

        實驗1:自由運行計數器(TCNT)與溢出中斷

        自由運行計數器(TCNT)也稱為自由運行主定時器,是一個16位的計數器,可以說是ECT的核心。在系統復位時,這個自由運行計數器的初值為$0000。當ECT模塊運行時,自由運行計數器從$0000~$FFFF循環遞增計數。當計數器溢出復零時,會置位中斷標志。利用這個計數器,可以產生一個周期的中斷信號。

        TCNT的輸入時鐘也是可以選擇的,圖2給出了TCNT的時鐘源的示意圖。可以看出,TCNT的輸入時鐘可以來源于總線時鐘、總線時鐘經過預分頻、外部引腳輸入的脈沖、外部引腳輸入脈沖經過脈沖累加器分頻這四種選擇。當然,選擇哪個時鐘源其實就是在程序中設置一下相應的寄存器這么簡單。

        圖2TCNT的時鐘源

        了解了上面的介紹,就可以開始本文的第一個例子了,這個例子非常簡單,將BUSCLOCK分頻后作為TCNT的輸入時鐘,使能TCNT溢出中斷。

        在開始代碼之前,還需要介紹幾個程序中用到的寄存器。

        TCNT寄存器(TimerCountRegister)

        這個寄存器其實已經介紹過了,它是一個16位的只讀寄存器。在每個時鐘輸入下計數值會自動加1,當計數值為0xFFFF后下一個時鐘脈沖會使計數器溢出為0x0000。程序中可以隨時讀取TCNT的值,唯一需要注意的是TCNT是個16位的寄存器,讀取時要一次將其讀出,如果分為高低兩個字節讀取,讀到的數據不一定能拼接成一個有效的計數值。

        圖3TCNT寄存器

        TFLG2寄存器(MainTimerInterruptFlag2)

        這個寄存器只有最高位TOF是有意義的。當TCNT溢出時會置位TOF位,程序中可以輪詢這一位來判斷TCNT是否溢出了。當然這種輪詢的方法效率很低,更實用的方法是利用TCNT溢出中斷。向TOF位寫1會清除TOF,在TCNT溢出中斷中就必須清除TOF,否則就不會響應下一次溢出中斷。

        圖4TFLG2寄存器

        TSCR2寄存器(TimerSystemControlRegister2)

        這個寄存器由三部分功能組成。

        TOI位是TimerOverflowInterruptEnable的簡寫。TOI位為0時表示禁止TCNT溢出中斷,這時只能通過輪詢TOF位來判斷是TCNT計數器是否溢出了。TOI位為1表示使能TCNT溢出中斷。

        TCRE位是TimerCounterResetEnable的簡寫。TCRE位為0表示TCNT自由運行,TCRE位為1表示當TCNT=OC7時復位。

        PR2、PR1、PR0是總線時鐘的預分頻因子。當PR2-0組成的三位2進制數為N時,表示將BUSCLOCK分頻2^N。

        圖5TSCR2寄存器

        TSCR1寄存器(TimerSystemControlRegister1)

        TEN位為0時ECT模塊被禁用。TEN位為1時ECT模塊被使能。

        TSWAI(TimerModuleStopsWhileinWait)位為0時,ECT模塊在STOP模式下仍舊運行。TSWAI位為1時,ECT模塊在STOP模式停止運行。

        TSFRZ(TimerandModulusCounterStopWhileinFreezeMode),這一位與TSWAI位類似。

        TFFCA(TimerFastFlagClearAll)我還沒仔細研究,作用不明。

        圖6TSCR1寄存器

        有了上面這些介紹,就可以很容易的看懂下面的代碼了。在我的實驗板上,晶振頻率為16.384MHz,因為沒有開啟PLL,BUSCLOCK為8.192MHz,內核頻率為16.384MHz。8.192MHz被128預分頻后為64KHz,16位計數器溢出頻率為0.98Hz(64000/65536)


        1. #include/*commondefinesandmacros*/
        2. #include"derivative.h"/*derivative-specificdefinitions*/
        3. #include"sci.h"
        4. voidECTInit(void)
        5. {
        6. TSCR2_PR=7;//prescalefactoris8,busclock/128=8MHz/128=64KHz
        7. TSCR2_TOI=1;//timeroverflowinterruptenable
        8. TSCR1_TEN=1;//timerenable
        9. }
        10. voidmain(void)
        11. {
        12. SCIInit();
        13. SCISetBaudRate(SCI0,9600,8192000L);
        14. ECTInit();
        15. EnableInterrupts;
        16. for(;;)
        17. {
        18. _FEED_COP();/*feedsthedog*/
        19. }/*loopforever*/
        20. }
        21. interruptVectorNumber_VtimovfvoidECT_TimerOverflow_ISR(void)
        22. {
        23. TFLG2_TOF=1;//cleartimeroverflowflag
        24. SCIPutChar(SCI0,x);
        25. }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 厦门市| 崇仁县| 滕州市| 深泽县| 施甸县| 隆昌县| 陕西省| 佛山市| 英吉沙县| 海原县| 甘谷县| 梓潼县| 阳东县| 洞口县| 读书| 迭部县| 金溪县| 区。| 漳平市| 安顺市| 阜新市| 清丰县| 永宁县| 平泉县| 浮梁县| 新安县| 康定县| 崇信县| 博客| 徐州市| 上高县| 青岛市| 施秉县| 筠连县| 冷水江市| 杂多县| 神木县| 屯昌县| 濉溪县| 和林格尔县| 杭州市|