飛思卡爾 MC9S12XS128 單片機自學筆記
TIM定時器模塊(一)
文章目錄
0. 概述
TIM定時器模塊主要有三個功能,輸入捕捉,輸出比較,脈衝累加。
- 輸入捕捉: 當引腳有電平變化時,捕捉當前計數器值。
- 輸出比較: 當計數器達到某值時,引腳輸出電平。
- 脈衝累加: 計數模式 - 輸入電平變化時,累加器+1; 門控模式 - 輸入電平變化時,記錄脈衝長度。
1. 寄存器簡述(常用輸入/輸出)
在這裏先簡單介紹輸入/輸出功能中常用的寄存器
1.1 TCSR1 定時器控制系統寄存器1
1.2 TCSR2 定時器控制系統寄存器2
1.3 TCNT 定時器計數寄存器
1.4 TFLG1 主定時器中斷標誌寄存器1
1.5 TFLG2 主定時器中斷標誌寄存器2
1.6 TIE 定時器中斷開關寄存器
1.7 TIOS 定時器輸入輸出選擇寄存器
1.8 TCn 定時器輸入輸出數值寄存器
1.9 TCTL1&2 定時器輸出模式寄存器
1.10 TCTL3&4 定時器輸入模式寄存器
2. 計數器時間間隔計算
比如總線頻率(Bus Clock)爲32MHz。我們想用1/128的分頻係數(TCSR2的PR2,PR1,PR0爲1 1 1)。那麼計數器頻率是32MHz/128=250KHz(1秒/250KHz=4us)。也就是說計數器每+1,時間就過了4us。
3. 輸入捕捉代碼示例
比如,我們想根據PT0引腳輸入高電平信號記錄下當前計數器數值。
//輸入捕捉代碼,假設總線頻率爲32MHz
unsigned int myCount;
void InitTimIC() //TIM初始化
{
TSCR1_TFFCA=1; //所有中斷標識復位
TSCR1_TEN=1; //定時器開啓
TIOS=0xfe; //1111 1110 PT0設爲輸入捕捉
TCTL4=0x01; //0000 0001 EDG0B:EDG0A = 0:1 上升沿捕捉
TIE=0x01; //0000 0001 PT0允許申請中斷
TSCR2=0x07 //0000 0111 分頻係數1/128, 32MHz/128=4us
TFLG1=0xff; //1111 1111 寫入1,清零所有通道中斷標誌
TFLG2=0xff; //1111 1111 寫入1,清零TOF中斷溢出標誌
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED //中斷區
//根據Includes->MC9S12XS128.h文件中定義#define VectorNumber_Vtimch0 8U,因此如果PT0的C0F=1,其對應的interrupt向量爲8
void interrupt 8 IC_PT0()
{
myCount=TCNT; //讀取計數器數值
if(TFLG1_COF) //如果C0F=1中斷標誌存在
{
TFLG1_C0F=1; //C0F寫入1,清零,消除中斷標誌
}
_asm(nop); _asm(nop);
_asm(nop); _asm(nop);
_asm(nop); _asm(nop);
_asm(nop); _asm(nop);
_asm(nop); _asm(nop);
}
#pragma CODE_SEG DEFAULT
void main() //主函數
{
DisableInterrupts;
InitPLL();
InitTimIC();
EnableInterrupts;
for(;;){}
}