Download presentation
Presentation is loading. Please wait.
Published byGodfrey Hodges Modified 6年之前
1
第六章 定时器 6.1 定时器模块概述 S12X定时器模块在标准定时器(TIM)基础上增加了一些新功能,称为增强型定时器模块(Enhanced Capture Timer Module, ECT) 有以下特点: 1个16位自由运行计数器; 8个具有16位缓冲寄存器的输入捕捉通道; 4个8位脉冲累加器可以通过级联形成2个16位的脉冲累加器(A/B) 1个具有4位预分频器的16位递减模数计数器; 4个可选的延迟计数器用来增强输入抗干扰能力。 重庆大学通信工程学院 任勇 王毅
2
定时器的基本结构 ECT定时器模块的中断---13个中断向量 IOC0 … IOC7 预分频因子 16 位自由计数器 位模数计数器 寄存器组
位脉冲累加器 A B 输入捕捉 输出比较 通道 7 总线时钟 上溢出中断 下溢出中断 定时器通道 中断 ~ PA 溢出中断 输入中断 PB ECT定时器模块的中断---13个中断向量 8个定时器通道产生的中断 1个模数计数器下溢中断 1个脉冲累加器B溢出中断 1个脉冲累加器A输入中断 1个脉冲累加器A溢出中断 1个自由计数器溢出中断 引脚复用:IOC7~IOC0 PT7~PT0 重庆大学通信工程学院 任勇 王毅
3
6.1.2 输入捕捉/输出比较 输入捕捉是通过捕获自由运行计数器来监视外部事件。主要用于信号检测、频率测量、脉冲宽度和输入计数。
输入捕捉/输出比较 1. 输入捕捉 输入捕捉是通过捕获自由运行计数器来监视外部事件。主要用于信号检测、频率测量、脉冲宽度和输入计数。 输入捕捉的基本过程: 外部事件或信号发生规定变化; 计数寄存器TCNT内容锁存到TCx; CxI= 1 允许中断; 发中断,标志位CxF置位 记录事件发生的时刻、信号变化的时刻; TCxH 实现两次输入捕捉, 产生中断或置位 TCNT TCx TCxH 重庆大学通信工程学院 任勇 王毅
4
有4个非缓冲通道(PT4~PT7)各自具有一个捕捉寄存器。
(1)、非缓冲IC通道 有4个非缓冲通道(PT4~PT7)各自具有一个捕捉寄存器。 可以由输入覆盖控制寄存器ICOVW决定捕捉到的数据是否允许被覆盖(0-覆盖,1-为空时可写)。 (2)、缓冲IC通道 有4个缓冲通道(PT0~PT3)除了各自具有一个捕捉寄存器外,还有一个保持寄存器,可以连续捕捉2次不同时刻的值。 可以工作在锁存方式或队列方式。 (注:锁存方式类似于非缓冲通道,队列方式就是先进先出) 重庆大学通信工程学院 任勇 王毅
5
输入捕捉功能过程 • 共有8个输入捕捉通道 • 每个通道有自己的向量表和控制寄存器 当外部事件发生时,或外部信号输入发生变化时,记录当前时间
TCNT 比较/捕捉 单元 16位自由运行计数器 OR OR 上升/下降沿 TICx Edge 沿选择 检测 延时 计数器 16位输入捕捉锁存器TCx 引脚 ICx 16位保持寄存器TCxH • 共有8个输入捕捉通道 • 每个通道有自己的向量表和控制寄存器 CxF 捕捉发生时,状态位置1 向CPU发出中断请求 可选中断屏蔽 CxI 应用: ABS 刹车. 雷达测距,发动机 重庆大学通信工程学院 任勇 王毅
6
2.输出比较 • 在比较匹配的时刻,实际上就是定时时间到,同时还可输出一个信号 比较 中断请求 TCNT TCx • 共有8个输出比较通道
当比较寄存器的值和计数 器的值相等时,采取行动 比如:当TCNT=0x5678 置位 清零 翻转 16位自由运行计数器 OR OR 比较 相等 Pin OCx 比较器 引脚控制逻辑 TCx 16位输出比较寄存器 比如:0x5678 软件可以修改 状态标志位置位, 当比较发生时(值相等时) CxF 中断请求 CxI • 共有8个输出比较通道 • 每个通道有自己的向量表和控制寄存器 重庆大学通信工程学院 任勇 王毅
7
具体的设置方式参见相关资料,重点是了解其作用和意义。
各控制寄存器的设定 具体的设置方式参见相关资料,重点是了解其作用和意义。 定时器控制寄存器------TCTL3、 TCTL4 EDGxB 输入捕捉沿控制(IC7–IC0) EDGxA ICx EDGE 1 无边沿 – ICx 禁止 上升沿 下降沿 任何沿 注:上/下沿用于测量周期,任何沿用于测量高电平或低电平宽度 OR 输入延迟控制寄存器------DLYCT 注:如果延迟功能有效时,当输入引脚检测到一个有效的边沿后,延迟计数器开始对总线时钟进行计数当到达预先设定的计数值时,延迟计数器才输出一个脉冲,它用来去除噪声 注:实用于低频信号抗干扰,对高频信号不适用 重庆大学通信工程学院 任勇 王毅
8
定时器中断标志寄存器------TFLG
CxF =1:通道x有中断事件发生; ② TFLG2: TOF:定时器溢出标志位 清CxF、TOF标志位的方法:向对应标志位置1 ,实现清除。 BSET TFLG2 , #$80; BSET TFLG1 , #$81 重庆大学通信工程学院 任勇 王毅
9
定时器系统控制寄存器1------ TSCR1
TEN TSWAI TSFRZ TFFCA Reserved $0006 RST: 0……………………………………………………………………………0 TFFCA – 定时器快速标志位清除使能 0 = 定时器标志位正常清零 1 = 输入捕捉时读取寄存器TCn, 输出比较时写寄存器TCn,可以对相应通道标志位清零。读TCNT清除TOF TSFRZ – 在Freeze模式时, 定时器停止。 0 = 不停止 ; 1 = 停止 TSWAI – 在WAIT模式时,定时器停止 0 = 不停止; = 停止 定时器使能 1 – 定时器/计数器使能 0 – 定时器/计数器禁止 重庆大学通信工程学院 任勇 王毅
10
定时器系统控制寄存器2------ TSCR2
B B0 TOI TCRE PR2 PR1 PR0 $000D 除以 1 2 4 8 16 32 64 128 PR2 PR1 PR0 预分频系数选择 RST: 1 – 定时器由OC7比较符合时复位 0 – 定时器自由运行 0 – 定时器溢出中断禁止 1 – 定时器溢出中断使能 定时器中断使能寄存器------TIE Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 C7I C6I C5I C4I C3I C2I C1I C0I CxI 定时器计数寄存器------TCNT 时钟的计数,自由运行,高8+低8 ,只读,须按字读取 重庆大学通信工程学院 任勇 王毅
11
定时器控制寄存器------TCTL1、 TCTL2
B6 B5 B4 B3 B7 B2 B1 B0 输出模式和输出电平 (O7–OC0) OM7 OL7 OM6 OL6 OM5 OL5 OM4 OL4 $0008 TCTL1 RST: OMx OLx Action on OCx 1 No Action OCx Toggle OCx Drive OCx LO Drive OCx HI B6 B5 B4 B3 B7 B2 B1 B0 OM3 OL3 OM2 OL2 OM1 OL1 OM0 OL0 TCTL2 $0009 RST: IC/OC功能选择寄存器------TIOS 0- 相应通道为输入捕捉,1- 相应通道为输出比较 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 IOS7 IC/OC寄存器------TCx 8个,各16位,可读 OC方式---可写,IC方式---可读,写无效 重庆大学通信工程学院 任勇 王毅
12
输入引脚PT0~PT3,共4个8位累加器,对应IC0~IC3通道。
6.3脉冲累加器 1.脉冲累加器引脚功能 输入引脚PT0~PT3,共4个8位累加器,对应IC0~IC3通道。 每个通道具有8位脉冲累加器 PAx及8位保持寄存器PAxH PA0+PA1 PACB(16位脉冲累加器B),输入引脚-PT0 PA2+PA3 PACA(16位脉冲累加器A),输入引脚-PT7 2.脉冲累加器工作模式: LATQ=1:锁存模式。PAn --》 PAnH ,打入到累加器的条件: MCCNT计数器减到0 ,即计时到,可以产生中断; 向MCCNT 写0 ,不产生中断; MCCNT对应控制寄存器MCCTL的ICLAT位置1(对所有累加器); LATQ=1 队列模式。当读取TCnH时,PAn --》PAnH 并且 PAn=0; 重庆大学通信工程学院 任勇 王毅
13
3.脉冲累加器的计数模式 (1)事件计数模式: PEDGE 选择PAI的哪种沿用来增加 PACNT寄存器 16 位计数器 PACNT
PT7/PAI 脉冲累加器输入引脚 (1)事件计数模式: PEDGE 选择PAI的哪种沿用来增加 PACNT寄存器 软件选择以什么沿来计数 可选: 计数器溢出时,产生中断 也可在PAI引脚每个主动电平产生中断 PT7/PAI 16 位计数器 PACNT 脉冲累加器输入引脚 (2)门控时间累加模式: PEDGE选择PAI的哪个电平状态用来禁止计数 (比如 PEDGE=0 允许计数 当PAI 为高电平时). 自由运行ECLK/64时钟 软件选择主动电平作为门的输入 可选: 当计数器溢出时产生中断 也可在有效的引脚电平后面的边沿时产生中断 重庆大学通信工程学院 任勇 王毅
14
脉冲累加控制寄存器(以A为例,B类似) (1) 16位脉冲累加器A控制寄存器PACTL PAEN: 脉冲累加器使能位:1:使能 ;0:禁止
PAMOD:脉冲累加器模式控制位:1:门控方式;0:事件计数 PEDGE:有效边沿设定: PAOVI : 脉冲累加器溢出中断使能:0:禁止 ;1:使能 PAI:脉冲累加器输入中断使能: 0:禁止 ;1:使能 CLK1,CLK2:TCNT计数时钟频率选择 PACLK = 总线频率/64 重庆大学通信工程学院 任勇 王毅
15
(2) 16位脉冲累加器A 标志寄存器PAFLAG
PAOVF : 脉冲累加器溢出中断标志位 PAIF :计数方式下:有效边沿产生计数同时产生中断标志; 事件方式下:输入信号结束边沿产生中断标志 (3) 脉冲累加器计数寄存器PACN3、PACN2PACN32 (=PACNT) PACN3 PACN2 同样:PACN1、PACN0PACN10 (=PBCNT) 重庆大学通信工程学院 任勇 王毅
16
递减16位计数器 6.4 模数递减计数器 (1)16位模数计数器控制寄存器MCCTCL
6.4 模数递减计数器 递减16位计数器 (1)16位模数计数器控制寄存器MCCTCL MCZI:模数计数器向下溢出中断使能: 0:禁止 :1:使能 MODCM: 0:单次计数方式 ; 1:循环计数方式 RDMCL:模数读取位选择: 0:读回模数计数器当前值; 1:返回加载寄存器的值 ICLAT:捕捉寄存器强制转移控制位 0:无效: 1: TCn TCnH ; PAn PAnH;0 PAn MCEN:模数递减计数器使能位。 0:禁止 1:使能 FLMC:仅写1时,产生模数常数寄存器的内容强制装入MCCNT,复位分频因子 MCPR1,MCPR0: 重庆大学通信工程学院 任勇 王毅
17
(2)16位模数计数器标志寄存器MCFLG (3)16位模数递减计数寄存器MCCNT MCZF : 模数计数溢出中断标志位
POLF3~0 : 首次捕捉的极性记忆;0=下降沿;1=上升沿 (3)16位模数递减计数寄存器MCCNT 读MCCNT : RDMCL=0 返回计数器当前值; RDMCL=1 返回加载的常数值; 对输入捕捉或脉冲累加,如果设置为锁存模式且输入缓冲使能(LATQ=1,BUFFEN=1),写$0000到MCCNT锁存TC 、PA到保持寄存器 ;并且MCCNT保持为0 ,不会产生中断标志置1; 对应循环使用方式(MODMC=1),写入MCCNT的数据,在MCCNT回零后才生效,非立即生效。 对于单次计数方式(MODMC=0),写MCCNT,清零MCCNT,然后并用新值更新计数器,然后重新开始递减计数。 重庆大学通信工程学院 任勇 王毅
18
模数递减(向下)计数器 MCCNT 向下计数至0 二进制向下计数器. 可以完全控制计数起始值
装载 执行动作 二进制向下计数器. 可以完全控制计数起始值 应用于精确事件计时-用于产生周期性的标志位和中断 主定时器单独运行。时钟来自总线时钟,并经过预分频。 可以被设置为定时中断或产生标志位。或装载初始值后向下计数到$0000。 重庆大学通信工程学院 任勇 王毅
19
关于TCNT、 PAI、MCCNT总结 TCNT:一直运行。每当条件满足, 产生捕捉或输出比较;
脉冲累加器以输入为时钟, 或输入作为控制计数的起始/结束 MCCNT:可以随时进去控制计时的开始,作为锁存模式时间控制的基础,并形成打入锁存的信号。 重庆大学通信工程学院 任勇 王毅
20
【例6-1】OC定时 别忘: 在整个源程序的末尾声明定时器通道0中断的矢量地址所对应的中断服务程序名: ORG $FFEE
定时时间= TCx预置数 x 总线周期 x 分频系数=46875x500nsx128=3s 实际上需算: TCx预置数= 定时时间/(总线周期x分频) 另加:当前TCNT值 别忘: 在整个源程序的末尾声明定时器通道0中断的矢量地址所对应的中断服务程序名: ORG $FFEE FDB TC0_ISR 重庆大学通信工程学院 任勇 王毅
21
OC7比较成功时,TCNT可设为自动复位……
程序见书 重庆大学通信工程学院 任勇 王毅
22
【例6-3】利用IC对通道6的脉冲信号进行计数。下降沿,计数值送B口。
byte nPulseNums; //定义全局变量 void main() { DisableInterrupts; //关总中断, = asm SEI PORTB=0x00; //设B口初值 DDRB=0xFF; //设B口为输出 nPulseNums=0; //计数脉冲数先清零 TSCR2=0x07; //禁止定时器溢出中断,预分频系数128 TIOS=0xBF; //定时器通道6为IC方式 TCTL3=0x20; //IC6下降沿捕捉 TFLG1=0x40; //写1清除通道6中断标志 TIE=0x40; //定时器计数器通道6中断使能 TSCR1=0x80; //定时器使能 EnableInterrupts; //开总中断, = asm CLI for(;;) //无限循环等待 // //其它处理 } #pragma CODE_SEG NON_BANKED //中断服务函数定位声明 interrupt 14 void Timer6_ISR() DisableInterrupts; TFLG1=0x40; //写1清除通道6中断标志 nPulseNums++; //脉冲数加1 PORTB=nPulseNums; //B口输出脉冲计数值 EnableInterrupts; 【例6-3】利用IC对通道6的脉冲信号进行计数。下降沿,计数值送B口。 注:其中中断服务子程序中关键词“interrupt”后的序号“14”即是定时计数器通道6的中断向量号。 重庆大学通信工程学院 任勇 王毅
23
100ms中断要求,采用16位脉冲累加器A计数脉冲个数(PT7引脚) MCCNT = 100ms/125ns/16=50000
word nPulseNums; //定义全局变量 void main() { DisableInterrupts; //关总中断, = asm SEI DDRB=0x00; PORTB=0xFF; nPulseNums=0; TIOS=0x00; //定时器通道为输入捕捉 PACTL=0x54; //PA使能,计数,上升沿,禁溢出、输入中断,使用PACLK DLYCT=0x01; //设输入信号的持续时间应大于256个Tbus,防干扰 MCFLG=0x80; //清除模数计数器下溢出标志 MCCNT=50000; //写模数计数器常数 MCCTL=0xC7; //MDC使能,下溢出中断使能,循环计数,预分频常数16 EnableInterrupts; //开总中断, = asm CLI for(;;) //总的循环等待 // //其它处理 } #pragma CODE_SEG NON_BANKED //中断服务函数定位声明 interrupt 26 void MDC_ISR() DisableInterrupts; nPulseNums=PACN32; //读取脉冲累加器的计数值 PACN32=0; //清除脉冲累加器的计数值 //PACNT=0; PORTB=~PORTB; EnableInterrupts; 【例6-4】检测100ms中外来脉冲数 晶振频率= 16MHZ 总线频率= 晶振/2 = 8MHz 总线周期= 1/ =125ns MCCNT下溢出中断周期 =总线周期 x 预分频 x MCCNT MCCNT =下溢出中断周期/总线周期/预分频 100ms中断要求,采用16位脉冲累加器A计数脉冲个数(PT7引脚) MCCNT = 100ms/125ns/16=50000 程序 注:其中中断服务子程序中关键词“interrupt”后的序号“26”即是模数递减计数器下溢出的中断向量号。 重庆大学通信工程学院 任勇 王毅
24
6.2 PIT周期中断定时器 4个具有独立定时周期的模数递减计数器。 4个定时中断。 4个定时输出信号,可用来触发外围模块。
4定时器通道开始时间可以对齐。 每通道定时器可以被独立地使用。 每通道定时器都是24位计数,定时周期可在1到224总线时钟周期内选择。 总线时钟 8位 微定时器1 微定时器0 16位定时器0 16位定时器1 16位定时器2 16位定时器3 中断、触发接口 微时基0 微时基1 超时0 超时1 超时2 超时3 中断0 触发0 中断3 触发3 中断2 触发2 中断1 触发1 寄存器组 重庆大学通信工程学院 任勇 王毅
25
PIT中4个定时周期的中断申请的向量地址为: ● 通道0中断------基地址+$7A (复位默认$FF7A)
每当16位定时器计数器和连接的8位微定时器计数器已经到达0,预装载的寄存器值会重新装载。超时时间到,PIT超时标志寄存器(PITTF)中相应的PTF位置位。 超时时间(Time-out-period)是一个关于定时器装载寄存器(PITLD)、微定时器装载寄存器(PITMTLD)和总线时钟频率fBUS的公式: Time-out-period = (PITMTLD + 1) x (PITLD + 1) / fBUS 例如,一个40MHz的总线时钟,最大超时时间等于: 256 x x 25 ns = ms PIT超时中断 每个超时事件可以被用来触发一个中断服务请求。对于每个定时器通道,PIT中断使能寄存器(PITINTE)中的设置位独立地使能中断,当超时标志寄存器(PITTF)中相应的标志位置位时,将会发生中断服务请求。 PIT中4个定时周期的中断申请的向量地址为: ● 通道0中断------基地址+$7A (复位默认$FF7A) ● 通道1中断------基地址+$78 (复位默认$FF78) ● 通道2中断------基地址+$76 (复位默认$FF76) ● 通道3中断------基地址+$74 (复位默认$FF74) 重庆大学通信工程学院 任勇 王毅
26
PIT寄存器 一般,在PIT模块初始化完成前,先不要使能PIT定时模块,这样可以避免刚开始一段的定时不准确;等完成了装载寄存器的设置、8位微计数器的选择、定时器通道的打开等初始化工作后,再使能PIT定时模块。 【例6-5】定时时间500ms,每时间到输出翻转电平到B口,B口接有8个LED灯,程序实现1s周期的LED灯闪烁。假设总线频率为8MHz(总线周期即为125ns)。 思想:采用PIT周期中断定时器通道0,在已知定时时间和总线时钟周期的情况下,在初始化时除设置B口、选择PIT通道外,主要需要计算并设置PIT的8位微计数器的装载寄存器值和16位计数器的装载寄存器值;然后使能中断,在中断服务程序中进行点亮/熄灭LED的翻转电平输出。 根据: Time-out-period = (PITMTLD+1) x (PITLD+1) / fBUS = 500ms 预定: PITMTLD =99,使(PITMTLD+1) = 100 则有: PITLD = (500ms / 100 / TBUS) -1 = 5ms /125ns-1= =39999 重庆大学通信工程学院 任勇 王毅
27
DisableInterrupts; //关总中断, = asm SEI DDRB=0xFF; //设B口为输出
void main() { DisableInterrupts; //关总中断, = asm SEI DDRB=0xFF; //设B口为输出 PORTB=0xFF; //熄灭LED PITCFLMT=0x00; //关闭PIT模块 PITMUX=0x00; //使用通道0使用微计数器0 PITMTLD0=99; //设置微计数器0的装载寄存器 PITLD0=39999; //设置16位计数器0的装载寄存器 PITINTE=0x01; //使能PIT通道0的中断 PITCE=0x01; //使能PIT通道0计数 PITCFLMT=0x80; //使能PIT模块 EnableInterrupts; //开总中断, = asm CLI for(;;) //无限循环等待 { } } #pragma CODE_SEG NON_BANKED //中断函数定位声明 interrupt void PIT0_ISR() PITTF=0x01; PORTB=~PORTB; //B口取反,输出翻转电平 注意:本例中中断服务函数PIT0_ISR没有直接表明中断向量号(66), 所以要在CodeWarrior工程对应的prm文件中添加一行中断向量位置定义: VECTOR 66 PIT0_ISR 当然,也可直接将中断函数名写成interrupt 66 void PIT0_ISR(),就不必另行定义。 重庆大学通信工程学院 任勇 王毅
28
TIM模块有哪4种主要功能?其相关引脚IOC0~IOC7与哪个并行I/O口复用?
本章习题: TIM模块有哪4种主要功能?其相关引脚IOC0~IOC7与哪个并行I/O口复用? TIM的输入捕捉和输出比较功能可分别被用作定时还是计数?其核心计数器TCNT有什么特点?计数时钟来源于哪里? 汇编语言编程:利用TIM的通道0输出比较功能实现PT0引脚输出周期为20ms的方波。 汇编语言编程:结合TIM的输入捕捉与输出比较功能检测的通道7输入的脉冲周期。 C语言编程:利用TIM的通道1输入捕捉功能实现每来5个脉冲亮灭一下B口LED4~LED7灯。 理解书例4.4.4实例:使用C语言的定时器中断控制程序。 指定定时时间情况下,PIT定时器初始化的C编程。 重庆大学通信工程学院 任勇 王毅
Similar presentations