Freescale 9S12 系列單片機(jī)應(yīng)用筆記(ECT 模塊) 1
ECT模塊主要由以下幾部分組成,參看圖1:
- 一個帶可編程預(yù)分頻的16位向上計數(shù)的自由運行計數(shù)器
- 8個獨立的定時器通道,每個通道具備輸入捕捉/輸出比較功能
- 4個8位脈沖累加器,也可設(shè)置成2個16位脈沖累加器
- 一個帶可編程預(yù)分頻的16位的向下計數(shù)的計數(shù)器
圖1ECT模塊結(jié)構(gòu)示意圖
從上面示意圖中可以就看出,ECT模塊相當(dāng)?shù)膹?fù)雜,不是簡單的幾句話就能說明白的。我也是通過很長時間的學(xué)習(xí)實踐,才逐步掌握了ECT模塊的使用。
本文將通過一系列的實例,從最簡單的功能開始,逐步展開。一步一步的展示ECT模塊的強(qiáng)大功能。
實驗1:自由運行計數(shù)器(TCNT)與溢出中斷
自由運行計數(shù)器(TCNT)也稱為自由運行主定時器,是一個16位的計數(shù)器,可以說是ECT的核心。在系統(tǒng)復(fù)位時,這個自由運行計數(shù)器的初值為$0000。當(dāng)ECT模塊運行時,自由運行計數(shù)器從$0000~$FFFF循環(huán)遞增計數(shù)。當(dāng)計數(shù)器溢出復(fù)零時,會置位中斷標(biāo)志。利用這個計數(shù)器,可以產(chǎn)生一個周期的中斷信號。
TCNT的輸入時鐘也是可以選擇的,圖2給出了TCNT的時鐘源的示意圖??梢钥闯?,TCNT的輸入時鐘可以來源于總線時鐘、總線時鐘經(jīng)過預(yù)分頻、外部引腳輸入的脈沖、外部引腳輸入脈沖經(jīng)過脈沖累加器分頻這四種選擇。當(dāng)然,選擇哪個時鐘源其實就是在程序中設(shè)置一下相應(yīng)的寄存器這么簡單。
圖2TCNT的時鐘源
了解了上面的介紹,就可以開始本文的第一個例子了,這個例子非常簡單,將BUSCLOCK分頻后作為TCNT的輸入時鐘,使能TCNT溢出中斷。
在開始代碼之前,還需要介紹幾個程序中用到的寄存器。
TCNT寄存器(TimerCountRegister)
這個寄存器其實已經(jīng)介紹過了,它是一個16位的只讀寄存器。在每個時鐘輸入下計數(shù)值會自動加1,當(dāng)計數(shù)值為0xFFFF后下一個時鐘脈沖會使計數(shù)器溢出為0x0000。程序中可以隨時讀取TCNT的值,唯一需要注意的是TCNT是個16位的寄存器,讀取時要一次將其讀出,如果分為高低兩個字節(jié)讀取,讀到的數(shù)據(jù)不一定能拼接成一個有效的計數(shù)值。
圖3TCNT寄存器
TFLG2寄存器(MainTimerInterruptFlag2)
這個寄存器只有最高位TOF是有意義的。當(dāng)TCNT溢出時會置位TOF位,程序中可以輪詢這一位來判斷TCNT是否溢出了。當(dāng)然這種輪詢的方法效率很低,更實用的方法是利用TCNT溢出中斷。向TOF位寫1會清除TOF,在TCNT溢出中斷中就必須清除TOF,否則就不會響應(yīng)下一次溢出中斷。
圖4TFLG2寄存器
TSCR2寄存器(TimerSystemControlRegister2)
這個寄存器由三部分功能組成。
TOI位是TimerOverflowInterruptEnable的簡寫。TOI位為0時表示禁止TCNT溢出中斷,這時只能通過輪詢TOF位來判斷是TCNT計數(shù)器是否溢出了。TOI位為1表示使能TCNT溢出中斷。
TCRE位是TimerCounterResetEnable的簡寫。TCRE位為0表示TCNT自由運行,TCRE位為1表示當(dāng)TCNT=OC7時復(fù)位。
PR2、PR1、PR0是總線時鐘的預(yù)分頻因子。當(dāng)PR2-0組成的三位2進(jìn)制數(shù)為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)我還沒仔細(xì)研究,作用不明。
圖6TSCR1寄存器
有了上面這些介紹,就可以很容易的看懂下面的代碼了。在我的實驗板上,晶振頻率為16.384MHz,因為沒有開啟PLL,BUSCLOCK為8.192MHz,內(nèi)核頻率為16.384MHz。8.192MHz被128預(yù)分頻后為64KHz,16位計數(shù)器溢出頻率為0.98Hz(64000/65536)
- #include
/*commondefinesandmacros*/ - #include"derivative.h"/*derivative-specificdefinitions*/
- #include"sci.h"
- voidECTInit(void)
- {
- TSCR2_PR=7;//prescalefactoris8,busclock/128=8MHz/128=64KHz
- TSCR2_TOI=1;//timeroverflowinterruptenable
- TSCR1_TEN=1;//timerenable
- }
- voidmain(void)
- {
- SCIInit();
- SCISetBaudRate(SCI0,9600,8192000L);
- ECTInit();
- EnableInterrupts;
- for(;;)
- {
- _FEED_COP();/*feedsthedog*/
- }/*loopforever*/
- }
- interruptVectorNumber_VtimovfvoidECT_TimerOverflow_ISR(void)
- {
- TFLG2_TOF=1;//cleartimeroverflowflag
- SCIPutChar(SCI0,x);
- }
評論