MC9S12XS128之时间模块TIM输入捕捉
- 格式:doc
- 大小:496.50 KB
- 文档页数:10
飞思卡尔MC9S12XS128单片机各模块使用方法及寄存器配置手把手教你写S12XS128程序--PWM模块介绍该教程以MC9S12XS128单片机为核心进行讲解,全面阐释该16位单片机资源。
本文为第一讲,开始介绍该MCU的PWM模块。
PWM 调制波有8个输出通道,每一个输出通道都可以独立的进行输出。
每一个输出通道都有一个精确的计数器(计算脉冲的个数),一个周期控制寄存器和两个可供选择的时钟源。
每一个P WM 输出通道都能调制出占空比从0—100% 变化的波形。
PWM 的主要特点有:1、它有8个独立的输出通道,并且通过编程可控制其输出波形的周期。
2、每一个输出通道都有一个精确的计数器。
3、每一个通道的P WM 输出使能都可以由编程来控制。
4、PWM 输出波形的翻转控制可以通过编程来实现。
5、周期和脉宽可以被双缓冲。
当通道关闭或PWM 计数器为0时,改变周期和脉宽才起作用。
6、8 字节或16 字节的通道协议。
7、有4个时钟源可供选择(A、SA、B、SB),他们提供了一个宽范围的时钟频率。
8、通过编程可以实现希望的时钟周期。
9、具有遇到紧急情况关闭程序的功能。
10、每一个通道都可以通过编程实现左对齐输出还是居中对齐输出。
1、PWM启动寄存器PWMEPWME 寄存器每一位如图1所示:复位默认值:0000 0000B图1 PWME 寄存器每一个PWM 的输出通道都有一个使能位P WMEx 。
它相当于一个开关,用来启动和关闭相应通道的PWM 波形输出。
当任意的P WMEx 位置1,则相关的P WM 输出通道就立刻可用。
用法:PWME7=1 --- 通道7 可对外输出波形PWME7=0 --- 通道7 不能对外输出波形注意:在通道使能后所输出的第一个波形可能是不规则的。
当输出通道工作在串联模式时(PWMCTL 寄存器中的CONxx置1),那么)使能相应的16位PWM 输出通道是由PWMEx 的高位控制的,例如:设置PWMCTL_CON01 = 1,通道0、1级联,形成一个16位PWM 通道,由通道 1 的使能位控制PWM 的输出。
飞思卡尔智能汽车竞赛XS128主要模块实验指导书第一章端口整合模块端口A,B和K为通用I/O接口端口E 整合了IRQ,XIRQ中断输入端口T 整合了1个定时模块端口S 整合了2个SCI模块和1个SPI模块端口M 整合了1个MSCAN端口P 整合了PWM 模块,同时可用作外部中断源输入端口H 和J 为通用I/O接口,同时可用作外部中断源输入端口AD 整合了1个16位通道ATD模块大部分I/O引脚可由相应的寄存器位来配置选择数据方向、驱动能力,使能上拉或下拉式装置。
当用作通用IO口时,所有的端口都有数据寄存器和数据方向寄存器。
对于端口T, S, M, P, H, 和J 有基于每个针脚的上拉和下拉控制寄存器。
对于端口AD 有基于每个针脚的上拉寄存器。
对于端口A、B、E 和K,有一个基于端口的上拉控制寄存器。
对于端口T, S, M, P, H, J, 和AD,有基于每个针脚的降额输出驱动控制寄存器。
对于端口A, B, E, 和K,有一个基于端口的降额输出驱动控制寄存器。
对于端口S、M,有漏极开路(线或)控制寄存器。
对于端口P、H 和J,有基于每个针脚的中断标志寄存器。
纯通用IO端口共计有41个,分别是:PA[7:0]PB[7:0]PE[6:5]PE[3:2]PK[7,5:0]PM[7:6]PH[7:0] (带中断输入)PJ[7:6] (带中断输入)PJ[1:0] (带中断输入)第二章脉冲宽度调制模块XS128具有8位8通道的PWM,相邻的两个通道可以级联组成16位的通道。
PWME:PWM通道使能寄存器。
PWMEx=1将立即使能该通道PWM波形输出。
若两个通道级联组成一个16位通道,则低位通道(通道数大的)的使能寄存器成为该级联通道的使能寄存器,高位通道(通道数小的)的使能寄存器和高位的波形输出是无效的。
PWMPOL:PWM极性寄存器。
PPOLx=1,则该通道的周期初始输出为高电平,达到占空比后变为低电平;相反,若PPOLx=0,则初始输出为低电平,达到占空比后变为高电平。
用了一年多飞思卡尔MC9S12XS128这款处理器,现在总结下各个功能模块的驱动.//锁相环时钟的初始化总线频率为40MHz(总线时钟为锁相环时钟的一半)//晶振为11.0592MHzvoid PLL_init(void) //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1) { //锁相环时钟= 2*11.0592*(39+1)/(10+1)=80MHz 总线时钟为40MHzREFDV=0x0A;SYNR=0x67; //0110_0111 低6位的值为19,高两位的值为推荐值while(CRGFLG_LOCK != 1);CLKSEL_PLLSEL = 1; //选定锁相环时钟//FCLKDIV=0x0F; //Flash Clock Divide Factor 16M/16=1M}//周期中断定时器的初始化-// //周期中断通道1用于脉冲累加器的定时采样,定时周期为: 10ms= (199+1)*(1999+1)/(40M) (没有使用)//周期中断通道0用于控制激光管的轮流发射,定时周期为: 2000us= (399+1)*(199+1)/(40M)//2011/4/4 15:24 定时时间改为1msvoid PIT_init(void){PITCFLMT_PITE = 0; // 禁止使用PIT模块 PITCFLMT :PIT 控制强制加载微计数器寄存器。
PITCE_PCE0 = 1; // 使能定时器通道0//PITCE_PCE1 = 1; //使能定时器通道1PITMUX = 0; //通道0,和通道1均选择8位微计数器0//修改时间只需要改下面四行PITMTLD0 = 199; //向8位微计数器中加载的值PITLD0 = 199; //向16位计数器中加载的值//PITMTLD1 = 39; //向8位微计数器中加载的值 8位,最大值不要超过255//PITLD1 = 1999; //向16位计数器中加载的值PITINTE |= 0x01; //使能定时器通道0的中断PITCFLMT_PITE = 1;//使能PIT模块}//脉冲累加器的初始化, PT7口外接光电编码器//最新修改: 2011/3/25 16:53void PT7_PulAcc_Init(void){DDRT &= 0x77;//设置PT7,PT3口为输入(硬件上PT7,PT3通过跳线联到了一块)PERT |= 0x80; //使能通道7的上拉电阻PPST &= 0x7f; //电阻设为上拉电阻TCTL4 &= 0x3f; //禁止PT3的输入捕捉功能PACTL = 0x50; //启动脉冲累加计数器,上升沿触发,禁止触发中断和溢出中断,主定时器禁止}//通道1用于控制舵机1 PWM 高电平有效,//通道3用于控制电机1 PWM 低电平有效,这与前两代车高电平有效有区别!!!!!//通道7用于给上排激光管提供PWM信号 PWM高电平有效!!!!!//通道6用于给下排激光管提供PWM信号 PWM高电平有效!!!!!// 2011-03-17 7:56 增加了A端口的使用新增通道6//2011-6-9 23:03 //增加了通道4,5的联合使用,用于控制下排方向舵机 void PWM_init(void){PWME = 0x00;//PWM禁止PWMPRCLK = 0x03; // ClockA=40M/8=5M, Clock B = 40M/1=40M PWMSCLB = 10; // Clock SB= 40/2*10= 2MHz(供电机)PWMSCLA = 5; // SA = Clock A/2*5 = 5M/10 = 500K = SA 用于控制舵机PWMPOL = 0xe2; //1110_0010通道7,通道6与通道1、通道5先输出高电平然后输出低电平,POLx=1先输出高电平后输出低电平; PPOLx=0先输出低电平)PWMCAE = 0x00; // 左对齐输出(CAEx=0为左对齐,反之为中心对齐)//PWMCLK = 0010_1010 (0 1 4 5位控制SA_1;或A_0; 2 3 6 7位控制SB_1 或B_0)//为PWM通道1选择时钟 SA(500KHz),//为PWM通道5选择时钟 SA(500KHz),//为通道3选择时钟 SB(10MHz)//为通道7选择时钟B(40MHz)//为通道6选择时钟B(40MHz)PWMCLK = 0x2A; //0010_1010PWMCTL = 0x70; //0111_0000 CON45=1,把通道4,5联合使用。
飞思卡尔MC9S12XS128各模块初始化程序--超详细注释//**************************************************************************// 武狂狼2014.5.1 整理// 新手入门的助手////***************************************************************************注释不详细/*********************************************************/函数名称:void ATD0_init(void)函数功能:ATD初始化入口参数:出口参数:/***********************************************************/void ATD0_init(void){ATD0DIEN=0x00; //使用模拟输入功能|=1;数字输入功能// ATD0CTL0=0x07; //Bit[3:0]WRAP[3:0] 反转通道选择位ATD0CTL1=0x40; // 12位精度,采样前不放电 Bit[7]ETRIGSEL(外部触发源选择位。
=0选择A/D通道AN[15:0] |=1选择 ERTIG3~0)和Bit[3:0]ETRIGCH[3:0]选择外部触发通道// Bit[6:5]SRES[1:0]A/D分辨率选择位。
Bit[4]SMP_DIS =0采样前不放电|=1采样前内部电容放电,这会增加2个A/D时钟周期的采样时间,有助于采样前进行开路检测ATD0CTL2=0x40; // 快速清零,禁止中断,禁止外部触发ATD0CTL3=0x90; // 右对齐,转换序列长度为2,非FIFOATD0CTL4=0x03; // 采样时间4个周期,PRS=31,F(ATDCLK)=F(BUS)/(2(PRS+1))// ATD0CTL5=0x30; //启动AD转换序列//:对每项数据采集时,用到哪个通道采样可在相应子函数内设置某一通道(见Sample_AD.c)while(!ATD0STAT2L_CCF0);/*********************************************************/函数名称:void PIT_init(void)函数功能:初始化PIT 设置精确定时时间(1s)入口参数:无出口参数:无说明:无/***********************************************************/void PIT_init(void){PITCFLMT=0x00; //禁止PIT模块Bit[7] PITE:PIT模块使能位,0禁用|1使能// Bit[6] PITSWAI:等待模式下PIT停止位,0等待模式下,PIT模块正常运行| 1等待模式下,PIT模块停止产生时钟信号,冻结PIT模块// Bit[5] PITFRZ: 冻结模式下PIT计数器冻结位。
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端口上。
S12(X)单片机BDM调试器使用技巧第五届全国大学生“飞思卡尔”杯智能气车竞赛限制采用最新的MC9S12XS128(以下简称XS128)单片机作为主控芯片,替代MC9S12DG128。
XS128是Freescale公司推出的S12系列单片机中的一款增强型16位单片机。
片内资源丰富,接口模块有SPI、SCI、IIC、A/D、PWM等常见模块,在汽车电子应用领域具有广泛用途。
XS128和以往大赛使用的S12DG128系列单片机一样,调试接口都是使用Freescale公司传统的BD M(Background Debug Module)接口。
1 MC9S12XS128单片机介绍(1)CPU:增强型16位HCS12 CPU,片内总线时钟最高40 MHz;(2)片内资源:8 KB RAM、128 KB程序闪存、2 KB数据闪存;(3)串行接口模块:SCI、SPI;(4)脉宽调制模块(PWM)可设置成4路8位或者2路16位,逻辑时钟选择频率宽;(5)1个16路12位精度A/D转换器;(6)控制器局域网模块(CAN);(7)增强型捕捉定时器。
MC9S12XS128单片机有112、80和64引脚3种封装形式。
80-pin封装的单片机没有引出用于扩展方式的端口,仅引出了一个8路A/D接口。
竞赛可使用112或80引脚封装器件。
2 BDM接口和使用BDM调试器内部有一个8位的MC9HC08JB16单片机,该单片机有USB接口,可与PC 机信息交互。
HC08单片机和S12单片机间仅使用一根 I/O线通信,这根相连的信号线名为BKGD。
HC08单片机将BKGD置为输出,以串行发送命令,发送完成后转为输入,以接收信息。
S12单片机收到命令后转为输出,根据调试器发来的命令回送信息,然后立即转入接收态。
BDM工具以此方式实现S12单片机的在线调试、内部闪存的烧写等功能。
关于BDM接口的实现,读者可以参考Freescale任何一款S12单片机的器件手册,其对BDM接口的命令字、交互模式等都有详细描述。
MC9S12XS128单片机简介1、HCS12X系列单片机简介Freescale 公司的16位单片机主要分为HC12 、HCS12、HCS12X三个系列。
HC12核心是16位高速CPU12核,总线速度8MHZ;HCS12系列单片机以速度更快的CPU12内核为核心,简称S12系列,典型的S12总线速度可以达到25MHZ。
HCS12X系列单片机是Freescale 公司于2005年推出的HCS12系列增强型产品,基于S12 CPU内核,可以达到25MHz的HCS12的2-5倍性能。
总线频率最高可达40 MHz。
S12X系列单片机目前又有几个子系列:MC9S12XA系列、MC9S12XB系列、MC9S12XD系列、MC9S12XE系列、MC9S12XF 系列、MC9S12XH系列和MC9S12XS系列。
MC9S12XS128就是S12X系列中的一个成员。
2、MC9S12XS128性能概述MC9S12XS128是16位单片机,由16位中央处理单元(CPU12X)、128KB程序Flash(P-lash)、8KB RAM、8KB数据Flash(D-lash)组成片内存储器。
主要功能模块包括:内部存储器内部PLL锁相环模块2个异步串口通讯 SCI1个串行外设接口 SPIMSCAN 模块1个8通道输入/输出比较定时器模块 TIM周期中断定时器模块 PIT16通道A/D转换模块 ADC1个8通道脉冲宽度调制模块 PWM输入/输出数字I/O口3、输入/输出数字I/O口MC9S12XS128 有3种封装,分别为64引脚、80引脚、112引脚封装。
其全名分别为MC9S12XS128MAE、MC9S12XS128MAA、MC9S12XS128MAL。
MC9S12XS系列具有丰富的输入/输出端口资源,同时集成了多种功能模块,端口包括PORTA、PORTB、PORTE、PORTK、PORTT、PORTS、PORTM、PORTP、PORTH、PORTJ和PORTAD共11个端口。
>手把手教你写S12XS128程序(17)--Timer模块介绍1时间:2009-12-29 11:51来源:电子设计吧作者:dzsj8 点击:380次1、简述MC9S12XS128定时器模块与MC9S12DG128 ECT部分功能完全类似,以下均以ECT模块介绍xs128定时器模块。
HC12 增强型捕捉计时器模块在HCS12标准定时器的基础上增加了一些特点,用以扩展它的应用范围,特别是在汽车ABS 方面。
基准计时器的核心仍然是一个16 位的可编程计数器,其时钟源来自一个预分频器。
该计时器可以被应用于多个方面,包括在对输入波形进行测量的同时产生一个输出波形。
波形的脉宽可以在几微秒到数秒的范围内变化。
增强型定时器模块(ECT)的结构框图如下,ECT功能相当于高速的I/O口,由一个4位预分频器、一个16位自由运行计数器,8个16位IC/OC通道,2个16位脉冲累加器以及一个16位模数递减计数器组成。
ECT实际上是一个16位的可编程计数器,它的基本时钟频率可以通过预分频器设置,用于产生波形输出,测量输入波形,统计脉冲个数,可以作为定时中断功能和独立时钟基准。
2、运行模式停止:由于时钟停止,计时器和计数器均关闭。
冻结:计时器和计数器均保持运行,直到T SCR($06)的T SFRZ 位被置1。
等待:计数器保持运行,直到T SCR($06)的T SWAI 位被置1。
正常:计时器和计数器均保持运行,直到T SCR($06)的T EN 位和M CCTL($26)的MCEN 位被分别清0。
手把手教你写S12XS128程序(18)--Timer模块介绍2时间:2009-12-30 22:12来源:电子设计吧作者:dzsj8 点击:366次IC 通道组IC 通道组由四个标准的缓冲通道IC0-IC3 和四个非缓冲通道IC4-IC7 组成,两部分的基本功能都是捕捉外部事件发生的时刻,但是缓冲通道除了IC/OC 寄存器TCn 外,还设有保持寄存器TCnH,此外还在入口设置了延迟计数器,用来提高抗干扰能力。
MC9S12XS简介1.1 S12XS介绍新16位微控制器S12XS的系列是一个兼容,减少版本的S12XE系列。
这个系列提供了一种简便的方法开发从低端到高端化应用程序的通用平台,减少硬件和软件的设计。
12XS系列提供32位的所有优势和效率性能的16位MCU,同时保持低成本,低功耗,EMC和代码大小目前享有的效率优势。
S12XS系列运行在等待状态的情况下为所有外围设备和存储器16位宽访问。
该S12XS系列有112引脚LQFP封装,80引脚QFP,64引脚LQFP封装选择,与S12XE系列高度兼容。
除了在每个模块提供I / O端口外,还有多达18个具有从停止或等待模式被唤醒的中断功能的I / O端口。
外围设备包括MSCAN,SPI,两个SCIs,一个8通道24位定时器周期中断,8 -通道16位定时器,8通道PWM,高达16 通道12位AD转换器。
1.1.1特性16位CPU12XS-向上兼容S12指令集,除了删除五个模糊指令(MEM,WAV ,WAVR,REV,REVW)-增强索引寻址-获取大量数据段独立PPAGEINT(中断模块)- 7个级别的嵌套中断-灵活的分配中断源到每个中断的层次。
-外部非屏蔽高优先级中断(XIRQ)-下面的输入可以作为唤醒中断- IRQ和非屏蔽XIRQ-CAN总线接收引脚-SCI接收引脚-根据不同的封装选择了20针在端口J,H和P的上升或下降沿敏感的配置MMC管理(模块映射控制)DBG(调试模块)-监测与标签的CPU总线型或力量型断点要求- 64 × 64位循环跟踪缓冲区的捕捉改变流或内存访问信息BDM(背景调试模式)OSC_LCP(振荡器)-低功率的闭环控制皮尔斯振荡器利用一个4MHz至16MHz石英晶体振荡器-良好的抗干扰-全摆幅皮尔斯选择利用一个2MHz至40MHz的晶振-根据跨导最佳启动的边缘典型晶体IPLL(内部过滤,调频锁相回路时钟发生器)-无需外部元件-可配置选项为减少传播EMC辐射(频率调制谱)CRG(时钟和复位产生)-看门狗-实时中断-时钟监视器-快速唤醒自我的停止时钟模式内存选项-64K,128K的和256K字节的闪存-闪存的基本特征- 64位数据加上8位并发ECC(纠错码),允许单个位失败校正和双故障检测-擦除扇区大小1024字节-自动编程和擦除算法-保护计划,以防止意外编程或擦除-安全选项,以防止未经授权的访问- 4K和8K字节数据闪存空间- 16位数据加上6位并发ECC(纠错码),允许单个位失败校正和双故障检测-擦除扇区大小256字节-自动编程和擦除算法- 4K,8K与第12K字节RAM16通道,12位模拟数字转换器- 8/10/12位分辨率- 3微秒,10位单次转换时间-左或右对齐结果数据-外部和内部转换触发功能-内部振荡器在停止模式转换-唤醒从模拟比较低功耗模式-连续转换模式- 16路模拟输入通道-多通道扫描-管脚也可以作为数字I / OMSCAN(1Mbit/s,CAN2.0的A,B软件兼容模块)- 1兆位每秒,CAN2.0的A,B软件兼容模块-标准和扩展数据帧- 0 - 8个字节数据的长度-可编程的比特率高达1 Mbps-五接收FIFO的存储方案缓冲区-三优先发送内部缓冲区-灵活的标识验收滤波器可编程为:- 2 x 32位- 4 x 16位- 8 × 8位-唤醒集成了低通滤波器的选择-环回自检-只能收听到CAN总线监控-16位发送/接收信息时间戳TIM(标准定时器模块)- 8 × 16的输入捕捉或输出比特的通道比较- 16位自由运行计数器的8位精度预分频器- 1个16位脉冲累加器PIT(周期性中断定时器)-多达4个独立的定时器超时周期-超时期限为1至224总线时钟周期选择-超时中断和周边触发器-定时器开始可以对齐高达8通道× 8位或4通道x 16位脉宽调制器-每通道占空比和周期都是可编程的-中心或左对齐输出-可编程时钟选择逻辑的和频率范围串行外设接口模块(SPI)-可设置为8位或16位数据的大小-全双工或单线双向-双缓冲的发送和接收-主或从模式-最高位先或LSB先移-串行时钟相位和极性选择两个串行通信接口(SCI)-全双工或单线运行-标准标记/空间不返回到归零(NRZ)格式-可选的IrDA 1.4返回到零反转(RZI)可编程脉冲宽度格式- 13位波特率选择-可编程的字符长度-可编程极性的发射机和接收机-接收唤醒的积极边缘-间隔检测和传输冲突检测支持片上电压调节器-两个平行的,与带隙基准的线性稳压器-低电压检测(LVD)认证的低电压中断(LVI)号-上电复位(POR)电路-低电压复位(LVR)的低功耗唤醒定时器(API)的-内部振荡器驾驶递减计数器-微调到+ / -10%的准确度-超时时间为0.2ms的范围内,从同一个0.2ms〜13秒的决议输入/输出-最多91个通用输入/输出(I / O)引脚取决于封装选择和2个输入专用管脚-磁滞和可配置上拉/下拉输入引脚上的所有设备-在所有输出引脚可配置驱动力量封装选择- 112引脚小外形四方扁平封装(LQFP封装)- 80引脚四方扁平封装(QFP)- 64引脚小外形四方扁平封装(LQFP封装)操作条件-宽单电源电压范围3.135 V至5.5 V的全性能-单独的电源内部电压调节器和I / O优化的EMC滤波容许- 40MHz的最大CPU总线频率-环境温度范围:-40°C至125°C-温度选项:- -40°C至85°C- -40°C至105°C- -40°C至125°C1.1.2 工作模式模式种类:正常的单芯片模式特别的单主动背景调试模式芯片模式1.1.3 信号的详细说明1.1.3.1 EXTAL,XTAL - 振荡器引脚EXTAL和XTAL是晶体驱动和外部时钟引脚。
基带时钟信号发生模块根据题目要求,我们选用单片机MC9S12XS128 来产生基带的时钟信号,为了节约拨码开关,我们采用BCD码来编码1~10个按钮,分别表示10KHz~100KHz。
MC9S12XS128的PWM是指脉冲宽度调制,是利用其数字输出来对模拟电路进行非常有效的一种控制技术,在MC9S12XS128中,PWM主要是通过设置相关的寄存器,让PWM0~PWM7引脚输出一定周期一定占空比的矩形波,输出的矩形波的周期和占空比在输出的过程中,可以通过改变相关寄存器的值来改变。
设置完相关的寄存器,就可以编写程序以实现方波的产生,单片机外围接上四个拨码开关并采用BCD编码来表示1~10,分别代表单片机产生的10KHz~100KHz,拨码开关接在PA0~PA3上即可。
相关的程序清单详见附件。
数据率由示波器测试,我们所使用的型号为UTD2102CED数字示波器能够显示精确到小数点后两位的数据,数据率测试如表6.2所示。
表6.2 数据率测试预输出(KHz)102030405060708090100实测(KHz)10.0020.0030.0340.0050.0059.8869.9380.0090.10100.00误差(%)000.100-0.2-0.10-0.110结果表明:由MC9S12XS128 的PWM 产生的时钟信号十分准确,精度很高,误差在允许的范围内且误差极小,时钟信号精度越高,最后显示的眼图也就越清晰。
程序清单1 初始化程序#include <hidef.h> /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */char key,i=0;char Tab[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //共阳0~9char code[4]={0xC0,0xC0,0xC0,0xC0};...................初始化程序(PLL 锁相环).....................void SetBusCLK_40M(void){CLKSEL=0X00;//不使能锁相环时钟 PLLCTL_PLLON=1;//锁相环电路允许 SYNR =0xc0 | 0x04; //相当于SYNRJ=0xc4 REFDV=0x80 | 0x01; //相当于REFDV=0x81POSTDIV=0x00; //pllclock=2*osc*(1+SYNR)/(1+REFDV)=80MHz; _asm(nop); //BUS CLOCK=40M_asm(nop); //短暂延时,等待时钟频率稳定while(!(CRGFLG_LOCK==1)); //时钟频率已稳定,锁相环频率锁定 CLKSEL_PLLSEL =1;//使能锁相环时钟}...................PIT 初始化 定时10ms.....................void PIT_init(void){PITCFLMT=0X01; //PIT is disabled ,无等待模式PITFLT=0X01; //PIT0强制加载PITCE=0X01; //PIT0使能PITMUX=0X0E; //通道0使用微定时基准0PITINTE=0X01; //使能PIT0中断PITTF=0X0F; //超时标志位清零PITMTLD0=9; //微计数器0赋值9PITLD0=39999; //PIT0加载计数器赋值,定时10msPITCFLMT_PITE = 1; // PIT 使能}ms us 10us 25.013999925.0025.0)19(us 025.0M401M 40=⨯+=⨯+=)(,总线周期为...................PWM初始化.....................void PWM_Init(void) //PWM初始化{PWME=0x00; //禁止PWMPWMCTL=0x10; //通道0和通道1级联成一个16位PWM通道PWMCLK=0x00; //时钟来源选择pwm01 选择ClockAPWMPRCLK=0x22; //ClockA=ClockB=BUS(40MHz)/4=10MHz PWMPOL=0xFF; //PWM0、1输出起始为高电平,PWM2、3输出起始为高电平PWMCAE=0x00; //01左对齐方式;2左对齐}...................IO口初始化.....................void IO_Init(void){DDRA=0xF0; //高四位为输出口,第四位为输入口DDRB=0xFF; //初始化端口}..................延时程序延时1ms......................void delayms(int ms){int ii,jj;if (ms<1) ms=1;for(ii=0;ii<ms;ii++)for(jj=0;jj<3338;jj++); //40MHz--1ms}................完成PWM模块初始化........................void PWM(void){switch(key){/*case 0:101101++=PWMPER PWMDTY a {PWME=0x00;break;} */case 1:{PWMPER01=1000; //频率=ClockA/1000=10KHzPWMDTY01=500;//占空比PWME=0xFF;//使能PWM break;}case 2:{PWMPER01=500;PWMDTY01=250;PWME=0xFF;break;}case 3:{PWMPER01=333;PWMDTY01=160;PWME=0xFF;break;}case 4:{PWMPER01=250;PWMDTY01=125;PWME=0xFF;break;}case 5:{PWMPER01=200;PWMDTY01=100;PWME=0xFF;break;}case 6:{PWMPER01=167;PWMDTY01=83;PWME=0xFF;break;}case 7:{PWMPER01=143;PWMDTY01=70;PWME=0xFF;break;}case 8:{PWMPER01=125;PWMDTY01=62;PWME=0xFF;break;}case 9:{PWMPER01=111;PWMDTY01=55;PWME=0xFF;break;}case 10:{PWMPER01=100;PWMDTY01=50;PWME=0xFF;break;}}} ...................主程序..................... void main(void){DisableInterrupts; SetBusCLK_40M();IO_Init();PWM_Init();PIT_init(); EnableInterrupts;while(1){code[3]=Tab[key/10];code[2]=Tab[key%10];code[1]=Tab[0]&0x7F;code[0]=Tab[0]; for(i=0;i<4;i++){switch(i){case 0:{PORTB=code[0];PORTA=0x10;break;}case 1:{PORTB=code[1];PORTA=0x20;break;}case 2:{PORTB=code[2];PORTA=0x40;break;}case 3:{PORTB=code[3];PORTA=0x80;break;}}delayms(10);}}}#pragma CODE_SEG __NEAR_SEG NON_BANKED //中断函数置于非分页区内void interrupt 66 PIT0_interrupt(){key=PORTA;key=~key;key=key&0x0F;PWM();PITTF_PTF0=1;}#pragma CODE_SEG DEFAULT2 时钟信号产生程序/*制作一个波形发生器,该波形发生器能产生正弦波,方波和三角波,波形的输出频率由用户设定,频率由数码管显示。
买了本《嵌入式系统——使用HCS12微控制器的设计与应用》这本书,看了觉得帮助不大。
因为里面有些东西讲得不够详细,并且这本书不是针对XS128来写的。
网上也有一些网友写的资料,那都只是针对某一方面的。
我觉得最好的资料还是英文版的说明文档,里面好多东西都讲得很详细,虽然看起来有点费劲,但那里值得的。
接下来就自己的学习经历。
TIM中的功能比较多,有输入捕捉、输出比较,还有脉冲累加器。
这里主要记一下输入捕捉和输出比较。
输入捕捉这个功能很有用,他不仅可以捕捉外界事件的发生(这个功能和51中的外部中断差不多),还可以捕捉外界事件发生的时间。
捕捉外界时间这个功能可以运用到驱动超声波测距中去。
IOC0~IOC7是输入捕捉\输出比较的外部针脚。
当IOSx=0时(IOSx=1时为输出比较),则将相应的通道配置为输入捕捉了。
当输入捕捉检测到有上升沿或下降沿时,就会把那时寄存器的值锁存到TCx中,这样就可以通过查询TCx来确定事件发生的时间了。
如果输入捕捉控制寄存器TIE(CxI=1)中允许输入捕捉中断,则捕捉到事件时,系统会产生一次中断。
接下来依次说明一下相关的寄存器设置:TSCR1:TEN是定时器允许位。
TEN=1时,允许定时器工作,TEN=0时,禁止定时器工作。
其余不常用,设为0即可。
TSCR2:TOI是定时器溢出中断允许位。
这个在输入捕捉中没用到,设为0即可。
TCRE是定时器计数寄存器复位允许位。
用在输出比较中,允许输出比较寄存器7的事件来复位定时器计数寄存器。
这里设为0即可。
PR2~PR0是定时器分频因子选择位。
不同的组合可以设定不同的定时器时钟:TIOS是输入捕捉和输出比较选择寄存器,在这里设定IOC0~IOC7是用于输入捕捉还是用于输出比较。
里面的8位对应着IOC0~IOC7八个通道,相应位位1,则设为输出比较。
相应位设为0,则为输入捕捉。
TCTL3和TCTL4是用来设定输入捕捉极性的寄存器,在这里可以设为上升沿、下降沿、上升沿或下降沿触发输入捕捉。
其中EDGxB和EDGxA一起来设相应通道输入捕捉极性,对应的功能如下:(0 0)为禁止输入捕捉。
(0 1)为上升沿捕捉(1 0)为下降沿捕捉(1 1)为上升沿或下降沿捕捉TIE是输入捕捉或输出比较中断允许位。
这里的每一位是和TIOS上的位一一对应的。
相应置1时,则捕捉到事件时,则系统会产生中断。
相应位设为0时,则不能。
TFLG1是输入捕捉或输出比较中断标位寄存器。
当发生输入捕捉或输出比较事件时,相应位置1。
向该位写1,可以清空该标志位。
通道寄存器TC0~TC7用于锁存发生捕捉事件时自由运行的计数器的计数值。
通过查询TC0~TC7相应的位,可以确定捕捉事件发生的时刻。
与输入捕捉相关的寄存器还有:ICOVW:输入控制修改寄存器ICSYS:输入控制系统控制寄存器DLYCT:延迟计数控制寄存器(可以自动处理窄脉冲干扰)这些不常,可以不管接下来按照上面的寄存器设置好相应的功能,程序就出来了:void ECT0_INIT() //输入捕捉通道0初始化函数{TSCR2=0X06; //关闭溢出中断且64分频TIOS_IOS0=0; //定通道0为输入捕捉,1为输出比较TCTL4=0X01; //上升沿捕捉0x02为下降沿捕捉TIE_C0I=1; //通道0中断使能TSCR1=0X80; //开启总定时器中断TFLG1_C0F=1; //标志位清零}中断程序:#pragma CODE_SEG __NEAR_SEG NON_BANKED //分配内存空间void interrupt 8 timer_onput() //输入捕捉通道0的中断向量为8{TFLG1_C0F=1; //标志位清零asm sei; //关总中断// PORTB=~PORTB;PORTB&=~(1<<7);delay_us(1);PORTB|=(1<<7);asm cli; //开总中断}输出比较看似不能,却磨折了我两天,其中大多都是些小细节问题在纠缠。
现在终于想明白其中一些道理。
不过有些寄存器还是没有理解,如强制输出比较寄存器CFORC,测试了好久,都未能得到想要的结果,希望路过的高手能指点一下。
接下来继续记一下学习输出比较的点点滴滴吧。
XS128的定时器模块中的输入捕捉和输出比较共用同一组管脚。
可以通过设置TIOS寄存器来选择。
我觉得输出比较的原理和PWM波的产生原理差不多,都是通过计数器的数值和某一寄存器里的值比较产生输出的高低电平变化。
在输出比较中,当计数器的值与某一输出比较通道的TCx(TC0~TC7)的值相等时,该通道上引脚会输出高电平、低电平,或是对引脚上的电平进行翻转。
这时标志位CxF会置位,如果开通中断的话(TIE中的CxI=1),系统还会产生一个中断。
输出比较用到的寄存器好多都是和输入捕捉的一样,现在按照输出比较的程序需要再过一遍。
定时器系统控制寄存器TSCR1:设置定时器正常工作定时器系统控制寄存器TSCR2:设置定时器溢出中断允许,和定时器时钟分频设置定时器计数寄存器TCNT:这是个16位寄存器,在一般情况下是不可以写的。
输入捕捉时,就是这个寄存器的值存入TCx中,输出比较时,也是这个寄存器的值与TCx的值比较。
它的时钟由TSCR2设置的分频决定。
程序中这个寄存器一般情况下不用理会。
主定时器国断标志寄存器TFLG2:在这个寄存器中只有最高位TOF有效,是定时器溢出标志位。
当TCNT运行产生溢出时,该位就置位了。
如果允许定时器溢出中断的话,则系统会产生一个中断。
输入捕捉和输出比较选择寄存器TIOS:设置相应的通道为输入捕捉或是输出比较。
主定时器中断标志寄存器TFLG1:输入捕捉或输出比较的各通道的中断标志位。
对相应的通道写1,可以清除标志位。
定时器中断允许寄存器TIE:里面有8位,对应输入捕捉或输出比较的8个通道,设置是否允许相应通道的中断。
通道寄存器TC0~TC7:在输出比较中随时可以写入,它的作用是,当TCx=TCNT 时,相应的x通道就会发生输出比较。
此时相应的引脚就可以输出高电平、低电平,或是翻转引脚的电平。
上面的寄存器都是和输入捕捉共用的,在输入捕捉中讲过。
接下来就具体说明输出比较特别有的寄存器设置。
TCTL1~TCTL2:这个两个寄存器中每个OMx和OLx组合在一起,来设置相应通道的引脚电平输出方式:(0 0):输出比较的通道与引脚逻辑断开,也就是输出比较的输出不会影响相应的引脚的电平。
(0 1):翻转输出比较的引脚的电平。
(1 0):在相应的引脚上输出低电平。
(1 1):在相应的引脚上输出高电平。
CFORC:定时器强制输出比较寄存器相应位置1时,可以把相应通道的输出比较设为强制输出比较。
一般情况下不用。
OC7M:输出比较通道7屏蔽寄存器OC7D:输出比较通道7数据寄存器通道7上的连续输出比较会覆盖所有其他通道的引脚上的输出结果。
OC7M就是设置其他通道的哪些通道会受通道7控制的。
当OC7M的某位置1时,相应通道的输出比较就会受通道7控制,此时受控的通道在其通道上设置的OMx和OLx无效了,而是按照OC7D中对应的OC7Dx 中的值输出到相应的引脚上。
总的来说,OC7M是选择受通道7控制的其他通道,而OC7D 是受控的通道在通道7发生输出比较时的输出结果。
TTOV:定时器溢出翻转寄存器相应通道置1时,计数器溢出时,允许翻转输出比较引脚上的电平。
这个寄存器只在输出比较模式下才有效。
一般情况下,用不到这个寄存器,程序中不用做设置。
OCPD(OCPD0~OCPD7):当相应位置1时,标志位正常,但是输出比较的结果不能输出到引脚上,也就是输出比较的寄存器与引脚逻辑断开了。
当相应位设为0时,标志位正常,引脚输出也正常。
下面是相应的程序:#include <hidef.h> /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */void main(void){DDRB=0XFF;PORTB=0X7F;//DisableInterrupts;TSCR2=0X07; //设置定时器分频TIOS=0X01;//通道0为输出比较TCTL2=0X01; //模式为翻转引脚输出电平TC0=0XAAAA; //设置输出引脚在一个周期内翻转的时间,//如果这个值保持不变的话,那总的来看,//引脚输出电平的周期是不变的,周期等于计数器计数一周的时间//TTOV=0X00; ////CFORC=0X01; //加上这一句,似乎没什么影响。
还没清这个寄存器的具体作用。
TIE=0X01; //相应通道中断允许TSCR1=0X80; //打开定时器//PORTB=PTT;EnableInterrupts;while(1);}#pragma CODE_SEG __NEAR_SEG NON_BANKED interruptvoid interrupt 8 CH0_ISR(void) //要特别注意中断函数的书写格式,我就在这里吃了大亏{DisableInterrupts;TFLG1=0x01; //清零标志位if(TC0==0xAAAA) //改变引脚输出的占空比。
输出的周期由计数器计数一//周的时间决定,要改变,只能改变定时器的时钟分频TC0=0xffff;elseTC0=0xAAAA;PORTB_PB7=~PORTB_PB7; //测试是否进入中断EnableInterrupts;}XS128中的脉冲累加器和DG128的很不一样。
相对DG128来说,XS128的脉冲累加器大大简化了,其中只有三个寄存器需要设置:PACTL、PAFLG、PACNT。
16位脉冲累加器PACT与IOC7共用一个引脚。
顾名思义,脉冲累加器就是对有效边沿(上升沿或下降沿)进行计数,然后把计数的值保存在寄存器PACNT中。
寄存器PACTL是16位脉冲累加器的核心,几乎所有的设置都是在这个寄存器中。
接下来解剖一下这个核心寄存器PACTL:PAEN:脉冲累加器允许位,置1,则工作。
置0,则禁止。
PAEN与TEN无关,定时器TEN禁止时,脉冲累加器仍可以工作。
PAMOD:工作方式选择位。
置1,为门控时间累加器方式。
置0,为事件计数器方式。
门控时间累加器方式:输入引脚上的有效电平会触发脉冲累加器对64分频后的时钟进行计数。
事件计数器方式:脉冲累加器对引脚上的每个有效边沿计数。
引脚上每产生一个有效边沿,脉冲累加器计数器的值就会加1。
PEDGE:边沿跳变控制位。
它的功能和脉冲累加器的工作方式有关。