280 likes | 447 Views
第六章 定时器. 6.1 定时器模块概述 S12X 定时器模块在标准定时器 (TIM) 基础上增加了一些新功能,称为增强型定时器模块( Enhanced Capture Timer Module, ECT) 有以下特点 : 1 个 16 位自由运行计数器; 8 个具有 16 位缓冲寄存器的输入捕捉通道; 4 个 8 位脉冲累加器可以通过级联形成 2 个 16 位的脉冲累加器 (A/B) 1 个具有 4 位预分频器的 16 位递减模数计数器; 4 个可选的延迟计数器用来增强输入抗干扰能力。. 0. 通道. 预分频因子. 总线时钟. 输入捕捉. 16.
E N D
第六章 定时器 6.1 定时器模块概述 S12X定时器模块在标准定时器(TIM)基础上增加了一些新功能,称为增强型定时器模块(Enhanced Capture Timer Module, ECT) 有以下特点: • 1个16位自由运行计数器; • 8个具有16位缓冲寄存器的输入捕捉通道; • 4个8位脉冲累加器可以通过级联形成2个16位的脉冲累加器(A/B) • 1个具有4位预分频器的16位递减模数计数器; • 4个可选的延迟计数器用来增强输入抗干扰能力。 重庆大学通信工程学院 任勇 王毅
0 通道 预分频因子 总线时钟 输入捕捉 16 位自由计数器 模块计数中断 IOC0 输出比较 16 位模数计数器 定时器溢出中断 … … 0 定时器通道 中断 … 寄存器组 … ~ … … 7 定时器通道 中断 7 通道 PA 溢出中断 16 A 位脉冲累加器 输入捕捉 PA 输入中断 IOC7 PB 溢出中断 输出比较 16 B 位脉冲累加器 定时器的基本结构 • 定时器模块的中断---13个中断向量 • 8个定时器通道产生的中断 • 1个模数计数器下溢中断 • 1个脉冲累加器B溢出中断 • 1个脉冲累加器A输入中断 • 1个脉冲累加器A溢出中断 • 1个自由定时器溢出中断 引脚复用:IOC7~IOC0 PT7~PT0 重庆大学通信工程学院 任勇 王毅
6.1.2 输入捕捉/输出比较 1. 输入捕捉 输入捕捉是通过捕获自由运行计数器来监视外部事件。主要用于信号检测、频率测量、脉冲宽度和输入计数。 输入捕捉的基本过程: • 外部事件或信号发生规定变化; • 计数寄存器TCNT内容锁存到TCx; • CxI= 1 允许中断; 发中断,标志位CxF置位 • 记录事件发生的时刻、信号变化的时刻; • TCxH 实现两次输入捕捉, 产生中断或置位 TCNT TCx TCxH 重庆大学通信工程学院 任勇 王毅
(1)、非缓冲IC通道 有4个非缓冲通道(PT4~PT7)各自具有一个捕捉寄存器。 可以由输入覆盖控制寄存器ICOVW决定捕捉到的数据是否允许被覆盖(0-覆盖,1-为空时可写)。 (2)、缓冲IC通道 有4个缓冲通道(PT0~PT3)除了各自具有一个捕捉寄存器外,还有一个保持寄存器,可以连续捕捉2次不同时刻的值。 可以工作在锁存方式或队列方式。 (注:锁存方式类似于非缓冲通道,队列方式就是先进先出) 重庆大学通信工程学院 任勇 王毅
16位保持寄存器TCxH 输入捕捉功能过程 TCNT 当外部事件发生时,或外部信号输入发生变化时,记录当前时间 比较/捕捉 单元 16位自由运行计数器 OR OR 上升/下降沿 TICx Edge 延时 计数器 16位输入捕捉锁存器TCx 沿选择 检测 引脚 ICx • 共有8个输入捕捉通道 • 每个通道有自己的向量表和控制寄存器 捕捉发生时,状态位置1 CxF 向CPU发出中断请求 可选中断屏蔽 CxI 应用: ABS 刹车. 雷达测距,发动机 重庆大学通信工程学院 任勇 王毅
比较 2.输出比较 • 在比较匹配的时刻,实际上就是定时时间到,同时还可输出一个信号 TCNT 当比较寄存器的值和计数 器的值相等时,采取行动 比如:当TCNT=0x5678 清零 置位 翻转 16位自由运行计数器 OR OR 相等 Pin OCx 比较器 引脚控制逻辑 TCx 16位输出比较寄存器 比如:0x5678 软件可以修改 状态标志位置位, 当比较发生时(值相等时) CxF 中断请求 CxI • 共有8个输出比较通道 • 每个通道有自己的向量表和控制寄存器 重庆大学通信工程学院 任勇 王毅
输入捕捉沿控制(IC7–IC0) EDGxA ICx EDGE EDGxB 无边沿 – ICx 禁止 上升沿 下降沿 任何沿 OR 0 0 1 1 0 1 0 1 OR 定时器控制寄存器------TCTL3、 TCTL4 • 各控制寄存器的设定 具体的设置方式参见相关资料,重点是了解其作用和意义。 注:上/下沿用于测量周期,任何沿用于测量高电平或低电平宽度 输入延迟控制寄存器------DLYCT 注:如果延迟功能有效时,当输入引脚检测到一个有效的边沿后,延迟计数器开始对总线时钟进行计数当到达预先设定的计数值时,延迟计数器才输出一个脉冲,它用来去除噪声 注:实用于低频信号抗干扰,对高频信号不适用 重庆大学通信工程学院 任勇 王毅
定时器中断标志寄存器------TFLG ① TFLG1 CxF =1:通道x有中断事件发生; ② TFLG2: TOF:定时器溢出标志位 清CxF、TOF标志位的方法:向对应标志位置1 ,实现清除。 BSET TFLG2 , #$80; BSET TFLG1 , #$81 重庆大学通信工程学院 任勇 王毅
定时器系统控制寄存器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 = 停止 定时器使能 1 – 定时器/计数器使能 0 – 定时器/计数器禁止 重庆大学通信工程学院 任勇 王毅
预分频系数选择 PR2 PR1 PR0 除以 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 1 2 4 8 16 32 64 128 定时器系统控制寄存器2------ TSCR2 B7....................................................................................B0 TOI 0 0 0 TCRE PR2 PR1 PR0 $000D RST: 0 0 0 0 0 0 0 0 1 – 定时器由OC7比较符合时复位 0 – 定时器自由运行 0 –定时器溢出中断禁止 1 – 定时器溢出中断使能 定时器中断使能寄存器------TIE CxI 定时器计数寄存器------TCNT 时钟的计数,自由运行,高8+低8 ,只读,须按字读取 重庆大学通信工程学院 任勇 王毅
B7 B7 B6 B6 B5 B5 B4 B4 B3 B3 B2 B2 B1 B1 B0 B0 OMx OLx Action on OCx 0 0 No Action OCx 0 1 Toggle OCx 1 0 Drive OCx LO 1 1 Drive OCx HI 定时器控制寄存器------TCTL1、 TCTL2 输出模式和输出电平 (O7–OC0) OM7 OL7 OM6 OL6 OM5 OL5 OM4 OL4 $0008 TCTL1 RST: 0 0 0 0 0 0 0 0 OM3 OL3 OM2 OL2 OM1 OL1 OM0 OL0 TCTL2 $0009 RST: 0 0 0 0 0 0 0 0 IC/OC功能选择寄存器------TIOS 0- 相应通道为输入捕捉,1- 相应通道为输出比较 IC/OC寄存器------TCx 8个,各16位,可读 OC方式---可写,IC方式---可读,写无效 重庆大学通信工程学院 任勇 王毅
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; 重庆大学通信工程学院 任勇 王毅
3.脉冲累加器的计数模式 16 位计数器 PACNT PT7/PAI 脉冲累加器输入引脚 (1)事件计数模式: PEDGE 选择PAI的哪种沿用来增加 PACNT寄存器 软件选择以什么沿来计数 可选: 计数器溢出时,产生中断 也可在PAI引脚每个主动电平产生中断 PT7/PAI 16 位计数器 PACNT 脉冲累加器输入引脚 (2)门控时间累加模式: PEDGE选择PAI的哪个电平状态用来禁止计数 (比如 PEDGE=0 允许计数 当PAI 为高电平时). 自由运行ECLK/64时钟 软件选择主动电平作为门的输入 可选: 当计数器溢出时产生中断 也可在有效的引脚电平后面的边沿时产生中断 重庆大学通信工程学院 任勇 王毅
脉冲累加控制寄存器(以A为例,B类似) (1) 16位脉冲累加器A控制寄存器PACTL PAEN: 脉冲累加器使能位:1:使能 ;0:禁止 PAMOD:脉冲累加器模式控制位:1:门控方式;0:事件计数 PEDGE:有效边沿设定: PAOVI : 脉冲累加器溢出中断使能:0:禁止 ;1:使能 PAI:脉冲累加器输入中断使能: 0:禁止 ;1:使能 CLK1,CLK2:TCNT计数时钟频率选择 PACLK = 总线频率/64 重庆大学通信工程学院 任勇 王毅
(2) 16位脉冲累加器A 标志寄存器PAFLAG PAOVF : 脉冲累加器溢出中断标志位 PAIF :计数方式下:有效边沿产生计数同时产生中断标志; 事件方式下:输入信号结束边沿产生中断标志 (3) 脉冲累加器计数寄存器PACN3、PACN2PACN32 (=PACNT) PACN3 PACN2 同样:PACN1、PACN0PACN10 (=PBCNT) 重庆大学通信工程学院 任勇 王毅
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: 重庆大学通信工程学院 任勇 王毅
(2)16位模数计数器标志寄存器MCFLG 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,然后并用新值更新计数器,然后重新开始递减计数。 重庆大学通信工程学院 任勇 王毅
模数递减(向下)计数器 MCCNT 向下计数至0 装载 执行动作 • 二进制向下计数器. 可以完全控制计数起始值 • 应用于精确事件计时-用于产生周期性的标志位和中断 • 主定时器单独运行。时钟来自总线时钟,并经过预分频。 • 可以被设置为定时中断或产生标志位。或装载初始值后向下计数到$0000。 重庆大学通信工程学院 任勇 王毅
关于TCNT、 PAI、MCCNT总结 TCNT:一直运行。每当条件满足, 产生捕捉或输出比较; 脉冲累加器PAI:对脉冲计数或对门控信号计数 脉冲累加器以输入为时钟, 或输入作为控制计数的起始/结束 MCCNT:可以随时进去控制计时的开始,作为锁存模式时间控制的基础,并形成打入锁存的信号。 重庆大学通信工程学院 任勇 王毅
【例6-1】OC定时 定时时间= TCx预置数 x 总线周期 x 分频系数=46875x500nsx128=3s 实际上需算: TCx预置数= 定时时间/(总线周期x分频) 另加:当前TCNT值 别忘: 在整个源程序的末尾声明定时器通道0中断的矢量地址所对应的中断服务程序名: ORG $FFEE FDB TC0_ISR 重庆大学通信工程学院 任勇 王毅
【例6-2】OC7的定时。 OC7比较成功时,TCNT可设为自动复位…… 程序见书 重庆大学通信工程学院 任勇 王毅
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的中断向量号。 重庆大学通信工程学院 任勇 王毅
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; MCFLG=0x80; //清除模数计数器下溢出标志 nPulseNums=PACN32; //读取脉冲累加器的计数值 PACN32=0; //清除脉冲累加器的计数值 //PACNT=0; PORTB=~PORTB; EnableInterrupts; } 【例6-4】检测100ms中外来脉冲数 晶振频率= 16MHZ 总线频率= 晶振/2 = 8MHz 总线周期= 1/8000000=125ns MCCNT下溢出中断周期 =总线周期 x 预分频 x MCCNT MCCNT =下溢出中断周期/总线周期/预分频 100ms中断要求,采用16位脉冲累加器A计数脉冲个数(PT7引脚) MCCNT = 100ms/125ns/16=50000 程序 注:其中中断服务子程序中关键词“interrupt”后的序号“26”即是模数递减计数器下溢出的中断向量号。 重庆大学通信工程学院 任勇 王毅
微时基0 中断0 8位 微定时器0 16位定时器0 超时0 中断、触发接口 触发0 总线时钟 中断1 16位定时器1 超时1 触发1 中断2 16位定时器2 超时2 触发2 8位 微定时器1 中断3 16位定时器3 超时3 触发3 微时基1 寄存器组 6.2 PIT周期中断定时器 • 4个具有独立定时周期的模数递减计数器。 • 4个定时中断。 • 4个定时输出信号,可用来触发外围模块。 • 4定时器通道开始时间可以对齐。 • 每通道定时器可以被独立地使用。 • 每通道定时器都是24位计数,定时周期可在1到224总线时钟周期内选择。 重庆大学通信工程学院 任勇 王毅
PIT超时时间 • 每当16位定时器计数器和连接的8位微定时器计数器已经到达0,预装载的寄存器值会重新装载。超时时间到,PIT超时标志寄存器(PITTF)中相应的PTF位置位。 • 超时时间(Time-out-period)是一个关于定时器装载寄存器(PITLD)、微定时器装载寄存器(PITMTLD)和总线时钟频率fBUS的公式: • Time-out-period = (PITMTLD + 1) x (PITLD + 1) / fBUS • 例如,一个40MHz的总线时钟,最大超时时间等于: • 256 x 65536 x 25 ns = 419.43 ms • PIT超时中断 每个超时事件可以被用来触发一个中断服务请求。对于每个定时器通道,PIT中断使能寄存器(PITINTE)中的设置位独立地使能中断,当超时标志寄存器(PITTF)中相应的标志位置位时,将会发生中断服务请求。 PIT中4个定时周期的中断申请的向量地址为: ● 通道0中断------基地址+$7A (复位默认$FF7A) ● 通道1中断------基地址+$78 (复位默认$FF78) ● 通道2中断------基地址+$76 (复位默认$FF76) ● 通道3中断------基地址+$74 (复位默认$FF74) 重庆大学通信工程学院 任勇 王毅
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=40000-1=39999 重庆大学通信工程学院 任勇 王毅
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(),就不必另行定义。 重庆大学通信工程学院 任勇 王毅
本章习题: • 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编程。 重庆大学通信工程学院 任勇 王毅