飞思卡尔 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(;;){}
}
发布了2 篇原创文章 · 获赞 1 · 访问量 1355

猜你喜欢

转载自blog.csdn.net/u011598845/article/details/104152602