飛思卡爾 MC9S12XS128 單片機自學筆記 - TIM定時器(一)

飛思卡爾 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(;;){}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章