飞思卡尔单片机 ECT学习资料
- 格式:doc
- 大小:971.79 KB
- 文档页数:23
一、输入输出端口寄存器I/O接口包括PORTA、B、E、K、T、S、M、P、H、J、AD。
其中PORTA、B、E、K属于复用扩展总线接口,单片机在扩展方式下工作时,作为总线信号。
1、PORTT、S、M、P、H、JI/O寄存器PTx如果对应位数据方向寄存器DDRx为“0”,输入,读取该寄存器返回引脚值;“1”,输出,读取该寄存器返回I/O寄存器的内容。
数据方向寄存器DDRx决定对应引脚为输出还是输入,“0”为输入,“1”为输出,复位后,默认为输入。
上拉/下拉使能寄存器PERx选择使用内置上拉/下拉器件,“1”允许,“0”禁用。
中断使能寄存器PIExPORTP、H、J三个端口具有中断功能。
“1”对应引脚允许中断,“0”禁止,复位后,所有端口中断关闭。
中断标志寄存器PIFxPORTP、H、J三个端口具有中断功能。
“1”对应引脚允许中断,“0”禁止,复位后,所有端口中断关闭。
2、PORTA、B、E、KI/O寄存器Px若某端口的引脚被定义为输出,写入I/O寄存器中的数值会从对应引脚输出;输入,通过I/O寄存器读取对应引脚电平。
数据方向寄存器DDRx决定对应引脚为输出还是输入,“0”为输入,“1”为输出,复位后,默认为输入。
PORTE最低两位只能为输入。
上拉电阻控制寄存器PERx第7、4、1、0位分别控制K、E、B、A端口,“1”允许使用对应端口的上拉电阻,“0”禁止,复位后,PK、PE端口使能,PB、PA禁止。
二、中断系统中断控制寄存器INTCR第7位IRQE,中断电平/边沿有效选择,0为低电平有效,1为下降沿有效;第6位IRQEN,外部中断IRQ中断请求使能,0关闭,1允许。
三、PWM模块PWM允许寄存器PWME对应每一位PWMEx,1启动输出,0停止输出,读写任意时刻。
PWM预分频时钟选择寄存器PWMPRCLK为Clock A和B选择独立的预分频因子,读写任意时刻。
Clock B对应6、5、4三位,Clock A对应2、1、0三位,分别可以实现2、4、8、16、32、64、128分频。
1、单片机组成:1> CPU 2> 存储器3>I/O ;2、存储器包括2大类:ROM , RAM3、标准ASCII码使用(1)个字节表示字符;4、BCD码是用()进制表示的()的数据;5、HCS08QG8的最小系统包括(电源电路,复位电路,下载口,(内部时钟));6、QG8管脚数量(16)、只能输入的是(PTA5)、只能输出的是(PTA4)、程序下载的是、接外部时钟的是;7、QG8的管脚可以作为数字输入输出、也可以作为模拟输入,可以作为模拟输入的有();8、QG8管脚复用优先级最低的功能是(I/O);9、QG8存储器配置中,不同资源的分界线……;10、CPU寄存器有(A, HX, PC, CCR, SP);11、可以执行位操作的地址范围(0X0000~0X005F);12、有地址的寄存器分成了(3)块(0页,高页,非易失);13、如何在C语言中定义常数(数据类型变量名;),如何指定变量的地址(数据类型变量名@ 地址;);14、堆栈的管理者是寄存器(SP);15、SP的复位缺省值是(0X00FF);16、堆栈对数据的操作特点是(向上生长型:先压后涨、先减后弹);17、堆栈一般在RAM的高地址区域还是低地址区域?高地址区18、内部时钟源包括哪4大部分?19、外部时钟分哪2大类;振荡器,整形外部时钟20、内部时钟中FLL固定倍频(512倍频);21、ICS的7种工作模式(FEI, FEE, FBI, FBILP, FBE, FBELP, stop);22、ICS的内部参考时钟是可以校准、微调的,调整的寄存器名(ICSTRM);该寄存器的数值越大,输出时钟频率越(低);23、FLASH是按页管理的,页大小(512)字节,每页分(8)行;24、高页寄存器位于FLASH的最后一页的(第六行/0xFFB0~0xFFBF)位置;25、FLASH的最后一页最后一行是(中断向量);26、FLASH块保护寄存器(FPROT);块加密寄存器(FOPT);对应的非易失寄存器分别是(NVOPT, NVPROT);27、FLASH操作的一般过程是();28、FLASH操作的有效命令有(空检查,字节编程,突发模式编程,页擦除,全部ROM 擦除);29、记录程序运行状态的CPU寄存器是(CCR);30、指令系统包括6大类指令,分别是(算术运算指令、数据传送指令、数据和位操作、逻辑运算、程序控制、堆栈处理);31、寻址方式是指(CPU访问操作数和数据的方法);32、寻址方式包括7大类16种,分别是:INH IMM DTR EXT IX,IX1,IX2,SP1,SP2,IX+,IX1+ REL IMD, DD,IX+D,DIX+33、8指令模板和6指令模板分别是();34、QG8是高电平复位还是低电平复位?低电平35、QG8数据存储器RAM的大小为(512)字节;36、上电复位期间将管脚(A4)设置为(低)电平可以进入调试模式37、QG8的存储器结构为冯·诺伊曼还是哈佛结构?冯诺依曼38、中断过程中自动入栈的字节有(PCL,PCH,A,CCR,X);39、在C语言中如何定义变量为“易变型”;40、使用外部整形后的时钟从管脚(P7)输入;41、cpu时钟是总线时钟的(2)倍;42、如何调整内部时钟到想要的频率?43、最高优先级中断是(复位中断);44、想要保护最后的4页FLASH,则寄存器FPROT应赋值(11110110);45、ADC转换器设置成硬件触发时,是采用实时中断RTI计数器的溢出信号(ADHWT)进行启动转换的。
1、定时器IC/OC功能选择寄存器TIOSIOS[7..0]IC/OC功能选择通道0 相应通道选择为输入捕捉(IC)1 相应通道选择为输出比较(OC)2、定时器比较强制寄存器 CFORCFOC[7..0]设置该寄存器某个FOCn位为1将导致在相应通道上立即产生一个输出比较动作,在初始化输出通道时候非常有用。
【说明】这个状态和正常状态下输出比较发生后,标志位未被置位后的情况相同。
3、输出比较7屏蔽寄存器 OC7MOC7M[7..0]OC7(即通道7的输出比较)具有特殊地位,它匹配时可以直接改变PT7个输出引脚的状态,并覆盖各个引脚原来的匹配动作结果,寄存器OC7M决定哪些通道将处于OC7的管理之下。
OC7M中的各位与PORTT口寄存器的各位一一对应。
当通过TIOS将某个通道设定为输出比较时,将OC7M中的相应位置1,对应的引脚就是输出状态,与DDR中的对应位的状态无关,但OC7Mn并不改变DDR相应位的状态。
【说明】OC7M具有更高的优先级,它优于通过TCTL1和TCTL2寄存器中的OMn和OLn设定的引脚动作,若OC7M中某个位置1,就会阻止相应引脚上由OM和OL设定的动作。
4、输出比较7数据寄存器 OC7DOC7D[7..0]OC7M对于其他OC输出引脚的管理限于将某个二进制值送到对应引脚,这个值保存在寄存器OC7D中的对应位中。
当OC7匹配成功后,若某个OC7Mn=1,则内部逻辑将OC7Dn送到对应引脚。
OC7D中的各位与PORTT口寄存器的各位一一对应。
当通道7比较成功时,如果OC7M中的某个位为1,OC7D中的对应位将被输出到PORTT的对应引脚。
【总结】通道7的输出比较(OC7)具有特殊的位置,在OC7Mn和OC7Dn两个寄存器设置以后,OC7成功输出后将会引起一系列的动作。
比如:OC7M0=1,则通道0处在OC7的管理下,在OC7成功后,系统会将OC7D0的逻辑数据(仅限0或者1)反应在PT0端口上。
基准计时器的核心仍然是一个16 位的可编程计数器,其时钟源来自一个预分频器。
该计时器可以被应用于多个方面,包括在对输入波形进行测量的同时产生一个输出波形。
波形的脉宽可以在几微秒到数秒的范围内变化。
增强型定时器模块(ECT)的结构框图如下,ECT功能相当于高速的I/O口,由一个4位预分频器、一个16位自由运行计数器,8个16位IC/OC通道,2个16位脉冲累加器以及一个16位模数递减计数器组成。
ECT实际上是一个16位的可编程计数器,它的基本时钟频率可以通过预分频器设置,用于产生波形输出,测量输入波形,统计脉冲个数,可以作为定时中断功能和独立时钟基准。
2、运行模式停止:由于时钟停止,计时器和计数器均关闭。
冻结:计时器和计数器均保持运行,直到TSCR($06)的TSFRZ 位被置1。
等待:计数器保持运行,直到TSCR($06)的TSWAI 位被置1。
正常:计时器和计数器均保持运行,直到TSCR($06)的TEN 位和MCCTL($26)的MCEN 位被分别清0。
IC 通道组由四个标准的缓冲通道IC0-IC3 和四个非缓冲通道IC4-IC7 组成,两部分的基本功能都是捕捉外部事件发生的时刻,但是缓冲通道除了IC/OC 寄存器TCn 外,还设有保持寄存器TCnH,此外还在入口设置了延迟计数器,用来提高抗干扰能力。
非缓冲通道没有保持寄存器,入口也没有延迟计数器,但每个通道入口设置了一个 2 输入端的多路器,事件触发信号可以是来自本通道的输入引脚PORTn,也可以是来自其关联通道PORT(n-4)的延迟计数器输出,使用更加灵活。
当延迟功能有效时,输入引脚检测到一个有效的边沿后,延迟计数器开始对P 时钟(模块时钟)进行计数,当到达设定的计数值后,延迟计数器在其输出端有条件地产生一个脉冲,这个条件就是延迟前后的引脚电平相反。
这样可以避免对窄输入脉冲做出反应。
延迟计数结束后,计数器自动清除。
输入信号两个有效边沿之间的持续时间必须大于设定的延迟时间。
9S12 系列单片机的ECT (Enhanced Capture Timer Module)模块是在原68HC12 的 Standard Timer module 基础上加以增强功能形成的。
ECT 模块主要由以下几部分组成,参看图1:•一个带可编程预分频的16位向上计数的自由运行计数器•8个独立的定时器通道,每个通道具备输入捕捉/输出比较功能•4个8位脉冲累加器,也可设置成2个16位脉冲累加器•一个带可编程预分频的16位的向下计数的计数器•从上面示意图中可以就看出,ECT 模块相当的复杂,不是简单的几句话就能说明白的。
我也是通过很长时间的学习实践,才逐步掌握了ECT模块的使用。
本文将通过一系列的实例,从最简单的功能开始,逐步展开。
一步一步的展示ECT 模块的强大功能。
实验1:自由运行计数器(TCNT)与溢出中断自由运行计数器(TCNT)也称为自由运行主定时器,是一个16位的计数器,可以说是ECT的核心。
在系统复位时,这个自由运行计数器的初值为$0000。
当ECT 模块运行时,自由运行计数器从$0000~$FFFF 循环递增计数。
当计数器溢出复零时,会置位中断标志。
利用这个计数器,可以产生一个周期的中断信号。
TCNT 的输入时钟也是可以选择的,图2 给出了TCNT 的时钟源的示意图。
可以看出,TCNT的输入时钟可以来源于总线时钟、总线时钟经过预分频、外部引脚输入的脉冲、外部引脚输入脉冲经过脉冲累加器分频这四种选择。
当然,选择哪个时钟源其实就是在程序中设置一下相应的寄存器这么简单。
了解了上面的介绍,就可以开始本文的第一个例子了,这个例子非常简单,将BUS CLOCK 分频后作为TCNT 的输入时钟,使能TCNT 溢出中断。
在开始代码之前,还需要介绍几个程序中用到的寄存器。
TCNT寄存器(Timer Count Register)这个寄存器其实已经介绍过了,它是一个16 位的只读寄存器。
在每个时钟输入下计数值会自动加1,当计数值为0xFFFF 后下一个时钟脉冲会使计数器溢出为0x0000。
程序中可以随时读取TCNT 的值,唯一需要注意的是TCNT 是个16位的寄存器,读取时要一次将其读出,如果分为高低两个字节读取,读到的数据不一定能拼接成一个有效的计数值。
图 3 TCNT 寄存器TFLG2寄存器(Main Timer Interrupt Flag 2)这个寄存器只有最高位TOF 是有意义的。
当TCNT 溢出时会置位TOF 位,程序中可以轮询这一位来判断TCNT 是否溢出了。
当然这种轮询的方法效率很低,更实用的方法是利用TCNT 溢出中断。
向TOF 位写 1 会清除TOF,在TCNT 溢出中断中就必须清除TOF,否则就不会响应下一次溢出中断。
图 4 TFLG2 寄存器TSCR2 寄存器(Timer System Control Register 2)这个寄存器由三部分功能组成。
TOI 位是Timer Overflow Interrupt Enable 的简写。
TOI 位为0时表示禁止TCNT 溢出中断,这时只能通过轮询TOF 位来判断是TCNT计数器是否溢出了。
TOI 位为 1 表示使能TCNT溢出中断。
TCRE 位是Timer Counter Reset Enable 的简写。
TCRE 位为0表示TCNT自由运行,TCRE 位为1表示当TCNT = OC7 时复位。
PR2、PR1、PR0 是总线时钟的预分频因子。
当PR2-0 组成的三位2进制数为N 时,表示将BUS CLOCK 分频2^N。
图 5 TSCR2 寄存器TSCR1寄存器(Timer System Control Register 1)TEN 位为0时ECT模块被禁用。
TEN 位为1时ECT模块被使能。
TSWAI(Timer Module Stops While in Wait)位为0时,ECT 模块在STOP 模式下仍旧运行。
TSWAI位为1时,ECT 模块在STOP 模式停止运行。
TSFRZ (Timer and Modulus Counter Stop While in Freeze Mode),这一位与TSWAI 位类似。
TFFCA (Timer Fast Flag Clear All)我还没仔细研究,作用不明。
图 6 TSCR1 寄存器有了上面这些介绍,就可以很容易的看懂下面的代码了。
在我的实验板上,晶振频率为16.384MHz,因为没有开启PLL,BUS CLOCK 为8.192MHz,内核频率为16.384MHz。
8.192MHz被128预分频后为64KHz,16位计数器溢出频率为0.98Hz(64000/65536)[cpp]view plaincopy图 9 TCTL1/TCTL2 寄存器TFLG1寄存器(Main Timer Interrupt Flag 1)用来标识中断条件发生了,对某一位写1则清除对应位。
图10 TFLG1寄存器有了这些就可以开始第二个例子了。
第二个例子利用通道0和通道1的输出比较功能。
在TCNT = TC0 时将对应的PT0 管腿的输出电平翻转,并且产生相应中断。
在TCNT = TC1时将对应的PT1 管腿的输出电平翻转,并且产生相应中断。
这样,PT0和PT1 就会输出两个具有恒定相位差的同频方波信号了。
[cpp]view plaincopy下面是用USBee 抓下来的波形图。
Port M 0 是在溢出中断中翻转的。
PT0 、PT1分别对应两个输出比较通道,两个上升沿的时间间隔为1/8192=1.22ms,测量结果与理论值完全相同。
下面将程序做一个很小的修改。
将 TC0 和TC1 的值改成相同的。
[cpp]view plaincopy从波形图中可以看出,输出是正常的。
但是有些低版本的 ECT 模块有些问题,在这种情况下只有通道0 的中断能够响应,通道1的中断无法响应。
实验3:输出比较 7 通道的特殊功能输出比较通道OC7 具有特殊的权限,可以废止其他输出比较通道的动作,直接决定各个输出通道的状态。
这种特权功能是通过配置两个额外的寄存器OC7M和OC7D来实现的。
OC7M寄存器(Output Compare 7 Mask Register)使OC7Mx=1,OC7强行参与管理通道x的输出,但通道OC7 对通道OC0~OC6的管理仅限于使其引脚PT0~PT6 清0或置1,不能将引脚电平翻转,引脚的动作来自于输出比较7数据寄存器OC7D中的对应位OC7Dx定义的电平状态,必须事先通过程序设置。
图 11 OC7M寄存器OC7D寄存器(Output Compare 7 Data Register)OC7Dx=0,则对应事件发生时相应PTx位将被输出为低电平,OC7Dx=1,则对应事件发生时相应PTx位将被输出为高电平。
图 12 OC7D寄存器可以开始我们的实验了。
这个实验将在PT0 管腿上输出一个占空比位1/4 的方波。
实现方法为在TCNT = 10000 时将PT0 置为高电平,TCNT = 26384 时将PT0 置为低电平。
下面是程序片段。
[cpp]view plaincopy利用这种方式可以模拟个PWM 功能出来。
不过模拟出来的PWM周期只有8种选择。
在第一篇应用笔记中,我提到过TCSR2寄存器有一位叫TCRE。
TCRE 位是Timer Counter Reset Enable 的简写。
TCRE 位为0表示TCNT自由运行,TCRE 位为1表示当TCNT = OC7 时复位。
下面将给出一个利用TCRE的例子。
同样是占空比25%,但是同时还调整了波形的周期。
这个例子中,TC0 = 1000, TC7 = 4000。
PT0 在1000时翻转一下,在4000时再翻转一下。
同时4000时将TCNT值复位到0重新计数。
这样波形的频率就成了4000/8192000=4.88ms。
[cpp]view plaincopy上面是实际波形,这里出现了个有意思的现象。
PM0 一直为低电平,这表明TCNT 的Overflow 中断没有进去。
说明这个中断只有在TCNT为自由计数器时才有用,这点需要特别注意。
实验4:定时器溢出翻转功能所谓定时器溢出翻转就是在TCNT溢出时将某个通道的输出管腿PTx电平翻转一下。
这个功能很实用,可以实现PWM 功能。
首先,还是要介绍个相关的寄存器TTOV。
TTOV寄存器(Timer Toggle On Overflow Register 1)定时器溢出触发寄存器TTOV很简单,8位寄存器每一位对应一个输出比较通道,相应位置1后表示允许根据溢出特性翻转对应输出比较引脚。
置0则禁止这一功能。
图 13 TTOV寄存器有这些知识就足够了,下面开始我们的实验。
这个实验的输出和上一个实验相同,将在PT0 管腿上输出一个占空比位1/4 的方波,不同的是实现方法。
在TCNT = TC0 = 49152 时将PT0管腿置1,然后在TCNT溢出时翻转PT0。
程序片段如下。
[cpp]view plaincopy程序运行后就能在PT0 管腿上观测到1/4 占空比的方波了。
这里需要特别说明的是TTOV不能与TCRE同时使用,比如下面这个例子。
这个例子本意是在TCNT = 10000 时翻转PT0 通道,然后当TCNT = 20000 时利用TTOV 功能再次翻转PT0 的输出,同时由于开启了TCRE,让TCNT 直接回到0。
[cpp]view plaincopy图 14 TCTL3/TCTL4 寄存器TCxH寄存器(Timer Input Capture Holding Registers 0-3)当开启输入捕捉功能时,对应事件发生时TCNT的值会被拷贝到TCx 寄存器中。
对于输入捕捉的前4个通道,在这个拷贝发生之前还要完成一件事情,就是将TCx 的值拷贝到TCxH中。
因此,当输入捕捉中断发生时,TCx 中存储的是发生当前事件时的TCNT 的值,TCxH 中存放的则是上一次事件发生时TCNT 的值。
这两个值的差可以计算出两次事件间隔的时间。
程序中还要使用到的寄存器包括TIOS寄存器(Timer Input Capture/Output Compare Select)、TSCR1寄存器(Timer System Control Register 1)、TFLG1寄存器(Main Timer Interrupt Flag 1)和TIE寄存器(Timer Interrupt Enable Register)。
在前面的介绍中已经提到过这些寄存器了,这里就不重复了。
下面是例子程序的部分代码,功能很简单。
连续捕捉十次上升沿对应的TCNT,然后计算周期。
[cpp]view plaincopy信号源还是采用USBee AX,利用通道7 输出的7.8125KHz 方波。