<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Freescale 9S12 系列單片機(jī)應(yīng)用筆記(ECT 模塊) 1

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

          作者: 時(shí)間:2016-11-20 來(lái)源:網(wǎng)絡(luò) 收藏
          9S12系列單片機(jī)ECT(EnhancedCaptureTimerModule)模塊是在原68HC12的StandardTimermodule基礎(chǔ)上加以增強(qiáng)功能形成的。

          本文引用地址:http://www.ex-cimer.com/article/201611/318815.htm

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

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

          圖1ECT模塊結(jié)構(gòu)示意圖

          從上面示意圖中可以就看出,ECT模塊相當(dāng)?shù)膹?fù)雜,不是簡(jiǎn)單的幾句話就能說(shuō)明白的。我也是通過(guò)很長(zhǎng)時(shí)間的學(xué)習(xí)實(shí)踐,才逐步掌握了ECT模塊的使用。

          本文將通過(guò)一系列的實(shí)例,從最簡(jiǎn)單的功能開(kāi)始,逐步展開(kāi)。一步一步的展示ECT模塊的強(qiáng)大功能。

          實(shí)驗(yàn)1:自由運(yùn)行計(jì)數(shù)器(TCNT)與溢出中斷

          自由運(yùn)行計(jì)數(shù)器(TCNT)也稱為自由運(yùn)行主定時(shí)器,是一個(gè)16位的計(jì)數(shù)器,可以說(shuō)是ECT的核心。在系統(tǒng)復(fù)位時(shí),這個(gè)自由運(yùn)行計(jì)數(shù)器的初值為$0000。當(dāng)ECT模塊運(yùn)行時(shí),自由運(yùn)行計(jì)數(shù)器從$0000~$FFFF循環(huán)遞增計(jì)數(shù)。當(dāng)計(jì)數(shù)器溢出復(fù)零時(shí),會(huì)置位中斷標(biāo)志。利用這個(gè)計(jì)數(shù)器,可以產(chǎn)生一個(gè)周期的中斷信號(hào)。

          TCNT的輸入時(shí)鐘也是可以選擇的,圖2給出了TCNT的時(shí)鐘源的示意圖??梢钥闯觯琓CNT的輸入時(shí)鐘可以來(lái)源于總線時(shí)鐘、總線時(shí)鐘經(jīng)過(guò)預(yù)分頻、外部引腳輸入的脈沖、外部引腳輸入脈沖經(jīng)過(guò)脈沖累加器分頻這四種選擇。當(dāng)然,選擇哪個(gè)時(shí)鐘源其實(shí)就是在程序中設(shè)置一下相應(yīng)的寄存器這么簡(jiǎn)單。

          圖2TCNT的時(shí)鐘源

          了解了上面的介紹,就可以開(kāi)始本文的第一個(gè)例子了,這個(gè)例子非常簡(jiǎn)單,將BUSCLOCK分頻后作為TCNT的輸入時(shí)鐘,使能TCNT溢出中斷。

          在開(kāi)始代碼之前,還需要介紹幾個(gè)程序中用到的寄存器。

          TCNT寄存器(TimerCountRegister)

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

          圖3TCNT寄存器

          TFLG2寄存器(MainTimerInterruptFlag2)

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

          圖4TFLG2寄存器

          TSCR2寄存器(TimerSystemControlRegister2)

          這個(gè)寄存器由三部分功能組成。

          TOI位是TimerOverflowInterruptEnable的簡(jiǎn)寫。TOI位為0時(shí)表示禁止TCNT溢出中斷,這時(shí)只能通過(guò)輪詢TOF位來(lái)判斷是TCNT計(jì)數(shù)器是否溢出了。TOI位為1表示使能TCNT溢出中斷。

          TCRE位是TimerCounterResetEnable的簡(jiǎn)寫。TCRE位為0表示TCNT自由運(yùn)行,TCRE位為1表示當(dāng)TCNT=OC7時(shí)復(fù)位。

          PR2、PR1、PR0是總線時(shí)鐘的預(yù)分頻因子。當(dāng)PR2-0組成的三位2進(jìn)制數(shù)為N時(shí),表示將BUSCLOCK分頻2^N。

          圖5TSCR2寄存器

          TSCR1寄存器(TimerSystemControlRegister1)

          TEN位為0時(shí)ECT模塊被禁用。TEN位為1時(shí)ECT模塊被使能。

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

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

          TFFCA(TimerFastFlagClearAll)我還沒(méi)仔細(xì)研究,作用不明。

          圖6TSCR1寄存器

          有了上面這些介紹,就可以很容易的看懂下面的代碼了。在我的實(shí)驗(yàn)板上,晶振頻率為16.384MHz,因?yàn)闆](méi)有開(kāi)啟PLL,BUSCLOCK為8.192MHz,內(nèi)核頻率為16.384MHz。8.192MHz被128預(yù)分頻后為64KHz,16位計(jì)數(shù)器溢出頻率為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. }



          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();