Freescale单片机原理与设计(TPM模块应用编程)
- 格式:doc
- 大小:191.00 KB
- 文档页数:18
freescale hcs08单片机原理及应用单片机作为计算机科学领域重要的嵌入式系统组成部分,广泛应用于各个领域,其中Freescale HCS08单片机以其高性能、低功耗和易于开发等特点备受关注。
本文将介绍Freescale HCS08单片机的原理以及其应用。
一、Freescale HCS08单片机原理Freescale HCS08单片机采用基于哈佛结构的8位微处理器单元,具有高速运算能力和丰富的外设接口,能够满足不同领域的需求。
其核心原理包括指令集、片内存储器、时钟系统和外设接口等。
1. 指令集Freescale HCS08单片机的指令集丰富多样,包括数据传送、算术逻辑、位操作、条件转移和中断等多种类型的指令。
指令执行的速度快,能够满足实时性要求高的应用场景。
2. 片内存储器HCS08单片机内部集成了存储器单元,包括程序存储器ROM和数据存储器RAM。
ROM用于存储程序和常量,RAM用于存储变量和中间结果。
片内存储器的设计使得单片机具有较高的存储容量和读写速度。
3. 时钟系统Freescale HCS08单片机的时钟系统采用晶体振荡器作为基准时钟源,通过分频和锁相环等技术生成系统时钟。
时钟系统的设计能够提供稳定的时钟信号,确保单片机的正常运行。
4. 外设接口HCS08单片机提供了多种外设接口,包括通用输入输出引脚、定时器/计数器、串行通信接口等。
通过这些外设接口,单片机可以与外部设备进行数据交换和通信,实现各种功能。
二、Freescale HCS08单片机应用Freescale HCS08单片机在各个领域都有广泛的应用,如工业控制、汽车电子、家电控制、医疗设备等。
以下将介绍几个常见的应用案例。
1. 工业控制Freescale HCS08单片机在工业控制中扮演重要角色。
它能够实现对温度、压力、流量等参数的监测和控制,实现自动化生产线的稳定运行。
同时,单片机的高可靠性和抗干扰能力,使得它能够适应各种恶劣的工业环境。
第3章MC9S08AW60单片机概述Freescale的08系列单片机由于其稳定性高、开发周期短、成本低、型号多种多样、兼容性好而被广泛应用。
本章概要介绍08系列单片机的类型、基本结构,并从总体上阐述其性能特点。
主要内容有:在介绍08系列单片机的命名规则和资源状况的基础上,以MC9S08AW60为例讲述HCS08系列单片机的基本结构和特点。
3.1 08系列单片机简介目前,Freescale的08系列单片机主要有HC08、HCS08 和RS08共3种类型。
HC08是1999年开始推出的产品,种类也比较多,针对不同场合的应用都可以选到合适的型号。
HCS08是2004年左右推出的8位MCU,资源丰富、功耗低、性价比很高,是08系列单片机的发展趋势。
HC08与HCS08的最大区别是调试方法不同与最高频率的变化。
RS08是HCS08构架的简化版本,于2006年推出,其内核体积比传统的内核小30%,带有精简指令集,满足用户对体积更小、更加经济高效的解决方案的需求。
RAM及Flash空间大小差异、封装形式不同、温度范围不同、频率不同、I/O资源差异等形成了不同型号,为嵌入式应用产品的开发提供了丰富的选型。
3.1.1Freescale单片机的命名规则Freescale单片机的型号庞大,但同一系列的CPU是相同的,也就是说具有相同的指令系统,多种型号只是为了适用于不同的场合。
为了方便实际应用时的选型,需要了解Freescale 单片机的命名方法,其基本命名规则如下:XX X XX XX X XXXX①②③④⑤⑥⑦①产品状态。
M C—Fully Qualified(合格);PC—Product Engineering(测试品)。
在实际应用中,通常都是选用MC类型的产品。
如MC908GP32、MC9S08GB60、MC9RS08KA2等。
②存储器类型标志。
“无”表示片内带ROM或片内没有程序存储器;7表示片内带EPROM或一次可编程ROM(one time programmable ROM,OTPROM);8表示片内带EEPROM;9表示片内带闪存Flash EEPROM。
一般性实验实验一普通I/O口操作实验实验目的:1、熟悉SDIDE开发环境,熟悉GP32基本程序结构2、理解Freescale MCU的编程框架3、熟悉编程调试环境,编译、调试、下载运行第一个程序4、掌握I/O的基本编程方法范例程序:① A01_简单IO及程序框架\ FrmMain.ASM② C01_简单IO及程序框架\纯C\prgframe.prj③ C01_简单IO及程序框架\C&ASM混编\prgframe.prj实验要求:1、参看教材6.4节,熟悉实验板结构2、运行并读懂教材第7章的关于I/O口操作的LED灯控制程序3、按下列要求新建一程序:根据PB口低2位(PTB1和PTB0)的状态输出四种不同的LED显示效果,要求用最简洁的语句实现以下各效果。
(1)PTB1=0,PTB0=0时,效果为:8个LED中只有一个灯亮,亮灯顺序是从左到右,再从右到左,一个周期时间长度约4秒。
(效果1)(2)PTB1=0,PTB0=1时,效果为:8个LED中只有两个连在一起的灯亮,亮灯顺序是从左到右,再从右到左,一个周期时间长度约4秒。
(效果2)(3)PTB1=1,PTB0=0时,效果为:8个LED中只有一个灯亮,亮灯顺序是从左到右,再从右到左,一个周期时间长度约8秒。
(效果3)(4)PTB1=1,PTB0=1时,效果自定。
(效果4)实验二串行通信实验实验目的:1、理解串行通信基本原理,掌握MCU串行通信基本编程方法2、理解串行通信的查询方式和中断方式原理及其编程范例程序:1、C02_1串行通信查询方式\ H08SCI_1.prj2、C02_2串行通信中断方式\ H08SCI_2.prj3、A02_1串行通信查询方式\ SCIMain1.asm4、A02_2串行通信中断方式\ SCIMain2.asm5、以上四目录都有VB_SCI目录,该目录是对应Visual Basic6.0程序,运行在PC方,用来接收和发送数据。
第1章 绪 论1.1 微型计算机概述1.1.1 微型计算机的组成一个典型的微型计算机包括:运算器、控制器、存储器和输入/输出接口四部分。
如果把运算器与控制器集成在一个硅片上,则该芯片为中央处理器CPU (Central Processing Unit )。
存储器包括程序存储器和数据存储器两类。
输入/输出接口包括模拟量输入/输出和开关量输入/输出。
软件部分包括系统软件(如操作系统)和应用软件(如字处理软件)。
典型微型计算机的组成如图1-1所示。
⎪⎪⎪⎪⎩⎪⎪⎪⎪⎨⎧⎪⎩⎪⎨⎧⎪⎩⎪⎨⎧⎪⎩⎪⎨⎧)DO /DI (/AO /AI (//CPU 输出开关量输入)输出模拟量输入输出接口输入数据存储器程序存储器存储器控制器运算器)中央处理器(微型计算机 图1-1 典型微型计算机的组成1.1.2 微型计算机的分类微型计算机种类繁多,型号各异。
因此,可以从不同角度对其进行分类。
最常见的是按微处理器的字长和按微型机的构成形式进行分类。
微处理器是微型计算机的核心部件,微处理器的性能(特别是字长)在很大程度上决定了微型机的性能。
1.按微处理器(CPU )字长分类按微处理器字长来分,微型计算机一般分为4位、8位、16位、32位和64位机几种。
(1)4位微型计算机用4位字长的微处理器作CPU ,其数据总线宽度为4位,一个字节数据要分两次来传送或处理。
4位机的指令系统简单、运算功能单一,主要用于袖珍或台式计算器、家电、娱乐产品和简单的过程控制,是微型机的低级阶段。
(2)8位微型计算机用8位字长的微处理器作CPU ,其数据总线宽度为8位。
8位机中字长和字节是同一个概念。
8位微处理器推出时,微型机在硬件和软件技术方面都已比较成熟,所以8位机的指令系统比较完善,寻址能力强,外围配套电路齐全,因而使8位机通用性强,应用宽广,广泛应用于事务管理、工业生产过程的自动检测和控制、通信、智能终端、教育以及家用电器控制等领域。
(3)16位微型计算机用高性能的16位微处理器作CPU,数据总线宽度为16位。
第8章定时器/计数器模块8.1 定时器定时器是主管定时的系统。
MCS08AW60内部包括两个独立的定时器。
定时器的核心是一个16位计数器。
该计数器的时钟由外部晶振时钟或者锁相环模块总线时钟经过预定的分频因子分频得到,相互独立的定时器可以使用不同的分频因子。
同一个定时器的所有动作都以分频后的时钟作为参考,相互之间都有确定的关系。
从单片机的角度看,一个单位时间就是定时器的自由运行计数器计数的时间间隔,所以在任何时候都可以通过读取计数器的值而判断经过了多少时间。
使用预置计数功能可以得到精确的溢出时间,可以在任何时候暂停或清除计数器的计数。
通过定时器的溢出功能可以进行长时间的定时。
定时器具有定时溢出、输入捕捉、输出比较、PWM脉冲输出和DMA直接存储器访问等功能。
定时器应用很广,如利用输入捕捉测量脉宽和频率;输出特定的波形;直接输出脉宽调制波(PWM);使用输入捕捉配合输出比较来输出同步波形以及用于延时等。
下面就以MCS08AW60为例,详细阐述定时器的功能及应用。
8.1.2定时器的结构及基本功能MCS08AW60定时器的功能结构图如图8-1所示。
每个定时器具有两路独立的输入捕捉和输出比较通道;可以实现带缓冲(Buffered)和不带缓冲(Unbuffered)的脉宽调制波;可以得到8种可编程选择的分频因子;可以自由运行计数或预置计数;可以停止或清除计数器计数;定时器溢出可以引发中断,每路通道的输入捕捉和输出比较也可以引发中断。
每一路定时器都由以下寄存器控制:1)一个8位状态和控制寄存器——TPMxSC;2)一个16位计数器寄存器——TPMxCNTH:TPMxCNTL;3)一个16位预置计数器寄存器——TPMxMODH:TPMxMODL;4)控制每个通道的8位状态和控制寄存器——TPMxCnSC;5)每个通道计数器值的16位寄存器——TPMxCnVH:TPMxCnVL。
注:寄存器命名中的“x”表示定时器模块标志。
XX科技大学Freescale单片机原理与设计实验报告实验项目TPM编程应用【实验目的】1、理解HCS08的定时器/PWM模块TPM(Timer/Pulse-Width Modulator)模块原理2、学会TPM模块设计3、进一步认识“对MCU外部管脚/内部模块的控制正是通过Regs的控制来实现”【实验原理】MC9S08AW60系列中的定时器系统包括两个独立的TPM:一个6通道的TPM1和一个2通道的TPM2。
TPM模块管脚和I/O 管脚复用。
定时器系统总共8个通道,每一个通道都可作为输入捕捉、输出比较、或带缓冲的边缘对齐PWM。
每一个TPM的所有通道都可以配置成为带缓冲的中心对齐脉宽调制CPWM (buffered, center-aligned pulse-width modulation)。
每一个TPM预分频器的时钟源都可以独立选择总线时钟、固定系统时钟或外部管脚对每个TPM,每个通道一个中断,还有一个计数中止中断。
定时器系统的内部结构为:两个独立的TPM每个TPM都由1个16位的计数器与n(n=6 or 2)个输入/输出通道组成;每一个通道都可作为输入捕捉、输出比较、或带缓冲的边缘对齐PWM。
TPM模块自由计数定时核心是一个16位的计数器。
三种时钟源之一经过分频之后的脉冲即作为定时器的计数脉冲;每过一个计数脉冲,Counter便自动+1,Counter加到FFFF后翻转到$0000,同时置溢出标志位TOF为1,然后重新开始计数;溢出时若TOIE为1,还会产生中断请求。
Fbus和分频比的不同可以产生不同的溢出时间间隔;但是这种自由计数定时方式定时有限。
只读的16位TPM计数寄存器由两个字节寄存器TPMxCNTH和TPMxCNTL构成。
TPM预置计数定时:向16位模数计数寄存器TPMxMODH:TPMxMODL写入一个确定的数值,则计数器每进行一次计数都会将计数和模数计数寄存器的值进行比较,如果相同就产生溢出,同时置溢出标志位TOF为1,然后重新开始计数,溢出时若TOIE为1,还会产生中断请求。
TPM每个自由计数器包含三个寄存器:一个8位状态控制寄存器(TPMxSC),一个16位计数器(TPMxCNTH:TPMxCNTL,一个16位模数寄存器(TPMxMODH:TPMxMODL)。
其中,x=1/2 (1)定时器x状态控制寄存器(TPMxSC)如下图:其中,TOF为溢出标志位,为0则没有达到预置计数寄存器中的值没有溢出,为1则达到了预置计数寄存器中的值溢出。
TOIE 为定时溢出中断允许位,可读/可写位用来允许定时器的溢出中断。
TOIE为1,TOF为1时允许中断,复位清TOIE。
定时器x状态控制寄存器(TPMxSC)CLKS[B:A]与PS[2:0]功能如下图:(2)定时器x计数寄存器(TPMxCNTH:TPMxCNTL)只读的16位TPM计数寄存器由两个字节寄存器TPMxCNTH和TPMxCNTL构成。
读两个字节中的任何一个字节都会把两个字节内容锁存进内部缓冲器,直到另外一个字节也被读取为止。
这允许以任何顺序读取连贯的16位寄存器。
如下图:(3)定时器x模数寄存器(TPMxMODH:TPMxMODL)。
可读/写的TPM模数寄存器中包含TPM计数器的模数值。
当TPM计数器到达这个模数值后,TPM计数器在下一个时钟要么重新从0x0000开始计数(CPWMS=0),要么从这个模数值往下减1计数(CPWMS=1),同时溢出标志TOF(Timer Overflow Flag)变为1。
只写TPMxMODH或者TPMxMODL其中的一个会抑制住TOF和溢出中断直到些另外一个字节也被写为止,因此两个寄存器一定都要写,不能只写一个而不管另一个。
复位会使TPM模数寄存器为0x0000,相当处于自由运行定时器计数模式(模数禁止)。
如下图:【实验装置】Freescale HC08单片机,CodeWarrior开发环境【实验内容】⑴利用TPM,编程实现下列功能:利用两个七段数码管,实现00-59秒显示:自动从00开始,每一秒钟,数字加1;加到59之后,自动回到00,重复开始;⑵外接IRQ按键,平时00-59自动加数显示,按IRQ按键一次后,加数显示停止,再按一次IRQ按键,继续加数显示。
【结果分析】实验(1)最终实现了用TPM2模块精确定时半秒,再利用半秒产生秒的各位和十位,并把秒的各位和十位送到两位数码管上显示。
数码管采用动态扫描的方式显示。
TPM2_ISR每隔500ms 清零一次,对秒钟的高地位进行加处理。
对TPM2溢出标志清零首先读标志位,然后写0到标志位。
实验结果显示正确。
实验(2)在(1)的基础上,增加了IRQ中断模块。
每按一次IRQ按键FLAG计数加1,然后取FLAG的最低位。
若最低位为0,则停止秒计时,数码管显示时间保持不变;若最低位为1,则正常计时、显示。
这样就实现了按IRQ按键一次后,加数显示停止,再按一次IRQ按键,继续加数显示。
【实验代码】(1)INCLUDE MC9S08AW60.INC; 包含头文件ORG $0070Half_Sec DS 1;半秒时间变量SEG_Select DS 1;数码管位选变量Second_L DS 1;秒钟低位Second_H DS 1;秒钟高位NUM DS 1COUNT DS 1ORG $1860LED_Table: DC.B $c0,$f9,$a4,$b0,$99,$92,$82,$f8 ;LED 字形码表DC.B $80,$90recycle: MOV #70t,NUM ;软件延时5msDBNZ NUM,*RTSDelay_5ms:MOV #38t,COUNTrecall:BSR recycleDBNZ COUNT,recallMOV #07t,COUNTDBNZ COUNT,*RTSIO_Init: ;IO初始化模块MOV #$FF, PTGD ; 初始化输出端口的数据寄存器MOV #$FF, PTDD ; 初始化输出端口的数据寄存器MOV #$FF, PTAD ; 初始化输出端口的数据寄存器LDA #%11111111STA PTADD ; 初始化PTA口的八个管脚作为输出STA PTDDD ; 初始化PTD口的八个管脚作为输出STA PTGDD ; 初始化PTG口的八个管脚作为输出RTS ;子程序返回TPM2_Init: ;TPM2模块中断方式初始化子程序MOV #$4E,TPM2SC ;BUSCLK为TPM2时钟源,64分频,允许TPM2中断MOV #$7A,TPM2MODHMOV #$12,TPM2MODL ;500ms对应模数值CLI ; 开总中断RTSTPM2_ISR: ;TPM2溢出中断服务子程序LDA TPM2SC ;先读标志位TEF BCLR 7,TPM2SC ;写0到TEF清TEF 标志位INC Half_SecLDA Half_SecCMP #2T ;是否到了1S BNE TPM2_ENDMOV #$00,Half_Sec ;到则秒钟加一,半秒清零INC Second_LLDA Second_LCMP #10T ;秒钟是否加到10BNE TPM2_ENDMOV #$00,Second_L :到则秒钟各位清零,十位加1INC Second_HLDA Second_HCMP #6T ;秒钟十位是否到6 BNE TPM2_ENDMOV #$00,Second_H ;到则秒钟10位清零TPM2_END:RTIMain:CLRXCLRACLRHSTA $1802 ;禁止COPMOV #$00,Half_SecMOV #$00,Second_H ;秒高位初始化MOV #$00,Second_L ;秒低位初始化JSR IO_Init ;对PTD,PTG,PTA 端口初始化JSR TPM2_Init ;TPM2初始化AGAIN:CLRHMOV #%11111110,PTAD ;位选低位LDA Second_L ;读秒低位CLRHTAXLDA LED_Table,X ;查字形码表STA PTGD ;输出秒低位NSASTA PTDDJSR Delay_5ms ;延时5msMOV #$FF,PTDD ;熄灭数码管,避免宇辉MOV #%11111101,PTAD ;位选数码管高位LDA Second_H ;读秒高位CLRHTAXLDA LED_Table,XSTA PTGDNSASTA PTDD ;显示秒高位JSR Delay_5msMOV #$FF,PTGDJMP AGAINORG $FFE2DC.W TPM2_ISRORG $FFFEDC.W Main INCLUDE MC9S08AW60.inc ; 包含头文件(2)INCLUDE MC9S08AW60.INC; 包含头文件ORG $0070Half_Sec DS 1;半秒时间变量SEG_Select DS 1;数码管位选变量Second_L DS 1;秒钟低位Second_H DS 1;秒钟高位FLAG DS 1 ;IRQ中断计数标志NUM DS 1COUNT DS 1ORG $1860LED_Table: DC.B $c0,$f9,$a4,$b0,$99,$92,$82,$f8 ;LED 字形码表DC.B $80,$90recycle: MOV #70t,NUM ;软件延时5msDBNZ NUM,*RTSDelay_5ms:MOV #38t,COUNTrecall:BSR recycleDBNZ COUNT,recallMOV #07t,COUNTDBNZ COUNT,*RTSIO_Init: ;IO初始化模块MOV #$FF, PTGD ; 初始化输出端口的数据寄存器MOV #$FF, PTDD ; 初始化输出端口的数据寄存器MOV #$FF, PTAD ; 初始化输出端口的数据寄存器LDA #%11111111STA PTADD ; 初始化PTA口的八个管脚作为输出STA PTDDD ; 初始化PTD口的八个管脚作为输出STA PTGDD ; 初始化PTG口的八个管脚作为输出RTS ;子程序返回IRQ_Init: ;IRQ中断初始化模块MOV #$00, FLAG ;FLAG清零LDA #%00010010STA IRQSC ; IRQ功能允许,仅下降沿触发,允许中断RTSIRQ_ISR:INC FLAGI ;计数加一LDA FLAGAND #%00000001 ;取最低位STA FLAGBSET 2, IRQSC ;向IRQACK位写1以清零IRQFRTITPM2_Init: ;TPM2模块中断方式初始化子程序MOV #$4E,TPM2SC ;BUSCLK为TPM2时钟源,64分频,允许TPM2中断MOV #$7A,TPM2MODHMOV #$12,TPM2MODL ;500ms对应模数值CLI ; 开总中断RTSTPM2_ISR: ;TPM2溢出中断服务子程序LDA TPM2SC ;先读标志位TEF BCLR 7,TPM2SC ;写0到TEF清TEF 标志位INC Half_SecLDA Half_SecCMP #2T ;是否到了1S BNE TPM2_ENDMOV #$00,Half_Sec ;到则秒钟加一,半秒清零LDA FLAGLDA FLAGCMP #0T ;FLAG不为0,则停止计数BNE TPM2_ENDINC Second_LLDA Second_LCMP #10T ;秒钟是否加到10 BNE TPM2_ENDMOV #$00,Second_L :到则秒钟各位清零,十位加1INC Second_HLDA Second_HCMP #6T ;秒钟十位是否到6 BNE TPM2_ENDMOV #$00,Second_H ;到则秒钟10位清零TPM2_END:RTIMain:CLRXCLRACLRHSTA $1802 ;禁止COPMOV #$00,Half_SecMOV #$00,Second_H ;秒高位初始化MOV #$00,Second_L ;秒低位初始化JSR IO_Init ;对PTD,PTG,PTA 端口初始化JSR TPM2_Init ;TPM2初始化JSR IRQ_Init ;IRQ初始化AGAIN:CLRHMOV #%11111110,PTAD ;位选低位LDA Second_L ;读秒低位CLRHTAXLDA LED_Table,X ;查字形码表STA PTGD ;输出秒低位NSASTA PTDDJSR Delay_5ms ;延时5msMOV #$FF,PTDD ;熄灭数码管,避免宇辉MOV #%11111101,PTAD ;位选数码管高位 LDA Second_H ;读秒高位CLRHTAXLDA LED_Table,XSTA PTGDNSASTA PTDD ;显示秒高位JSR Delay_5msMOV #$FF,PTGDJMP AGAINORG $FFFADC.W IRQ_ISRORG $FFE2DC.W TPM2_ISRORG $FFFEDC.WMain。