飞思卡尔 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(;;){}
}