1.2 MC9S08JM60单片机的硬件结构
1.2.1 MC9S08JM60的CPU
MC9S08JM60为高性价比、低功耗的8位微处理器HCS08家族中的一员,其功能及主要特性如下:
● 8位48MHz HCS08 CPU。
● 在整个工作电压和温度范围内可读取/擦除/编程的60KB FLASH,有4KB的RAM,对RAM及FLASH中的数据有保护机制。
● 支持32个中断/复位源。
● 等待模式及两种超低功耗的停止模式。
● 多功能的时钟生成器,提供包括FLL、PLL、内部参考时钟、外部参考时钟等多种时钟源选项。
● 具有系统保护特性:
计算机正常工作的看门狗(COP)复位;
低电压检测复位或中断;
非法操作码检测复位;
FLASH块保护。
● 片上外部设备:
USB设备模块;
模拟比较器;
12通道12位模数转换器(ADC);
两个全双工异步串行通信接口(SCI);
最高可达100Kbps的串行扩展总线(IIC);
两个全双工或单线同步串行外设接口(SPI);
高达8通道的定时器/PWM模块。
● 51个双向I/O口、一个单向输入口、一个单向输出口及8个键盘中断。
● 具有单线的背景调试接口、端点在线调试、在线仿真器(ICE)调试模块,8级深度FIFO用于保存流程变化地址和单事件数据。
图1-1所示为MC9S08JM60(以下简称为JM60)的内部结构框图。
图1-1 MC9S08JM60结构框图
1.2.2 JM60存储器的组织结构
JM60存储器的映像图如图1-2所示。
图1-2 JM60的存储映像图
1. RAM区域
JM60的内存RAM区容量达到4KB,其地址范围是:$0080~$107F。相对于GP32的512B,JM60的RAM是相当丰富的资源,这对于完成一些对内存需求较大的嵌入式应用,是一个相当不错的选择。例如嵌入式网络系统、RTOS等应用。
在这个区域中,有128B的RAM属于第0页,即$0080~$00FF,这个地址范围寻址方便,合理分配使用这些内存地址对于实际编程有很大帮助。
2. FLASH区域
JM60有两个FLASH区域:从$1080到$17FF之间的1920B和从$182C到$FFFF之间的59348B。
3. 寄存器映像
JM60的寄存器有3个部分,包括:
● 直接页寄存器:$0000~$007F。
● 高端页寄存器:$1800~$182B。这个寄存器区放置了一些不常用的设置项。
● 非易失性寄存器:$FFB0~$FFBF。这个区位于FLASH存储区域中,对寄存器值的改变方法和其他位置的FLASH的擦写方法相同。这个区共16B,前8B($FFB0~$FFB7)是访问FLASH的“后门钥匙”,详细解释将在后面章节的FLASH保密性部分阐述。$FFB8~$FFBC是没有使用的保留部分,$FFBE是厂家放置ICG修正值的位置。$FFBD-NVPROT、$FFBF-NVOPT这两个值在MCU复位时分别赋给高端寄存器页的FPRO($1824)和FOPT($1821)。
1.2.3 JM60的复位、中断和系统配置
1. 复位
复位使控制器进入初始状态。大部分状态和控制寄存器被迫使用初始值,并从复位向量(0xFFFE:0xFFFF)上载程序计数器。I/O初始化配置为没有上拉电阻高阻抗输入,片上外围模块被禁止,中断被禁止。初始化程序可对堆栈指针(SP)和系统控制进行初始化。SP在复位时强制设为0x00FF。
JM60系列有7个复位源:
● 上电复位(POR)
● 低电压检测(LVD)
● 计算机操作正常模块(COP)定时器
● 非法操作码检测(ILOP)
● 系统后台调试强制复位
● 外部复位引脚
● 时钟生成器锁定丢失和时钟复位丢失(LOC)
与系统复位相关的寄存器主要有系统复位状态寄存器(SRS)和系统后台调试强制复位寄存器(SBDFR)。SRS寄存器为只读寄存器,通过读取标志位可以知道引起上一次复位的复位源。向SRS寄存器写入任意值可以使COP计数器清零。SBDFR寄存器为只写寄存器,而且仅有最后一位(D0)可以写入。可以使用串行后台命令,如WRITE_BYTE,使外部调试主机强制进行目标系统复位。该位不能从用户程序中写入。读该寄存器总是返回0x00。
SRS寄存器的直观描述如下:
其中:
POR是上电复位标志位。
由于在上电复位的过程中,电压值会出现低于LVD阈值的情况,因此,上电复位后LVD也会被置1。
PIN是外部引脚/RESET的复位标志。
COP是看门狗复位标志位。
ILOP是非法操作码检测复位标志位。
LOC是时钟丢失复位标志位。
LVD是低电压检测复位标志。
2. 中断
程序在执行过程中,允许外部或内部事件通过硬件或软件中断当前程序,而转向中断服务程序中去,完成中断服务程序后,CPU继续原来被中断的程序,这样的过程被称为中断过程。能产生中断的事件被称为中断源。软件中断是由程序指令触发的,而由诸如引脚电平的变化或定时器溢出等硬件事件触发的中断为硬件中断。在执行中断服务程序(ISR)前,当前的CPU状态和寄存器被保存,而在执行中断服务程序后,保存的CPU状态将被恢复。这样程序可以从中断前的位置重新开始执行。
当某一中断事件发生时,与该事件相对应的只读标志位将被置位。如果该中断未被使能,则CPU不会响应该中断,除非相应的中断使能位被置1,并且CCR中的I位被清零,才能允许CPU响应中断。
当CPU接收到有效的中断请求时,它会在响应该中断前先完成当前指令,然后按顺序执行以下过程:
● 在堆栈上保存当前CPU寄存器。
● 置CCR中的I位,屏蔽中断。
● 获取当前被挂起的所有待处理中断事件中具有最高优先级的中断的中断向量。
● 预取中断向量地址的前3个字节排列到指令队列中。
当CPU响应中断时,会自动设置I位以避免嵌套的出现。在正常情况下,当中断服务程序执行结束后,CCR从堆栈中弹出,I位恢复为0。
中断服务程序以中断恢复(RTI)指令作为结束。RTI指令使先前保存的CCR、A、X、PC寄存器的值从堆栈中恢复。
表1-1为JM60的中断向量表,向量号越小,优先级越高。
表1-1 JM60的中断向量表
与中断相关的寄存器只有一个,即中断引脚请求状态的控制寄存器(IRQSC)。IRQSC寄存器用于对中断引脚的请求进行配置、报告中断状态及确认中断请求的状态和控制位。具体描述如下:
IRQPDD是IRQ引脚内部上拉控制位。
IRQ引脚激活时(IRQPE=1),该位用来控制内部上拉/下拉器件,从而允许使用外部器件。
IQRPDD=1且IRQPE=1,禁止IRQ内部上拉。
IQRPDD=0且IRQPE=1,允许IRQ内部上拉。
IRQEDG是IRQ边沿选择位。
1=上升沿或上升沿/高电平有效。
0=下降沿或下降沿/低电平有效。
IRQPE是IRQ引脚使能位。
1=IRQ引脚使能。
0=禁止IRQ引脚。
IRQF是IRQ中断标志位。
1=检测到IRQ中断请求。
0=无IRQ中断请求。
IRQACK是中断请求确认位。
该位用来确认中断请求事件,写入1清除IRQF;写入0则没有任何意义或影响,读总是返回0。如果选择了边沿/电平触发(IRQMOD=1),则不能清除IRQF。
IRQIE是IRQ中断使能位。
该位决定IRQ事件是否生成中断请求。当IRQIE=1且IRQF=1时,产生中断请求;当IRQIE=0时,不产生中断请求。
IRQMOD是IRQ触发模式位。
1=边沿/电平触发模式。
0=边沿触发模式。
3. 系统配置
JM60在进行系统初始化时需对一些敏感器件加以配置,配置的寄存器主要有SOPT1、SOPT2、SPMSC1、SPMSC2等。其中SOPT1和SOPT2是write-once寄存器,因此只重视复位后的第一次写入,任何后续的写入尝试都无效,以避免对这些敏感器件的意外修改。它可以在任何时候读取。这两个寄存器应在用户复位初始化程序期间被写入,以设置期望的控制。SPMSC1和SPMSC2包含低电压检测功能的状态和控制位。这两个寄存器应在用户复位初始化程序期间被写入,以设置期望的控制。
(1)系统选项寄存器1(SOPT1)
SOPT1的直观描述如下:
COPT[1:0]是COP计数器溢出周期选择位。
COPT[1:0]和SOPT2寄存器的COPCLKS位一起决定COP计数器的溢出周期,具体组合如表1-2所示。
表1-2 COPT[1:0]和COPCLKS的组合表
(2)系统选项寄存器2(SOPT2)
SOPT2的直观描述如下:
COPCLKS是COP时钟选择位。
1=COP时钟为总线时钟。
0=COP时钟为1kHz。
COPW是COP窗口位。
1=COP视窗工作模式。
0=COP正常工作。
SPI1FE是SPI1端口引脚输入滤波使能位。
1=使能SPI1端口引脚输入滤波,以消除噪声。
0=禁止SPI1端口引脚输入滤波,以使能更高的SPI波特率。
SPI2FE是SPI2端口引脚输入滤波使能位。
1=使能SPI2端口引脚输入滤波,以消除噪声,从而限制SPI的最高波特率。
0=禁止SPI2端口引脚输入滤波,以使能更高的SPI波特率。
ACIC是模拟比较器输入捕捉使能位。
1=ACMP输出接TPM输入通道0。
0=ACMP输出不接TPM输入通道0。
(3)系统电源管理状态和控制寄存器1(SPMSC1)
SPMC1的直观描述如下:
LVWF是低电压报警位。
1=低电压报警出现。
0=没有出现低电压报警。
LVWACK是低电压报警应答位。
如果LVWF=1,则出现低电压报警。为应答低电压报警,需置LVWACK位,如果此时低电压报警消失,则将自动清除LVWF位。
LVWIE是低电压报警中断使能位。
1=当LVWF=1时产生硬件中断。
0=禁止硬件中断。
LVDRE是低电压检测复位使能。
1=当检测到低电压事件时,强制MCU复位。
0=LVD事件不产生硬件复位。
LVDSE是低电压检测停止使能位。
1=在停止模式下使能低电压检测。
0=在停止模式下禁止低电压检测。
LVDE是低电压检测使能位。
1=使能LVD功能。
0=禁止LVD功能。
BGBE是带通缓冲区使能位。
1=使能带通缓冲功能。
0=禁止带通缓冲功能。
(4)系统电源管理状态和控制寄存器2(SPMSC2)
SPMSC2的直观描述如下:
LVDV是低电压检测电压选择位。
该位选择LVD动作点设置。LVDV和LVWV一起决定了LVD和LVDW动作点电压,具体组合见表1-3。
表1-3 LVDV和LVWV组合表
LVWV是低电压报警电压选择位。
该位选择低电压报警动作点电压。
PPDF是部分掉电标志位。
1=MCU已经从stop2模式中恢复。
0=MCU未从stop2模式中恢复。
PPDC是部分掉电控制位。
1=stop2模式,部分掉电使能。
0=使能stop3模式。
1.2.4 多功能时钟发生器(MCG)模块
JM60的时钟源模块不再是HCS08系列其他单片机的内部时钟源(ICS),而是多功能时钟发生器(MCG)模块。MCG模块的主要特性如下:
● 锁频环功能。使用内部32kHz参考时钟,0.2%分辨率;可以使用内部或外部参考时钟控制FLL。
● 锁相环功能。集成压控振荡器(VCO)、模数VCO分频器、相位/频率检测器、环路滤波器,锁定检测器具有中断功能。
● 内部参考时钟。9个调整位,确保精确度。可作为控制器的时钟源。
● 外部参考时钟。外部振荡器控制,具有复位功能的时钟监控器,可作为控制器的时钟源。
● 无论是FLL还是PLL模式,BDC时钟(MCGLCLK)是一个由DCO输出除以2得出的常量。
下面将介绍MCG模块的组成和寄存器。
1. MCG模块的组成
MCG模块为控制器提供了几个时钟源选项。MCG模块包含一个锁频环(FLL)和一个锁相环(PLL),可以由内部或外部参考时钟控制。可以选择FLL或PLL时钟作为MCU系统时钟,也可以选择内部或外部参考时钟作为MCU系统时钟。无论选择哪个时钟源,它都要通过总线分频器,该分频器允许生成更低频率的输出时钟。MCG还控制一个外部振荡器(XOSC),以便把晶体用做外部参考时钟。MCG的结构如图1-3所示。
图1-3 MCG模块结构图
2. MCG模块的寄存器
MCG模块的寄存器主要包括:MCG控制寄存器、MCG修正寄存器和MCG状态和控制寄存器三类。下面介绍寄存器的具体功能。
(1)MCG控制寄存器1(MCGC1)
MCGC1的直观描述如下:
CLKS是时钟源选择位。
00=选择FLL或PLL的输出。01=选择内部参考时钟。
10=选择外部参考时钟。
11=预留。
RDIV是参考分频器。
000=参考时钟。
001=参考时钟/2。
010=参考时钟/4。
011=参考时钟/8。
100=参考时钟/16。
101=参考时钟/32。
110=参考时钟/64。
111=参考时钟/128。
RDIV对由IREFS位选择的参考时钟进行分频。如果选择为FLL输出,FLL的参考频率必须在31.25kHz~39.0625kHz范围内;如果选择为PLL输出, PLL的参考频率必须在1MHz~2MHz范围内。
IREFS是参考时钟源选择位。
1=选择内部参考时钟。
0=选择外部参考时钟。
IRCLKEN是内部参考时钟使能位。
1=MCGIRCLK使能。
0=MCGIRCLK不起作用。
该位使能内部参考时钟,用做MCGIRCLK。
IREFSTEN是内部参考时钟停止使能位。
1=如果MCG在进入停止模式前已设置了IRCLKEN=1或MCG已处于FEI、FBI或BLPI模式,那么内部参考时钟在停止模式中保持使能。
0=内部参考时钟在停止模式中禁用。
(2)MCG控制寄存器2(MCGC2)
MCGC2的直观描述如下:
BDIV是总线分频器。
00=不分频。
01=2分频。
10=4分频。
11=8分频。
BDIV对MCGC1寄存器中CLKS所选的时钟信号进行分频从而控制总线频率。
RANGE是频率范围选择位。
1=为外部1MHz~16MHz振荡器选择高频率范围(外部时钟频率为1MHz~40MHz)。
0=为外部32kHz~100kHz振荡器选择低频率范围(外部时钟频率为32kHz~1MHz)。
HGO是高增益振荡器选择位。
1=配置外部振荡器的高增益模式。
0=配置外部振荡器的低功耗模式。
LP是低功耗选择位。
1=在旁路模式中禁止FLL或PLL。
0=在旁路模式中激活FLL或PLL。
EREFS是外部参考时钟选择位。
1=选择振荡器。
0=选择外部时钟源。
ERCLKEN是外部参考时钟使能位。
1=使能MCGERCLK。
0=禁止MCGERCLK。
EREFSTEN是外部参考时钟停止使能位。
1=如果进入停止模式前已经设置了ERCLKEN,或MCG已处于FEE、FBE、PEE或BLPE模式,那么外部参考时钟在停止模式中保持使能。
0=外部参考时钟在停止模式中禁用。
(3)MCG修正寄存器(MCGTRM)
MCGTRM寄存器通过控制内部参考时钟周期来控制内部参考时钟频率。增大TRIM的值将延长内部参考时钟周期从而减少其频率;反之,减少TRIM值会缩短内部参考时钟周期从而增加其频率。直观描述如下:
(4)MCG状态和控制寄存器(MCGSC)
直观描述如下:
LOLS是锁定状态丢失位。
1=FLL或PLL锁定丢失。
0=FLL或PLL锁定未丢失。
LOCK是锁定状态。
1=FLL或PLL已锁定。
0=FLL或PLL未锁定。
PLLST是PLL状态选择位。
1=PLLS的时钟源为PLL时钟。
0=PLLS的时钟源为FLL时钟。
IREFST是内部参考状态位。
1=参考时钟源是内部参考时钟。
0=参考时钟源是外部参考时钟。
由于内部时钟域间的同步,在向IREFS进行写入后,IREFST不会立即被更新。
CLKST是当前时钟模式。
00:选择FLL输出。
01:选择内部参考时钟。
10:选择外部参考时钟。
11:选择PLL输出。
由于内部时钟域间的同步,在向CLKS进行写入后,CLKST不会立即被更新。
OSCINIT是OSC初始化。
如果ERCLKEN=1,即外部参考时钟使能,或者MCG正处于FEE、FBE、PEE或BLPE模式,并且设置了EREFS=1,那么在完成了外部振荡器时钟的初始化周期后就要置位该位。只有当EREFS被清零或MCG处于FEI、FBI或BLPI模式之一,且ERCLKEN被清零时,这个位才被清零。
FTRIM是MCG微调。
控制内部参考时钟频率最细微的调节。FTRIM=1,会以最小的幅度延长该时段;FTRIM=0,会以最小的幅度缩短该时段。
(5)MCG控制寄存器3(MCGC3)
MCGC3直观描述如下:
LOLIE是锁定丢失中断允许位。
1=允许锁定丢失中断。
0=禁止锁定丢失中断。
PLLS是PLL选择位。
1=选择PLL。
0=选择FLL。
CME是时钟监视器允许位。
1=允许外部时钟丢失中断。
0=禁止时钟监视器。
VDIV是VCO分频因子位。
0000:预留。
0001:4分频。
0010:8分频。
0011:12分频。
0100:16分频。
0101:20分频。
0110:24分频。
0111:28分频。
1000:32分频。
1001:36分频。
1010:40分频。
1011:预留
11xx:预留。
1.2.5 I/O端口
I/O(Input/Output)即基本的输入/输出,有时也称为并行I/O。作为普通输入引脚,程序可以读取该引脚,对应引脚是1(高电平)或0(低电平),即开关量输入。作为普通输出引脚,单片机内部程序向该引脚输出1(高电平)或0(低电平),即开关量输出。MC9S08单片机有多个普通I/O口,如A口和B口,作为普通I/O口,它们的每一个引脚均可通过相应口的“数据方向寄存器”独立地设置为输入或输出。在实际电路中,对于未使用的I/O口引脚,应该将其接VDD或VSS,不要悬空,以减少干扰。
1.2.5.1 A口
A口的6只引脚仅作为普通输入/输出并行口使用,不具有其他功能。
A口作为普通I/O口时,具有5个寄存器:A口数据寄存器(PTAD)、A口数据方向寄存器(PTADD)、A口上拉电阻允许寄存器(PTAPE)、A口输出转换率控制寄存器(PTASE)和A口输出驱动能力选择寄存器(PTADS)。
1. A口数据寄存器(PTAD)
A口数据寄存器的地址是$0000,其D5~D0位分别记为PTAD5~PTAD0。若A口的某一引脚PTADx被定义成输出,程序使A口数据寄存器PTAD的相应位PTADx=0,则引脚PTADx输出低电平;程序使PTADx=1,则引脚PTADx输出高电平。若A口的某一引脚PTADx被定义成输入,程序通过读取A口数据寄存器PTAD以获得输入情况:0表示输入为低电平;1表示输入为高电平。
A口数据寄存器的位定义如下:
其中D5~D0(PTAD5~PTAD0)为A口数据位。
这些读/写位可软件编程。每一个引脚的方向由相应的数据方向寄存器控制(PTAD2只能作为输入)。复位对数据寄存器没有影响。
2. A口数据方向寄存器(PTADD,Data Direction Register A)
A口数据方向寄存器的地址是$0001,其D5~D0位分别记为PTADD5~PTADD0。这些位分别控制着A口引脚PTAD5~PTAD0是输入还是输出。复位时PTADD为$00。
A口数据方向寄存器位定义如下:
若PTADDx=0,则引脚PTAx为输入;若PTADDx=1,则引脚PTAx为输出。
3. A口上拉电阻允许寄存器(PTAPE,Port A Input Pullup Enable Register)
A口上拉电阻允许寄存器的地址是$1840,其D5~D0位分别记为PTAPE5~PTAPE0。
A口上拉电阻允许寄存器的位定义如下:
D5~D0(PTAPE5~PTAPE0)为A口输入上拉允许位。
PTAPEx=1,代表PTA相应位设置为0并且没有设置其他复用功能时,相应A口引脚有内部上拉电阻。
提示
在引脚被定义成输入时,可通过上拉电阻允许寄存器定义有无内部上拉电阻:0表示没有内部上拉电阻;1表示有内部上拉电阻。
4. A口输出转换率控制寄存器(PTASE)
A口输出转换率控制寄存器的地址是$1841,其D5~D0位分别记为PTASE5~PTASE0。
A口输出转换率控制寄存器的位定义如下:
D5~D0(PTASE5~PTASE0)为A口输出转换率允许位。
PTASEx=1,代表PTA相应位设置为0并且没有设置其他复用功能时,相应A口引脚输出转换率允许。
5. A口输出驱动能力选择寄存器(PTADS)
A口输出驱动能力选择寄存器的地址是$1842,其D5~D0位分别记为PTADS5~PTADS0。
A口输出驱动能力选择寄存器的位定义如下:
D5~D0(PTADS5~PTADS0)为A口输出驱动能力选择位。
PTADSx=1,代表PTA相应位设置为0并且没有设置其他复用功能时,相应A口引脚的高输出驱动能力。
1.2.5.2 B口
B口是8位输入、输出并行口,与键盘中断(KBI)、ADC输入通道等复用。
B口作为普通I/O口时,具有5个寄存器:B口数据寄存器(PTBD)、B口数据方向寄存器(PTBDD)、B口上拉电阻允许寄存器(PTBPE)、B口输出转换率控制寄存器(PTBSE)和B口输出驱动能力选择寄存器(PTBDS)。
1. B口数据寄存器(PTBD)
B口数据寄存器的地址是$0002,其D7~D0位分别记为PTBD7~PTAD0。若B口的某一引脚PTBDx被定义成输出,程序使B口数据寄存器PTBD的相应位PTBDx=0,则引脚PTBDx输出低电平;程序使PTBDx=1,则引脚PTBDx输出高电平。若B口的某一引脚PTBDx被定义成输入,程序通过读取B口数据寄存器PTBD,以获得输入情况:0表示输入为低电平;1表示输入为高电平。
B口数据寄存器的位定义如下:
D7~D0(PTBD7~PTBD0)为B口数据位。
这些读/写位可软件编程。每一个引脚的方向由相应的数据方向寄存器控制。
复位对数据寄存器没有影响。
2. B口数据方向寄存器(PTBDD,Data Direction Register B)
B口数据方向寄存器的地址是$0003,其D7~D0位分别记为PTBDD7~PTBDD0。这些位分别控制着B口引脚PTBD7~PTBD0是输入还是输出。复位时PTBDD为$00。
B口数据方向寄存器位定义如下:
若PTBDDx=0,则引脚PTBx为输入;若PTBDDx=1,则引脚PTBx为输出。
3. B口上拉电阻允许寄存器(PTBPE,Port B Input Pullup Enable Register)
B口上拉电阻允许寄存器的地址是$1844,其D7~D0位分别记为PTBPE7~PTBPE0。
B口上拉电阻允许寄存器的位定义如下:
D5~D0(PTBPE7~PTBPE0)为B口输入上拉允许位。
PTBPEx=1,代表PTB相应位设置为0并且没有设置其他复用功能时,相应B口引脚有内部上拉电阻。
提示
在引脚被定义成输入时,可通过上拉电阻允许寄存器定义有无内部上拉电阻:0表示没有内部上拉电阻;1表示有内部上拉电阻。
4. B口输出转换率控制寄存器(PTBSE)
B口输出转换率控制寄存器的地址是$1845,其D7~D0位分别记为PTBSE7~PTBSE0。
B口输出转换率控制寄存器的位定义如下:
D7~D0(PTBSE7~PTBSE0)为B口输出转换率允许位。
PTBSEx=1,代表PTB相应位设置为0并且没有设置其他复用功能时,相应B口引脚输出转换率允许。
5. B口输出驱动能力选择寄存器(PTBDS)
B口输出驱动能力选择寄存器的地址是$1846,其D7~D0位分别记为PTBDS7~PTBDS0。
B口输出驱动能力选择寄存器的位定义如下:
D7~D0(PTBDS5~PTBDS0)为B口输出驱动能力选择位。
PTBDSx=1,代表PTB相应位设置为0并且没有设置其他复用功能时,相应B口引脚的高输出驱动能力。
1.2.5.3 C口
C口是7位输入、输出并行口,与串行通信接口(SCI2)、IIC等复用。
C口作为普通I/O口时,具有5个寄存器:C口数据寄存器(PTCD)、C口数据方向寄存器(PTCDD)、C口上拉电阻允许寄存器(PTCPE)、C口输出转换率控制寄存器(PTCSE)和C口输出驱动能力选择寄存器(PTCDS)。
1. C口数据寄存器(PTCD)
C口数据寄存器的地址是$0004,其D6~D0位分别记为PTCD6~PTCD0。若C口的某一引脚PTCDx被定义成输出,程序使C口数据寄存器PTCD的相应位PTCDx=0,则引脚PTCDx输出低电平;程序使PTCDx=1,则引脚PTCDx输出高电平。若C口的某一引脚PTCDx被定义成输入,程序通过读取C口数据寄存器PTCD以获得输入情况:0表示输入为低电平;1表示输入为高电平。
C口数据寄存器的位定义如下:
D6~D0(PTCD6~PTCD0)为C口数据位。
这些读/写位可软件编程。每一个引脚的方向由相应的数据方向寄存器控制。复位对数据寄存器没有影响。
2. C口数据方向寄存器(PTCDD,Data Direction Register C)
C口数据方向寄存器的地址是$0005,其D6~D0位分别记为PTCDD6~PTCDD0。这些位分别控制着C口引脚PTCD6~PTCD0是输入还是输出。复位时PTCDD为$00。
C口数据方向寄存器位定义如下:
若PTCDDx=0,则引脚PTCx为输入;若PTCDDx=1,则引脚PTCx为输出。
3. C口上拉电阻允许寄存器(PTCPE,Port C Input Pullup Enable Register)
C口上拉电阻允许寄存器的地址是$1848,其D6~D0位分别记为PTCPE6~PTCPE0。
C口上拉电阻允许寄存器的位定义如下:
D6~D0(PTCPE6~PTCPE0)为C口输入上拉允许位。
PTCPEx=1,代表PTC相应位设置为0并且没有设置其他复用功能时,相应C口引脚有内部上拉电阻。
提示
在引脚被定义成输入时,可通过上拉电阻允许寄存器定义有无内部上拉电阻:0表示没有内部上拉电阻;1表示有内部上拉电阻。
4. C口输出转换率控制寄存器(PTCSE)
C口输出转换率控制寄存器的地址是$1849,其D6~D0位分别记为PTCSE6~PTCSE0。
C口输出转换率控制寄存器的位定义如下:
D6~D0(PTCSE6~PTCSE0)为C口输出转换率允许位。
PTCSEx=1,代表PTC相应位设置为0并且没有设置其他复用功能时,相应C口引脚输出转换率允许。
5. C口输出驱动能力选择寄存器(PTCDS)
C口输出驱动能力选择寄存器的地址是$184A,其D6~D0位分别记为PTCDS6~PTCDS0。
C口输出驱动能力选择寄存器的位定义如下:
D6~D0(PTCDS6~PTCDS0)为C口输出驱动能力选择位。
PTCDSx=1,代表PTC相应位设置为0并且没有设置其他复用功能时,相应C口引脚的高输出驱动能力。
1.2.5.4 D口
D口是8位输入、输出并行口,与键盘中断(KBI)、模拟比较器、ADC输入通道等复用。
D口作为普通I/O口时,具有5个寄存器:D口数据寄存器(PTDD)、D口数据方向寄存器(PTDDD)、D口上拉电阻允许寄存器(PTDPE)、D口输出转换率控制寄存器(PTDSE)和D口输出驱动能力选择寄存器(PTDDS)。
1. D口数据寄存器(PTDD)
D口数据寄存器的地址是$0006,其D7~D0位分别记为PTDD7~PTDD0。若D口的某一引脚PTDDx被定义成输出,程序使D口数据寄存器PTDD的相应位PTDDx=0,则引脚PTDDx输出低电平;程序使PTDDx=1,则引脚PTDDx输出高电平。若D口的某一引脚PTDDx被定义成输入,程序通过读取D口数据寄存器PTDD以获得输入情况:0表示输入为低电平;1表示输入为高电平。
D口数据寄存器的位定义如下:
D7~D0(PTDD7~PTDD0)为D口数据位。
这些读/写位可软件编程。每一个引脚的方向由相应的数据方向寄存器控制。复位对数据寄存器没有影响。
2. D口数据方向寄存器(PTDDD,Data Direction Register D)
D口数据方向寄存器的地址是$0007,其D7~D0位分别记为PTDDD7~PTDDD0。这些位分别控制着D口引脚PTD7~PTD0是输入还是输出。复位时PTDDD为$00。
D口数据方向寄存器位定义如下:
若PTDDDx=0,则引脚PTDx为输入;若PTDDDx=1,则引脚PTDx为输出。
3. D口上拉电阻允许寄存器(PTDPE,Port D Input Pullup Enable Register)
D口上拉电阻允许寄存器的地址是$184C,其D7~D0位分别记为PTDPE7~PTDPE0。
D口上拉电阻允许寄存器的位定义如下:
D7~D0(PTDPE7~PTDPE0)为D口输入上拉允许位。
PTDPEx=1,代表PTD相应位设置为0并且没有设置其他复用功能时,相应D口引脚有内部上拉电阻。
提示:
在引脚被定义成输入时,可通过上拉电阻允许寄存器定义有无内部上拉电阻:0表示没有内部上拉电阻;1表示有内部上拉电阻。
4. D口输出转换率控制寄存器(PTDSE)
D口输出转换率控制寄存器的地址是$184D,其D7~D0位分别记为PTDSE7~PTDSE0。
D口输出转换率控制寄存器的位定义如下:
D7~D0(PTDSE7~PTDSE0)为D口输出转换率允许位。
PTDSEx=1,代表PTD相应位设置为0并且没有设置其他复用功能时,相应D口引脚输出转换率允许。
5. D口输出驱动能力选择寄存器(PTDDS)
D口输出驱动能力选择寄存器的地址是$184E,其D7~D0位分别记为PTDDS7~PTDDS0。
D口输出驱动能力选择寄存器的位定义如下:
D7~D0(PTDDS7~PTDDS0)为D口输出驱动能力选择位。
PTDDSx=1,代表PTD相应位设置为0并且没有设置其他复用功能时,相应D口引脚的高输出驱动能力。
1.2.5.5 E口
E口是8位输入、输出并行口,与定时器/脉宽调制器(PWM)、串行通信接口(SCI1)、串行外设接口(SPI1)等复用。
E口作为普通I/O口时,具有5个寄存器:E口数据寄存器(PTED)、E口数据方向寄存器(PTEDD)、E口上拉电阻允许寄存器(PTEPE)、E口输出转换率控制寄存器(PTESE)和E口输出驱动能力选择寄存器(PTEDS)。
1. E口数据寄存器(PTED)
E口数据寄存器的地址是$0008,其D7~D0位分别记为PTED7~PTED0。若E口的某一引脚PTEDx被定义成输出,程序使E口数据寄存器PTED的相应位PTEDx=0,则引脚PTEDx输出低电平;程序使PTEDx=1,则引脚PTEDx输出高电平。若E口的某一引脚PTEDx被定义成输入,程序通过读取E口数据寄存器PTED以获得输入情况:0表示输入为低电平;1表示输入为高电平。
E口数据寄存器的位定义如下:
D7~D0(PTED7~PTED0)为E口数据位。
这些读/写位可软件编程。每一个引脚的方向由相应的数据方向寄存器控制。复位对数据寄存器没有影响。
2. E口数据方向寄存器(PTEDD,Data Direction Register E)
E口数据方向寄存器的地址是$0009,其D7~D0位分别记为PTEDD7~PTEDD0。这些位分别控制着E口引脚PTED7~PTED0是输入还是输出。复位时PTEDD为$00。
E口数据方向寄存器位定义如下:
若PTEDDx=0,则引脚PTEx为输入;若PTEDDx=1,则引脚PTEx为输出。
3. E口上拉电阻允许寄存器(PTEPE,Port E Input Pullup Enable Register)
E口上拉电阻允许寄存器的地址是$1850,其D7~D0位分别记为PTEPE7~PTEPE0。
E口上拉电阻允许寄存器的位定义如下:
D7~D0(PTEPE7~PTEPE0)为E口输入上拉允许位。
PTEPEx=1,代表PTE相应位设置为0并且没有设置其他复用功能时,相应E口引脚有内部上拉电阻。
提示:
在引脚被定义成输入时,可通过上拉电阻允许寄存器定义有无内部上拉电阻:0表示没有内部上拉电阻;1表示有内部上拉电阻。
4. E口输出转换率控制寄存器(PTESE)
E口输出转换率控制寄存器的地址是$1851,其D7~D0位分别记为PTESE7~PTESE0。
E口输出转换率控制寄存器的位定义如下:
D7~D0(PTESE7~PTESE0)为E口输出转换率允许位。
PTESEx=1,代表PTE相应位设置为0并且没有设置其他复用功能时,相应E口引脚输出转换率允许。
5. E口输出驱动能力选择寄存器(PTEDS)
E口输出驱动能力选择寄存器的地址是$1852,其D7~D0位分别记为PTEDS7~PTEDS0。
E口输出驱动能力选择寄存器的位定义如下:
D7~D0(PTEDS7~PTEDS0)为E口输出驱动能力选择位。
PTEDSx=1,代表PTE相应位设置为0并且没有设置其他复用功能时,相应E口引脚的高输出驱动能力。
1.2.5.6 F口
F口是8位输入、输出并行口,与定时器/脉宽调制器(PWM)通道等复用。
F口作为普通I/O口时,具有5个寄存器:F口数据寄存器(PTFD)、F口数据方向寄存器(PTFDD)、F口上拉电阻允许寄存器(PTFPE)、F口输出转换率控制寄存器(PTFSE)和F口输出驱动能力选择寄存器(PTFDS)。
1. F口数据寄存器(PTFD)
F口数据寄存器的地址是$000A,其D7~D0位分别记为PTFD7~PTFD0。若F口的某一引脚PTFDx被定义成输出,程序使F口数据寄存器PTFD的相应位PTFDx=0,则引脚PTFDx输出低电平;程序使PTFDx=1,则引脚PTFDx输出高电平。若F口的某一引脚PTFDx被定义成输入,程序通过读取F口数据寄存器PTFD以获得输入情况,0表示输入为低电平;1表示输入为高电平。
F口数据寄存器的位定义如下:
D7~D0(PTFD7~PTFD0)为F口数据位。
这些读/写位可软件编程。每一个引脚的方向由相应的数据方向寄存器控制。复位对数据寄存器没有影响。
2. F口数据方向寄存器(PTFDD,Data Direction Register F)
F口数据方向寄存器的地址是$000B,其D7~D0位分别记为PTFDD7~PTFDD0。这些位分别控制着F口引脚PTF7~PTF0是输入还是输出。复位时PTFDD为$00。
F口数据方向寄存器位定义如下:
若PTFDDx=0,则引脚PTFx为输入;若PTFDDx=1,则引脚PTFx为输出。
3. F口上拉电阻允许寄存器(PTFPE,Port F Input Pullup Enable Register)
F口上拉电阻允许寄存器的地址是$1854,其D7~D0位分别记为PTFPE7~PTFPE0。
F口上拉电阻允许寄存器的位定义如下:
D7~D0(PTFPE7~PTFPE0)为F口输入上拉允许位。
PTFPEx=1,代表PTF相应位设置为0并且没有设置其他复用功能时,相应F口引脚有内部上拉电阻。
提示:
在引脚被定义成输入时,可通过上拉电阻允许寄存器定义有无内部上拉电阻:0表示没有内部上拉电阻;1表示有内部上拉电阻。
4. F口输出转换率控制寄存器(PTFSE)
F口输出转换率控制寄存器的地址是$1855,其D7~D0位分别记为PTFSE7~PTFSE0。
F口输出转换率控制寄存器的位定义如下:
D7~D0(PTFSE7~PTFSE0)为F口输出转换率允许位。
PTFSEx=1,代表PTF相应位设置为0并且没有设置其他复用功能时,相应F口引脚输出转换率允许。
5. F口输出驱动能力选择寄存器(PTFDS)
F口输出驱动能力选择寄存器的地址是$1856,其D7~D0位分别记为PTFDS7~PTFDS0。
F口输出驱动能力选择寄存器的位定义如下:
D7~D0(PTFDS5~PTFDS0)为F口输出驱动能力选择位。
PTFDSx=1,代表PTF相应位设置为0并且没有设置其他复用功能时,相应F口引脚的高输出驱动能力。
1.2.5.7 G口
G口是6位输入、输出并行口,与键盘中断(KBI)、晶振引脚等复用。
G口作为普通I/O口时,具有5个寄存器:G口数据寄存器(PTGD)、G口数据方向寄存器(PTGDD)、G口上拉电阻允许寄存器(PTGPE)、G口输出转换率控制寄存器(PTGSE)和G口输出驱动能力选择寄存器(PTGDS)。
1. G口数据寄存器(PTGD)
G口数据寄存器的地址是$000C,其D5~D0位分别记为PTGD5~PTGD0。若G口的某一引脚PTGDx被定义成输出,程序使G口数据寄存器PTGD的相应位PTGDx=0,则引脚PTGDx输出低电平;程序使PTGDx=1,则引脚PTGDx输出高电平。若G口的某一引脚PTGDx被定义成输入,程序通过读取G口数据寄存器PTGD以获得输入情况,0表示输入为低电平;1表示输入为高电平。
G口数据寄存器的位定义如下:
D5~D0(PTGD5~PTGD0)为G口数据位。
这些读/写位可软件编程。每一个引脚的方向由相应的数据方向寄存器控制。复位对数据寄存器没有影响。
2. G口数据方向寄存器(PTGDD,Data Direction Register G)
G口数据方向寄存器的地址是$000D,其D5~D0位分别记为PTGDD5~PTGDD0。这些位分别控制着G口引脚PTGD5~PTGD0是输入还是输出。复位时PTGDD为$00。
G口数据方向寄存器位定义如下:
若PTGDDx=0,则引脚PTGx为输入;若PTGDDx=1,则引脚PTGx为输出。
3. G口上拉电阻允许寄存器(PTGPE,Port G Input Pullup Enable Register)
G口上拉电阻允许寄存器的地址是$1858,其D5~D0位分别记为PTGPE5~PTGPE0。
G口上拉电阻允许寄存器的位定义如下:
D5~D0(PTGPE5~PTGPE0)为G口输入上拉允许位。
PTGPEx=1,代表PTG相应位设置为0并且没有设置其他复用功能时,相应G口引脚有内部上拉电阻。
提示:
在引脚被定义成输入时,可通过上拉电阻允许寄存器定义有无内部上拉电阻:0表示没有内部上拉电阻;1表示有内部上拉电阻。
4. G口输出转换率控制寄存器(PTGSE)
G口输出转换率控制寄存器的地址是$1859,其D5~D0位分别记为PTGSE5~PTGSE0。
G口输出转换率控制寄存器的位定义如下:
D5~D0(PTGSE7~PTGSE0)为G口输出转换率允许位。
PTGSEx=1,代表PTG相应位设置为0并且没有设置其他复用功能时,相应G口引脚输出转换率允许。
5. G口输出驱动能力选择寄存器(PTGDS)
G口输出驱动能力选择寄存器的地址是$185A,其D5~D0位分别记为PTGDS7~PTGDS0。
G口输出驱动能力选择寄存器的位定义如下:
D5~D0(PTGDS5~PTGDS0)为G口输出驱动能力选择位。
PTGDSx=1,代表PTG相应位设置为0并且没有设置其他复用功能时,相应G口引脚的高输出驱动能力。
1.2.6 KBI模块
MC9S08JM60单片机B口的PTB4和PTB5,D口的PTD2、PTD3,G口的PTG0~PTG3,共8只引脚与键盘中断模块KBI(Keybord Interrupt Module)的引脚复用。
键盘中断模块的主要特性如下:
● 具有8个独立的可屏蔽的外部键盘中断,每个键盘中断有键盘中断允许位。
● 具有1个自动唤醒逻辑控制的内部中断,有独立键盘中断允许位,共享键盘中断屏蔽位。
● 可以选择下降沿触发或者下降沿和低电平触发。
● 作为键盘中断引脚输入时内部电阻上拉。
● 可从低功耗模式中唤醒。
1. 键盘状态和控制寄存器KBISC
KBISC包含了键盘中断请求标志、屏蔽键盘中断请求、定义键盘中断的触发方式和消除键盘中断标志等功能。位定义如下:
KBF(只读位)为键盘中断标志位(Keybord Interrupt Flag Bit)。
KBF=1,键盘中断已产生;
KBF=0,键盘中断未产生。
KBACK(只写位)为键盘中断请求确认位(Keybord Interrupt Acknowledge Bit)。
向此位写入1,则清除键盘中断请求和自动唤醒逻辑,ACKK读取值总为0。
KBIE为键盘中断屏蔽位(Keybord Interrupt Mask Bit)。
KBIE=0,屏蔽键盘中断请求;KBIE=1,开放键盘中断。
KBMOD为键盘中断触发方式选择位。
KBMOD=1,边沿及电平触发;KBMOD=0,边沿触发。
2. 键盘中断允许寄存器KBIPE
KBIPE的各位决定所对应的引脚是否允许中断进入。位定义如下:
KBIPEn为键盘中断允许位。
若KBIPEx=1,表示相应引脚KBIEPx(也就是引脚PTAx)被定义为中断引入引脚。复位时,全为0。
3. 键盘边沿选择寄存器KBIES
KBIES的各位决定所对应的引脚的边沿/电平触发方式。位定义如下:
KBEDGn为键盘中断边沿/电平选择位。若KBEDGx=1,表示相应引脚被定义为下降沿/高电平中断输入;若KBEDGx=0,表示相应引脚被定义为上升沿/低电平中断输入;复位时,全为0。
1.2.7 定时器/PWM模块
定时器在单片机系统中是非常重要的部分,它在事件控制与管理方面有着重要的应用。MC9S08JM60内部包括两个独立的定时器。
MC9S08JM60定时器的功能结构如图1-4所示。每个定时器具有两路独立的输入捕捉和输出比较通道;可以实现带缓冲和不带缓冲的脉宽调制波;可以得到8种可编程选择的分频因子;可以自由运行计数或预置计数;可以停止或清除计数器计数;定时器溢出可以引发中断,每路通道的输入捕捉和输出比较也可以引发中断。
图1-4 定时器功能结构图
每一路定时器都由以下寄存器控制。
1. 定时器状态和控制寄存器TPMxSC
TPMxSC包含了定时器中断标志、中断请求、时钟源选择和分频因子等功能。位定义如下:
TOF为定时器溢出标志位。该位用来标志定时器的溢出。当定时器的计数达到$FFFF (自由计数运行状态)或预置计数器的值时,定时器的计数将清零,同时该位置为1。读取定时器状态和控制寄存器并向该位写入0,可以清除该标志位。该位虽然是可读/写的,但由于该位只是状态位,向该位写入1的操作仅仅完成清除该标志位的作用,没有任何实际意义。另外需要注意,如果清除该标志位前又发生了定时器溢出,那么这一次清零将无法完成。程序必须保证每一次溢出发生后,都要在下一次溢出发生之前清除该标志位。在使用溢出中断的情况下,要求在中断返回之前必须清除溢出标志位,并且该中断的处理时间在最不利的情形下也不能超过一次计数溢出时间。程序在向该位写入1进行清除后,可以再次读取该位,判断是否已经正确清零,这样就能够发现连续的定时器溢出的情况。这种情况往往是因为程序没能及时地处理定时器溢出事件。
TOIE为定时器溢出中断允许位。该位用来标志是否允许定时器溢出中断。该位为1,表示允许溢出中断,当发生溢出时,系统会执行溢出中断处理程序;该位为0,表示不允许溢出中断。该位是可读/写的,读取的数值就是其实际值。
CPWMS为PWM中心对齐控制位。该位控制PWM操作模式。该位为1,则所有的定时器通道都工作在中心对齐的脉宽调制模式下;该位为0,则每个定时器通道分别由各自的控制寄存器控制作为输入捕捉、输出比较或者边界对齐的脉宽调制。
CLKSB∶CLKSA为时钟源选择控制位。表1-4列举了CLKSB∶CLKSA的值与时钟源选择的关系。
表1-4 定时器时钟源选择
PS2∶PS1∶PS0为定时器分频因子选择控制位。
这3位共同设定定时器的分频因子。3位的不同组合有8种可能。表1-5列举了PS2∶PS1∶PS0的值与分频因子的关系。
表1-5 选择分频因子
定时器的状态和控制寄存器的各位都有不同的作用,在设定时可以只对需要更改的某一位进行读/写,也可以对整个寄存器进行读/写。
2. 定时器16位计数寄存器TPMxCNTH∶TPMxCNTL
TPMxCNTH为16位定时器计数寄存器的高8位。位定义如下:
TPMxCNTL为16位定时器计数寄存器的低8位。位定义如下:
用8位总线访问16位计数器时必须进行两次操作,在两次操作之间计数器仍然在继续计数。如果直接读取,则高低字节不是同一个时刻的计数值。S08使用缓冲机制解决这一问题。当读取16位计数器的高字节时,其低字节同时被自动锁存到缓冲区中;后面对低字节的读取实际是读取这个缓冲区。而在读取低字节之前,这个缓冲区的内容将保持不变,即使后面又多次读取高字节,该缓冲区仍将保持其原有内容。因此,一个完整的读计数器操作只要读取了高字节就应该读取低字节。高字节也有对应的缓冲区机制。如果先读取计数器的低字节,也一定要读取其高字节。对16位计数器进行写入操作时,实际的写入数都被存放在缓冲区中,只有这个16位计数器进行写入操作后,该缓冲区的数值才会被实际写入计数器中。
16位的自由运行计数器在单片机复位结束后从$0000开始连续计数。当达到最大值$FFFF时,翻转到$0000,同时将状态寄存器的溢出位TOF置1,然后重新开始计数。在单片机正常工作时,这个计数器会自动计数,但程序也可以停止或者清除其计数。计数器的计数频率是由系统的内部总线频率和计数分频因子来决定的。使用分频因子可以降低计数器的计数时钟频率,扩大16位定时器的计数时间间隔。例如总线频率为2MHz,分频因子为32,那么计数器每16μs计数一次。如果定时器是自由运行溢出,那么每隔1.048 s将产生一次定时器溢出。如果允许定时器溢出中断,将会得到一次定时器的溢出中断服务。
3. 定时器16位预置计数器寄存器TPMxMODH∶TPMxMODL
TPMxMODH∶TPMxMODL为定时器16位预置计数器寄存器的高8位。位定义如下:
TPMxMODL为定时器16位预置计数器寄存器的低8位。位定义如下:
预置计数器寄存器是一个16位寄存器,程序向这个寄存器写入一个确定的数值,则计数器每进行一次计数都会将计数与这个寄存器的值进行比较。如果相同,就产生溢出,计数器翻转到0并重新开始计数。也就是说,此时自由运行计数器并没有计数到$FFFF才产生溢出并重新计数。预置计数器寄存器可以随时进行更改,以得到不同时间间隔的定时器溢出间隔。这里以4 MHz晶振且不使用锁频环(2MHz总线)时钟为例,分频因子为32。如果预置计数器寄存器设置为$F424(62 500),就可以得到1s间隔的定时器溢出,这对于时间计算就非常方便了。
4. 定时器通道状态和控制寄存器TPMxCnSC
TPMxCnSC包含了定时器通道中断标志、中断请求、时钟源选择和分频因子等功能。位定义如下:
CHnE为定时器通道溢出标志位。该位用来标志定时器的溢出。当定时器的计数达到$FFFF(自由计数运行状态)或预置计数器的值时,定时器的计数将清零,同时该位置为1。读取定时器状态和控制寄存器并向该位写入0,可以清除该标志位。该位虽然是可读/写的,但由于该位只是状态位,向该位写入1的操作仅仅完成清除该标志位的作用,没有任何实际意义。另外需要注意,如果清除该标志位前又发生了定时器溢出,那么这一次清零将无法完成。程序必须保证每一次溢出发生后,都要在下一次溢出发生之前清除该标志位。在使用溢出中断的情况下,要求在中断返回之前必须清除溢出标志位,并且该中断的处理时间在最不利的情形下也不能超过一次计数溢出时间。程序在向该位写入1进行清除后,可以再次读取该位,判断是否已经正确清零,这样就能够发现连续的定时器溢出的情况。这种情况往往是因为程序没能及时地处理定时器溢出事件。
CHnIE为定时器通道溢出中断允许位。该位用来标志是否允许定时器通道溢出中断。该位为1,表示允许溢出中断,当发生溢出时,系统会执行溢出中断处理程序;该位为0,表示不允许溢出中断。该位是可读/写的,读取的数值就是其实际值。
MSnB:MSnA为通道n的模式选择位,如表1-6所示。
表1-6 模式、边沿/电平选择
注:X表示0或1。
ELSnB:ELSnA为边沿/电平选择位,如表1-6所示。
5. 通道计数器的16位寄存器TPMxCnVH∶TPMxCnVL
该寄存器包含输入捕捉功能所捕捉的TPM计数寄存器值、比较功能或PWM功能的比较输出值。该寄存器可通过复位清零。
在输入捕捉模式下,无论从TPMxCnVH还是TPMxCnVL中读取任何一个字符,都会使两个字节的内容锁入到缓存器中。并且这些内容将会一直被锁定在那里,直到另一个字节被读取。
1.2.8 IIC模块
MC9S08JM60单片机片内集成了一个IIC模块,IIC模块的两个管脚SCL、SDA和PTC0、PTC1管脚复用。用户对IIC模块的所有操作都是通过该模块的寄存器来完成的。IIC模块的寄存器主要有IICA、IICF、IICC1、IICS、IICD、IICC2。下面结合具体寄存器来介绍IIC模块的操作。
1. IIC地址寄存器(IICA)
IICA的位定义如下:
AD[7:1]为从机地址位。AD[7:1]包含IIC模块将要使用的从机地址。
2. IIC分频寄存器(IICF)
IICF的位定义如下:
MULT为IIC倍频因子位。
00 mul=01
01 mul =02
10 mul=04
11 保留
MULT定义了倍频因子mul的值,mul和SCL的分频因子一起决定IIC模块的波特率。
ICR[5:0]为IIC模块的时钟频率位。
ICR{5:0}位用于预分频总线时钟,以便进行比特率选择。这些位和MULT位一起决定IIC模块的波特率、SDA保持时间、SCL开始保持时间和SCL停止保持时间。
IIC模块波特率计算公式如下:
IIC波特率=系统总线频率/(MUL×SCL分频因子)
SDA保持时间(SCL信号的下降沿到SDA信号改变之间的延时)计算公式如下:
SDA保持时间=系统总线周期 × MUL×SDA保持值
SCL开始保持时间(当SCL处于高电平时,SDA信号从高到低的跳变时间)的计算公式如下:
SCL开始保持时间=系统总线周期× MUL×SCL Start保持值SCL停止保持时间(当SCL处于高电平时,SDA信号从低到高的跳变时间)的计算公式如下:
SCL停止保持时间=系统总线周期× MUL×SCL Stop保持值
3. IIC控制寄存器1 (IICC1)
IICC1的位定义如下:
IICEN为IIC模块使能位。
1=允许IIC模块。
0=禁止IIC模块。
IICIE为IIC中断允许位。
1=允许IIC中断请求。
0=禁止IIC中断请求。
MST为主机模式选择位。
1=主机模式。
0=从机模式。
该位从0到1的改变将产生一个起始信号,此时主机模式被选择。该位从1到0的改变将产生一个停止信号,此时模块将从主机模式切换为从机模式。
TX为传输模式选择位。
1=发送。
0=接收。
该位控制主、从传输的方向。在主模式下,该位需按照传输类型来设置。
TXAK为传输应答使能位。
1=未发送应答响应信号。
0=接收一个字节后向总线发送一个应答响应信号。
RSTA为重启动位。
在主模式下,该位置为1将产生一个重启动条件。
4. IIC状态寄存器(IICS)
IICS的位定义如下:
TCF为传输完成标志位。
1=传输完成。
0=传输正在进行。
IAAS为匹配从机标志位。
1=已寻址从机。
0=未寻址。
BUSY为总线忙标志位。
1=总线忙。
0=总线空闲。
ARBL为仲裁丢失标志位。
1=仲裁丢失。
0=标准总线操作。
该位表示主/从模式下的总线状态。
SRW为从机读/写选择位。
1=从机发送,主机读取从机数据。
0=从机接收,主机往从机写数据。
IICIF为IIC中断标志位。
1=中断被挂起。
0=没有中断挂起。
RXAK为接收应答确认位。
1=没有接收到应答。
0=接收到应答。
5. IIC数据寄存器(IICD)
IICD的位定义如下:
DATA为传输的数据。
在主发送模式下,写IICD寄存器将启动一次数据传输,且最高位先传输;在主机接收模式下,读IICD寄存器将启动下一字节的接收。在从模式下,当地址匹配后,可提供相同的作用。
当IIC被配置为主接收或从接收模式时,读取IICD寄存器将返回接收的最后一个字节。IICD不反映IIC总线上发送的每个字节,软件也不能通过回读的方式确认字节是否已经正确写入IICD。在主发送模式中,置位MST后写入IICD的第一个字节数据用于传输地址,应当包含主叫地址(D7~D1)及所需的R/W位(D0)。
6. IIC控制寄存器2(IICC2)
IICC2寄存器的各控制位如下所示。X表示保留。
GCAEN为通用呼叫地址使能位。
1=通用呼叫地址使能。
0=禁止通用呼叫地址。
ADEXT为地址模式选择位。
1=10位地址模式。
0=7位地址模式。
该位控制着从机地址使用的位数。
AD[10:9]为从机地址位。
AD[10:8]包含10位地址模式中从机地址的高3位。当ADEXT置为1时, AD[10:8]才有效。
1.2.9 FLASH模块
MC9S08JM60单片机的片内FLASH模块有一个集成控制器用来控制编程和擦除操作。该集成控制器有3个寄存器,用来产生编程和擦除的时序,也用来提供编程和擦除的电压。对FLASH的擦除操作都是以页为基础的,而写入操作则是以行或页为基础的。用户对FLASH模块的所有操作都是通过该模块的寄存器来完成的。FLASH模块的寄存器主要有FCDIV、FOPT、FCNFG、FPROT、FSTAT、FCMD。下面结合具体寄存器来介绍FLASH模块的操作。
1. FLASH时钟分频寄存器(FCDIV)
FCDIV是一个8位寄存器,用来控制FLASH时钟的频率。Bit 7是只读位,Bit6~Bit0可以随时读取,但只能写一次。位定义如下:
DIVLD为分频寄存器加载状态位。
1=FCDIV寄存器已经初始化,允许擦除和编程操作。
0=FCDIV寄存器未初始化,禁止擦除和编程操作。
PRDIV8为FLASH时钟预分频位。
1=FLASH时钟输入为总线时钟的8分频。
0=FLASH时钟为总线时钟。
DIV[5:0]为FLASH时钟的分频因子位。
FLASH的时钟由PRDIV8位和DIV[5:0]位共同确定。计算公式为:
如果PRDIV8=0,则FLASH时钟fFCLK=总线时钟/(DIV[5:0]+1)
如果PRDIV8=1,则FLASH时钟fFCLK=总线时钟/(8×(DIV[5:0]+1))
2. FLASH可选寄存器(FOPT)
系统上电过程中,FOPT中的内容被复制到非易失NVOPT地址中。FOPT寄存器值可以随时读取,写入无意义。位定义如下:
KEYEN为后门密钥机制允许位。
1=如果用户固件写入的8位值匹配非易失的后门密钥,在下一次MCU复位前,安全保护暂时失效。
0=禁止后门密钥访问。
FNORED为向量重映射允许位。
1=允许向量重映射;
0=禁止向量重映射。
SEC0[1:0]为安全状态码位。该两位决定了MCU的安全状态,如表1-7所示。
表1-7 MCU安全状态表
3. FLASH配置寄存器(FCNFG)
FCNFG的位定义如下所示:
KEYACC为访问密钥写允许位。
1=NVBACKKEY的写操作被认为是写比较密钥。
0=地址0XFFB0~0XFFB7的写被认为是启动FLASH编程或擦除操作。
4. FLASH保护寄存器(FPROT)
FPROT的位定义如下:
FPS[7:1]为FLASH块保护寄存器位。
FPDIS为FLASHA块保护允许位。
1=禁止FLASH块保护。
0=FPS[7:1]指定FLASH块保护的区域。
5. FLASH状态寄存器(FSTAT)
FSTAT的位定义如下:
FCBEF为FLASH命令缓冲器空标志位。
1=编程命令可以写入命令缓冲器中。
0=命令缓冲器满。
FCCF为FLASHA命令完成标志位。
1=所有命令已完成。
0=命令正在操作中。
当命令缓冲器未空,且没有处理的命令时,该标志位被自动置为1。启动一个新命令时,FCCF标志自动清零。
FPVIOL为保护冲突标志位。
1=擦除或编程保护区域。
0=未发现保护冲突。
FACCERR为访问错误标志位。
1=访问错误发生了。
0=没有访问错误。
FBLANK为FLASH空校验标志位。
1=空校验完成,且FCCF=1,FBLANK=1表示FLASH已经完全擦除了。
0=空校验完成,且FCCF=1,FBLANK=0表示FLASH未完全擦除。
6. FLASH命令寄存器(FCMD)
FCMD位定义为:
FCMD[7:0]为FLASH命令位。
FLASH命令和FLASH命令位的关系如表1-8所示。
表1-8 FLASH命令表
1.2.10 SCI模块
在单片机系统中,串口通信是一个非常重要的部分,通过串口通信实现与PC或其他嵌入式设备进行通信。MC9S08JM60单片机内置两个独立的串行通信接口SCI。SCI模块的特点如下:
● 支持全双工模式,标准的不归零数据格式。
● 双缓冲的发送器和接收器,发送器和接收器使能独立。
● 中断驱动或查询操作。
● 硬件校验生成和检查。
● 可编程的8位或9位数据长度。
● 可选的13位break字符生成或11位break字符检测。
● 可选的发送时输出极性。
下面具体对SCI模块的结构、SCI模块的寄存器和工作模式进行介绍。
1. SCI模块的结构
SCI硬件模块包括两个部分:发送器部分和接收器部分。发送器和接收器部分的硬件结构如图1-5和图1-6所示。
图1-5 发送器部分的硬件结构图
图1-6 接收器的硬件结构图
其中,SCI的发送器主要包括发送控制模块、发送缓冲器、发送移位寄存器、波特率生成器和校验生成模块等。发送器在发送时产生一些状态信息,并可以设置发送中断标志。发送控制模块可以选择相应的工作模式,同时设置相应的引脚。SCI的接收器主要包括接收缓冲器、接收移位寄存器、奇偶检查模块等。接收器在接收的时候产生一些状态信息,并设置相应的中断标志位。用户对SCI模块的所有操作都是通过操作该模块的寄存器来完成的,下面对SCI模块的寄存器进行具体介绍。
2. SCI模块的寄存器和工作模式
SCI模块有8个8位寄存器:SCIxBDH、SCIxBDL、SCIxC1、SCIxC2、 SCIxC3、 SCIxS1、SCIxS2和SCIxD,其中x的值可能是0或1,因为MC9S08JM60有2个SCI模块。这8个寄存器实现波特率控制、SCI模式选择、SCI工作状态报告和发送/接收数据。下面结合具体寄存器来介绍SCI模块的功能。
(1)波特率寄存器SCIxBDH\SCIxBDL
这两个寄存器控制SCI系统的波特率。波特率由控制器总线时钟分频而来,发送器和接收器具有相同的波特率和数据格式。
其中,SCIxBDH寄存器描述如下:
LBKDIE为LIN中断检测中断控制位。
1=硬件中断使能。
0=硬件中断禁止。
RXEDGIE为RxD输入边沿有效中断控制位。
1=硬件中断使能。
0=硬件中断禁止。
SBR[12:8]为波特率预分频因子的高5位值。
SCIxBDL寄存器描述为:
SBR为波特率预分频因子的低8位值。
SCI波特率计算公式为:系统时钟/(16×SBR[12:0])
(2)SCI控制寄存器1(SCIxC1)
SCIxC1位定义为:
LOOPS为循环模式选择位。
1=循环模式。
0=正常操作。
在循环模式时,RxD引脚与SCI系统断开,发送器的输出直接接入接收器的输入。正常操作时,SCI的发送引脚和接收引脚独立。
SCISWAI为等待模式下SCI停止控制位。
1=等待模式下,SCI时钟停止。
0=等待模式下,SCI时钟继续运行。
RSRC为接收源选择位。
1=SCI在循环模式下,TxD引脚接发送器的输出和接收器的输入。
0=SCI在循环模式下,SCI不使用RxD引脚。
当LOOPS为0时,该位无任何意义。
M为字符长度选择位。
1=接收器和发送器使用9位字符长度。
0=接收器和发送器使用8位字符长度。
WAKE为唤醒条件选择位。
1=地址唤醒。
0=空闲线唤醒。
ILT为空闲线方式选择位。
1=从停止位开始计数。
0=从起始位开始计数。
PE为校验使能位。
1=校验使能。
0=无硬件校验或检查。
PT为校验类型选择位。
1=奇校验。
0=偶校验。
(3)SCI控制寄存器2(SCIxC2)
SCIxC2寄存器是SCI子系统的主控制器寄存器。这个寄存器可以允许和禁止发送器或接收器,允许和禁止系统中断、唤醒功能和发送中止码功能。TIE、TCIE、RIE、ILIE位是局部中断控制,决定SCI系统是查询状态标志还是发出硬件中断请求。位定义如下:
TIE为发送中断允许位。
1=发送中断允许。
0=禁止发送中断。
TCIE为发送完成中断允许位。
1=允许发送完成中断。
0=禁止发送完成中断。
RIE为接收终端允许位。
1=允许接收中断。
0=禁止接收中断。
ILIE为空闲中断允许位。
1=允许空闲中断。
0=禁止空闲中断。
TE为发送允许位。
1=允许发送器。
0=禁止发送器。
RE为接收允许位。
1=允许接收器。
0=禁止接收器。
RWU为接收唤醒位。
1=接收器处于等待状态,并关闭接收中断。当SCIxC1的WAKE位决定的唤醒条件发生时,接收器退出等待状态,并清零RWU位。
0=接收器正常工作。
SBK为终止位。
1=发送终止码。
0=发送器正常工作。
(4)SCI控制寄存器3(SCIxC3)
SCIxC3位定义为:
R8为接收位8。
当选择9位字符时,该位为接收的最后一位。
T8为发送位8。
当选择9位字符时,该位为发送的最后一位。
TXDIR为单线模式下TxD管脚方向位。
1=单线模式下,TxD管脚为输出。
0=单线模式下,TxD管脚为输入。
TXINV为发送数据反向位。
1=发送数据反向。
0=正常数据发送。
ORIE为接收器溢出中断允许位。
1=允许接收器溢出中断。
0=禁止接收器溢出中断。
NEIE为接收器噪声错误中断允许位。
1=允许接收器噪声错误中断。
0=禁止接收器噪声错误中断。
FEIE为接收器帧错误中断允许位。
1=允许接收器帧错误中断。
0=禁止接收器帧错误中断。
PEIE为接收器奇偶错误中断允许位。
1=允许接收器奇偶错误中断。
0=禁止接收器奇偶错误中断。
(5)SCI通信状态寄存器1(SCIxS1)
SCIxS1位定义为:
TDRE为发送数据寄存器空标志。
1=发送数据寄存器空。
0=发送数据寄存器满。
TC为发送完成标志。
1=发送器空闲。
0=发送器忙。
RDRF为接收数据寄存器满标志。
1=接收数据寄存器满。
0=接收数据寄存器空。
读出SCIxS1,再读出SCDR时,清空该标志位。
IDLE为接收器空闲标志。
1=空闲线被检测到。
0=没有检测到空闲线。
读出SCIxS1,再读出SCDR时,清空该标志位。
OR为接收器溢出标志。
1=接收器溢出。
0=接收器未溢出。
读出SCIxS1,再读出SCDR时,清空该标志位。
NF为接收器噪声标志位。
1=接收器噪声被检测到。
0=接收器噪声未检测到。
FE为接收器帧错误标志位。
1=接收器帧错误。
0=接收器帧无错。
读出SCIxS1,再读出SCDR时,清空该标志位。
PF为接收器奇偶错标志位。
1=接收器奇偶错。
0=接收器奇偶正确。
读出SCIxS1,再读出SCDR时,清空该标志位。
(6)SCI通信状态寄存器2(SCIxS2)
SCIxS2位定为:
LBKDIF为LIN终止码中断标志。
1=LIN终止码中断。
0=LIN终止码未发生中断。
写1清空该标志位。
RXEDGIF为RxD管脚边沿有效中断标志位。
1=边沿有效中断。
0=边沿有效未发生中断。
写1清空该标志位。
RXINV为接收数据反向。
1=接收数据反向。
0=接收数据未反向。
RWUID为空闲唤醒接收检测位。
1=空闲字符唤醒接收。
0=未发现空闲字符唤醒接收。
BRK13为终止码生成长度控制位。
1=13位时间长度的终止码正在发送。
0=10位时间长度的终止码正在发送。
LBKDE为LIN终止码检测控制位。
1=允许11位时间长度的终止码检测。
0=允许10位时间长度的终止码检测。
RAF为接收器帧错误标志位。
1=接收器帧错误。
0=接收器帧无错。
读出SCIxS1,再读出SCDR时,清空该标志位。
(7)SCI通信数据寄存器2(SCIxD)
SCIxD位定义为:
串行通信数据寄存器(SCIxD)具有双重功能:读时是接收寄存器;写时是发送寄存器。
HCS08系列单片机的SCI模块采用了发送器和接收器双缓冲技术。SCI的硬件缓冲区有两个字节,串行通信数据寄存器可以存储一个字节,移位寄存器可以存储一个字节。即使CPU因处理单个字符而延迟回应,也可以很容易地处理一串连续字符,因此用户在编制串行通信软件时有很大的回旋余地。
1.2.11 SPI模块
MC9S08JM60单片机内置两个同步串行外设接口,即SPI。SPI系统用于同标准外设芯片通信。这类芯片主要包括其他单片机、模数转换器、移位寄存器、传感器、存储器等。
一个典型的SPI系统包括一个主微控制器和一个或多个从属外设。很多制造商都生产同步串行外设,为了兼容大多数外设,SPI系统可以选择移位率、主从模式及时钟的极性、相位等。
MC9S08JM60的SPI模块提供了3类寄存器:控制、状态和数据寄存器。其中控制类寄存器有:SPIxC1、SPIxC2、SPIxBR、SPIxMH和SPIxML;状态类寄存器有:SPIxS;数据类寄存器有:SPIxDH和SPIxDL。下面结合具体的寄存器来介绍SPI模块。
1. SPI模块的控制类寄存器
控制类寄存器较多,主要包括SPIxC1、SPIxC2、SPIxBR、SPIxMH和SPIxML5个寄存器。这5个寄存器主要控制SPI模块的工作。下面分别对这5个寄存器进行介绍。
(1)SPI控制寄存器1(SPIxC1)
SPIxC1的位定义如下:
SPIE为SPI中断使能位。
1=允许SPI中断。
0=禁止SPI中断。
SPE为SPI模块允许位。
1=允许SPI模块。
0=禁止SPI模块。
SPTIE为SPI发送中断允许位。
1=允许SPI在SPTE位被置为1时产生中断请求。
0=禁止SPI在SPTE位被置为1时产生中断请求。
MSTR为SPI主机位。
1=选择SPI主机模式。
0=选择SPI从机模式。
CPOL为时钟奇偶位。
1=选择低电平有效时钟,SPI时钟空闲状态为高电平。
0=选择高电平有效时钟,SPI时钟空闲状态为低电平。
CPHA为时钟相位位。
1=从机以SPSCK的第一次沿跳变为移位开始信号。
0=从机以/SS的下降沿作为移位开始信号。
SSOE为从模式输出使能。
该位和其他控制位一起决定/SS管脚的功能。
LSBFE为移位方向位。
1=SPI串行数据传输以最低位开始。
0=SPI串行数据传输以最高位开始。
(2)SPI控制寄存器2(SPIxC2)
SPIxC2位定义为:
SPMIE为SPI匹配中断允许位。
1=允许SPI匹配中断。
0=禁止SPI匹配中断。
SPIMODE为SPI模式选择位。
1=允许SPI模块。
0=禁止SPI模块。
MODFEN为模式设置错误检测允许位。
1=允许MODF标志置为1。
0=禁止MODF标志置为1。
BIDIROE为双向模式输出允许位。
1=SPI I/O管脚为输出。
0=输出驱动器关闭,SPI数据I/O管脚为输入。
SPISWAI为等待模式下SPI的停止位。
1=MCU进入等待模式,SPI时钟关闭。
0=MCU进入等待模式,SPI时钟继续工作。
SPC0为SPI管脚控制位。
1=配置SPI为单线双向工作。
0=SPI使用独立的数据输入/输出管脚。
(3)SPI波特率寄存器(SPIxBR)
SPIxBR位定义为:
SPPR[2:0]为SPI移位频率预分频选择位。这3位定义波特率预分频系数,如表1-9所示。预分频的输入是总线时钟(BUSCLK);预分频器的输出驱动SPI波特率系数的输入。
表1-9 SPI波特率预分频系数
SPR[2:0]为SPI移位频率分频选择位。这3位定义SPI波特率分频系数,如表1-10所示。该被除数的输入来自SPI波特率预分频器;输出是主模式的SPI波特率时钟。
表1-10 SPI波特率分频系数
(4)SPI匹配寄存器(SPIxMH)
SPIxMH的位定义为:
(5)SPI匹配寄存器(SPIxML)
SPIxML的位定义为:
SPI匹配寄存器SPIxMH:SPIxML存储硬件的比较值。当SPI接收数据缓冲器的值和匹配寄存器的值相同时,匹配标志SPMF将置为1。SPI选择8位模式时,仅SPIxML匹配寄存器可用。
2. SPI模块的状态类寄存器
状态类寄存器只有一个寄存器——SPIxS。SPIxS有4个状态标志,用来指示SPI模块设置和数据传输过程中的状态。这些状态被SPI事件自动置位,由软件进行清零。
SPRF为SPI接收结束位。
1=接收数据缓冲器满。
0=接收数据缓冲器未满。
当单片机和外部设备之间的数据传输结束后,数据从移位寄存器进入接收数据寄存器中,单片机将SPRF置1以通知用户接收结束。SPRF被置1后,用户在程序里读一次SPIxS,将清零该位。
SPMF为SPI匹配标志位。
1=SPI接收数据缓冲器的值和SPI匹配寄存器中的值相等。
0= SPI接收数据缓冲器的值和SPI匹配寄存器中的值不相等。
SPTEF为SPI发送缓冲器空标志位。
1=SPI发送数据缓冲器空。
0= SPI发送数据缓冲器未空。
在单片机和外部设备之间的数据传输过程中,数据从发送数据寄存器进入移位寄存器中,单片机将SPTER置1以通知用户发送结束。读SPIxS寄存器,清零该位。
MODF为模式设置错误标志位。
1=/SS引脚逻辑电平不正确。
0=/SS引脚逻辑电平正确。
当MODF为1,且/SS引脚信号与SPI当前工作方式(主机或从机)不符时,具体地说,就是当从机的/SS为高电平,或是主机的/SS为低电平时,MODF会置1。MODF被置1后,用户在程序里读一次SPIxS寄存器,再对SPIxC1进行一次写操作,会清零MODF位。
3. SPI模块的数据类寄存器
数据类寄存器包含两个寄存器:SPIxDH和SPIxDL。
(1)SPI数据寄存器SPIxDH
SPIxDH的位定义为:
(2)SPI数据寄存器SPIxDL
SPIxDL的位定义为:
SPI数据寄存器(SPIxDH:SPIxDL)具有双重功能:读时是接收寄存器;写时是发送寄存器。
在实际的工作过程中,数据一旦写入发送数据寄存器,就会立即送到移位寄存器并将SPTEF置1。下一次数据发送之前必须先清零SPTER标志位,否则发送数据将被忽略。
在数据接收过程中,SPRF标志置1,则用户可以读取数据。前一个数据未读取,继续接收第二个数据将会产生数据溢出错误,同时第二个数据将会丢失。
1.2.12 ADC模块
A/D转换模块(Analog To Digital Convert Module,模/数转换模块)的功能是将电压信号转换为对应的数字信号。实际应用中,这个电压信号可能由温度、湿度、压力等实际物理量经过传感器和相应的变换电路转化而来。MC9S08JM60单片机集成了两个12通道12位模数转换器ADC12V1,A/D转换模块的输入引脚和I/O端口引脚复用。ADC12V1模块主要有以下特点:
● AD转换结果可选12位、10位或8位无符号格式。
● 单次或连续转换模式。
● 可配置的采样时间和转换速度/功耗。
● AD时钟可从4种时钟源中任选其一。
● 在低噪声应用中,可工作在等待模式或stop3模式下。
● 可选的异步硬件转换触发器。
● 自动比较中断功能。
● 温度传感器功能。
用户对ADC12V1模块的所有操作都是通过该模块的寄存器完成的。ADC12V1模块的寄存器大致可分为以下4类:状态和控制类、数值类、配置类,以及管脚控制类。其中状态和控制类的寄存器有:ADCSC1和ADCSC2;数值类寄存器有:转换结果寄存器ADCRH 、ADCRL和转换比较值寄存器ADCCVH、ADCCVL;配置类寄存器有:ADCCFG;管脚控制类寄存器有:APCTL1、APCTL2、APCTL3。下面结合具体的寄存器来介绍ADC12V1模块。
1. ADC12V1模块的状态和控制类寄存器
状态和控制类的寄存器主要包括ADCSC1和ADCSC2两个寄存器。这两个寄存器主要控制ADC12V1模块的工作。下面分别对这两个寄存器进行介绍。
(1)A/D状态和控制寄存器ADCSC1
ADCSC1位定义如下:
COCO为A/D转换标志完成位。
这个只读标志位在每次转换完成后自动置1。当写入ADCSC1或者读取数据结果寄存器(ADCRL)时,将清除该标志位。
AIEN为A/D中断允许控制位。
1=允许A/D中断,系统将在转换完成时产生中断(由COCO出发)。0=禁止A/D中断。
ADCO为A/D连续转换控制位。
1=连续转换模式,A/D转换器会不断地进行连续转换,并在每次转换结束后将新的转换结果写入A/D数据寄存器中;
0=单次转换模式,在写入ATDISC后只触发一次A/D转换。
ADCH为A/D输入信道选择控制位。其对应关系如表1-11所示。
表1-11 ATDCH与输入信道选择的对应关系
(2)A/D状态和控制寄存器ADCSC2
A/D状态和控制寄存器ADCSC2控制A/D转换的比较功能、转换触发和A/D模块转换的启动等。
ADACT为A/D转换有效状态位。
1=A/D转换正在进行。
0=A/D转换未进行。
该标志位在A/D转换模块初始化后置1,在A/D转换结束或终止时清零。
ADTRG为A/D转换触发选择位。
1=硬件触发A/D转换。
0=软件触发A/D转换。
该位启动A/D转换的触发类型。选择软件触发方式时,对ADCSC1的写操作立即启动A/D转换;选择硬件触发方式时,ADHWT管脚上的高电平输入立即启动A/D转换。
ACFE为A/D模块比较功能控制位。
1=使能比较功能。
0=禁止比较功能。
ACFGT为A/D模块比较功能超出功能控制位。
1=信道输入值的转换结果大于或等于比较值时,触发比较功能。
0=信道输入值的转换结果小于比较值时,触发比较功能。
2. ADC12V1模块的数值类寄存器
ADC12V1模块的数值类寄存器主要存储A/D转换的结果和比较值。主要包含ADCRH 、ADCRL和转换比较值寄存器ADCCVH、ADCCVL。下面对这4个寄存器分别进行介绍。
ADCRH寄存器存储A/D转换结果的高位值。当A/D转换精度选择为12位时,ADCRH存储12位转换结果的高4位;当A/D转换精度选择为10位时,ADCRH存储10位转换结果的高2位,ADR11~ADR10位被清零;当A/D转换精度选择为8位时,ADCRH的ADR11~ADR8位被清零。
(1)ADCRH寄存器
定义为:
(2)ADCRL寄存器
ADCRL寄存器存储A/D转换结果的低8位值。定义为:
(3)ADCCVH寄存器
ADCCVH寄存器存储A/D转换比较值的高位值。当A/D转换精度选择为12位时,使能比较功能后,ADCCVH存储12位比较值的高4位;当A/D转换精度选择为10位时,使能比较功能后,ADCCVH存储10位比较值的高2位;当A/D转换精度选择为8位时, ADCCVH寄存器的值不使用。位定义如下:
(4)ADCCVL寄存器
ADCCVL寄存器存储A/D转换比较值的低8位值。位定义如下:
3. ADC12V1模块的配置类寄存器
配置类寄存器只包括ADCCFG一个寄存器。这个寄存器主要控制ADC12V1模块的时钟源、分频因子和工作方式等。具体描述如下:
ADLPC为低功耗配置位。
1=高速配置。
0=低功耗配置。
该位控制逐次逼近A/D转换的速度和功耗。当不需要高采样率时,可使用低功耗配置来降低系统功耗。
ADIV为A/D时钟分频因子控制位。
该位设置A/D转换的时钟分频因子。时钟分频因子值及其对应的总线频率如表1-12所示。
表1-12 分频率选择
ADLSMP为A/D采样时间控制位。
1=长采样时间。
0=短采样时间。
该位控制逐次逼近A/D转换的采样时间,利用该位可实现高阻抗输入值的精确采样和低阻抗输入的快速采样。长采样时间也有利于降低系统功耗。
MODE为A/D转换模式控制位。
该位控制A/D转换精度,可配置选择12位、10位和8位转换精度。模式控制位及其对应的转换精度如表1-13所示。
表1-13 转换模式选择表
ADICLK为A/D转换输入时钟控制位。
该位控制A/D转换输入时钟源。ADICLK控制位及其对应的时钟源如表1-14所示。
表1-14 输入时钟源选择
4. ADC12V1模块的管脚控制类寄存器
管脚控制类寄存器包括APCTL1、APCTL2和APCTL3共3个寄存器。这3个寄存器主要控制ADC12V1模块的模拟输入通道和通用I/O复用。下面分别对这3个寄存器进行介绍。
(1)管脚控制寄存器APCTL1
管脚控制寄存器APCTL1控制ADC模块的0~7号模拟输入通道和通用I/O的复用。各控制位如下:
ADPC7~ADPC0为ADC引脚允许控制位。
1=允许该引脚为A/D转换模块使用。
0=不允许该引脚为A/D转换模块使用。
(2)管脚控制寄存器APCTL2
管脚控制寄存器APCTL2控制ADC模块的8~15号模拟输入通道和通用I/O的复用。位定义如下:
ADPC15~ADPC8为ADC引脚允许控制位。
1=允许该引脚为A/D转换模块使用。
0=不允许该引脚为A/D转换模块使用。
(3)管脚控制寄存器APCTL3
管脚控制寄存器APCTL3控制ADC模块的16~23号模拟输入通道和通用I/O的复用。位定义如下:
ADPC23~ADPC16为ADC引脚允许控制位。
1=允许该引脚为A/D转换模块使用。
0=不允许该引脚为A/D转换模块使用。
1.2.13 USB模块
MC9S08JM60单片机内置了通用串行总线设备控制器(S08USBV1)模块,即USB。它基于通用串行总线规格版本2.0。USB模块提供了单片全速(12Mbps)USB设备应用的解决方案,而且集成了必需的带有串行接口引擎(SIE)的收发器、3.3V稳压器、端点RAM和其他控制逻辑。下面具体对USB模块的结构、USB寄存器和工作模式进行介绍。
1. USB模块的结构
由图1-7可以看出,USB模块主要由串行接口引擎(SIE)、USB RAM及其管理模块、SkyBlue Gasket接口、USB收发器、片上调压器等部分组成。用户对USB模块的所有操作都是通过操作该模块的寄存器完成的。下面将介绍USB模块的寄存器。
图1-7 USB模块的硬件结构图
2. USB模块的寄存器
USB模块的寄存器较多,主要分为控制类寄存器和状态类寄存器。下面结合具体的寄存器来介绍USB模块的功能。
(1)USB控制寄存器0(USBCTL0)
位定义如下:
USBRESET为USB复位状态。
1=USB模块返回它的复位状态。
0=USB模块正常运行。
该位产生一个USB模块硬复位,USBPHYEN和USBVREGEN位也会被清除。当置为1时,该位在复位时自动清除。
USBPU为上拉源控制位。
1=内部USBDP上拉电阻允许。
0=内部USBDP上拉电阻被禁用,此时的应用可使用一个外部的上拉电阻。
USBRESMEN为USB低电压唤醒事件允许控制位。
1=USB从挂起模式异步唤醒允许。
0=USB从挂起模式异步唤醒禁止。该位置为1,当USB模块检测到LPRESF位置为1,那么USB模块会向MCU提出一个异步唤醒中断。
LPRESF为低电压恢复标志位。
1=当设备处在stop3而且USB处在挂起状态,并当USBRESMEN=1时, USB总线上检测到K-状态。
0=当设备处在stop3而且USB处在挂起状态,USB总线上没有检测到K-状态。
在USB挂起模式下,如果USBRESMEN=1而且K-状态在USB总线上被检测到,该位置为1,表明设备在低电压stop3模式下发出了恢复信号。该标志位将会触发一个异步中断,这个中断将会把设备从stop3模式下唤醒。为了清除LPRESF标志位,固件必须先清除USBRESMEN位。
USBVREN为USB电压调节器使能。
1=片上3.3V USB电压调节器允许,在主模式或备用模式下。
0=片上3.3V USB电压调节器被禁用。
USBPHYEN为USB收发器允许。
1=片上XCVR被使能。
0=片上XCVR被禁止。
当USB收发器(XCVR)被禁用时,USBDP和USBDN是hi-Z。推荐设置CTL寄存器的USBEN位为1,前置XCVR位为1。固件必须确保XCVR在进入USB挂起模式时保持使能状态。
(2)外设ID寄存器(PERID)
PERID寄存器的读回值为0x04,这个是为USB模块外设而定义的。位定义如下:
ID[5:0]为外设配置编号。这个编号被设置为0x04,表示外设处在全速USB模块状态下。
(3)外设ID反码寄存器(IDCOMP)
读IDCOMP寄存器将返回外设ID寄存器的反码值。对于USB模块外设此值应该是0Xfb。位定义如下:
NID[5:0]为ID编码的反码,即ID[5:0]的反码。
(4)外设版本寄存器(REV)
读REV寄存器将返回外设USB的外设版本号值。位定义如下:
REV[7:0]为USB模块的版本号。
(5)中断状态寄存器(INTSTAT)
INTSTAT寄存器包含了USB模块中断源的每一位。这些位由它们各自的中断允许位控制。该寄存器的所有位是从单个的中断源“逻辑或”到一起的。一旦一个中断位被置位,它仅能够通过向相应的中断位写1来清除。位定义如下:
STALLF为STALLF标志。
1=一个STALL握手被发出。
0=一个STALL握手未发出。
STALL中断被用在设备模式下。在设备模式下,当一次STALL握手被串行接口引擎(SIE)发送时,STALL标志被置为1。
RESUMEF为恢复标志位。
1=检测到恢复信号。
0=没有检测到恢复信号。
在USB模块的时钟伴随恢复信号被重新启动后2.5us时,该位被置1。
表明USB总线上有远程唤醒信号。
SLEEPF为睡眠标志位。
1=USB检测到一个持续3ms稳定的空闲状态。
0=USB总线上没有检测到3ms空闲状态。
TOKDNEF为令牌完成标志位。
1=当前处理的令牌已经完成。
0=无处理完成的令牌操作。
当前传送完成时此位被置1。固件必须立即读寄存器STAT,以确定端点和BD信息。清除此位(通过向此位写1)将引起STAT寄存器被清除或者STAT FIFO保持寄存被存入STAT寄存器。
SOFTOKF为SOF令牌标志位。
1=USB模块接收到SOF令牌。
0=USB模块未接收到SOF令牌。
ERRORF为错误标志位。
1=检测到ERRSTAT寄存器中的错误条件。
0=没有检测到ERRSTAT寄存器中的错误条件。
USBRSTF为USB复位标志位。
1=检测到USB复位信号。
0=没有检测到USB复位。
当USB模块解析到一个合法的USB复位时该位将被置1。当确定后,该位会通知MCU自动向地址寄存器写0x00并且使能端点0。一旦检测到持续2.5us的复位信号,USBRSTF将置1。
(6)中断允许寄存器(INTENB)
寄存器INTENB包含了USB模块的每一个中断源允许位。设置这些位中的任何一位将使能INTENB寄存器中的相应中断源。位定义如下:
STALL为STALL中断允许位。
1=允许STALL中断。
0=禁止STALL中断。
RESUME为恢复中断允许位。
1=允许恢复中断。
0=禁止恢复中断。
SLEEP为睡眠中断允许位。
1=允许睡眠中断。
0=禁止睡眠中断。
TOKDNE为TOKDNE中断允许位。
1=允许TOKDNE中断。
0=禁止TOKDNE中断。
SOFTOK为SOF令牌中断允许位。
1=允许SOF令牌中断。
0=禁止SOF令牌中断。
ERROR为错误中断允许位。
1=允许错误中断。
0=禁止错误中断。
USBRST为USB复位中断允许位。
1=允许USB复位中断。
0=禁止USB复位中断。
(7)错误中断状态寄存器(ERRSTAT)
寄存器ERRSTAT的每一位包含了USB模块的相应错误源。这些位中的每一位都对应相应的错误允许位。这些结果被“与”在一起,然后发送到INTSTAT寄存器的错误位。一旦一个中断位被置1,向相应的标志位写1可以清除它。位定义如下:
BTSERRF为位填充错误标志位。
1=位填充标志置位。
0=没有检测到位填充错误。
BUFERR为缓冲区错误标志位。
1=检测到缓冲错误。
0=没有检测到缓冲错误。
如果USB模块已经请求了读存储器中新的DB,但是在USB模块需要接收或传输数据前没有得到总线控制权,该位将置1。如果处理一次TX(在端点内)传输,将会引起一次传输数据下溢条件。或者如果处理一次RX(在端点外)传输,将会引起一次接收数据下溢条件。
如果发送给或者从机接收到的数据包比缓冲区大,被分配到BD,该位也将置1。
BTOERRF为总线转向超时错误位。
1=发生了总线转向超时错误。
0=没有总线转向超时错误发生。
DFN8F为数据字段错误标志位。
1=数据字段不是整数字节。
0=数据字段是整数字节。
数据字段接收到的不是8位间隔。USB规则规定了,数据字段必须是整数个字节。如果数据字段不是整数个字节,该位将置1。
CRC16F为CRC16错误标志位。
1=检测到CRC16错误。
0=没有检测到CRC16错误。
CRC5F为CRC5错误标志位。
1=检测到CRC5错误,令牌包将被丢弃。
0=没有检测到CRC5错误。
PIDERRF为PID错误标志位。
1=检测到PID校验错误。
0=没有检测到PID校验错误。
(8)错误中断允许寄存器(ERRENB)
位定义如下:
BTSERR为BTSERR中断允许位。
1=允许BTSERR中断。
0=禁止BTSERR中断。
BUFERR为BUFERR中断允许位。
1=允许BUFFRR中断。
0=禁止BUFERR中断。
BTOERR为BTOERR中断允许位。
1=允许BTOERR中断。
0=禁止BTOERR中断。
DFN8为DFN8中断允许位。
1=允许DFN8中断。
0=禁止DFN8中断。
CRC16为CRC16中断允许位。
1=允许CRC16中断。
0=禁止CRC16中断。
CRC5为CRC5中断允许位。
1=允许CRC5中断。
0=禁止CRC5中断。
PIDERR为PIDERR中断允许位。
1=允许PIDERR中断。
0=禁止PIDERR中断。
(9)USB状态寄存器(STAT)
状态寄存器STAT能够显示USB模块的传输状态。当MCU接收到一个TOKDNE中断,读到的STAT寄存器值决定了先前端点通信的状态。状态寄存器中的值仅在TOKDNEF中断标志被确定时才是无效的。状态寄存器STAT实际上是在窗口读进一个由USB模块维护的状态FIFO。当USB模块使用一个BD,它会更新状态寄存器。如果另一个USB传输在TOKDNE中断处理前被执行,USB模块将会把下一个传输的状态存储到状态FIFO中。因此,STAT寄存器实际上是一个4字节FIFO,它允许微控制器处理一个传输而串行接口引擎(SIE)处理下一个。清除INTSTAT寄存器中的TOKDNEF位将会引起SIE更新STAT寄存器为下一个STAT值。位定义如下:
ENDP[3:0]为端点编号位。
0000 端点0
0001 端点1
0010 端点2
0011 端点3
0100 端点4
0101 端点5
0110 端点6
IN为进/出传输位。
1=最后BDT更新是为发送(进)传输而更新的。
0=最后传输是一个接收(出)数据传输。
ODD为奇/偶传输位。
1=最后一次缓冲区描述符更新是在BDT的奇数存储区。
0=最后一次缓冲区描述符更新是在BDT的偶数存储区。
(10)USB控制寄存器(CTL)
CTL为USB模块提供了各种控制和配置信息。位定义如下:
TSUSPEND为传输挂起位。
1=在一个初始化令牌收到时由SIE将此位置1,SIE已经禁止了包传送和接收。
0=允许SIE继续处理令牌。
CRESUME为恢复信号位。
1=执行恢复信号,远程唤醒。
0=不执行远程唤醒。
ODDRST为奇复位。
1=复位所有缓冲区标识符奇乒/乓位为0,这将指定偶标识符存储区。
0=不复位。
USBEN为USB使能位。
1=允许USB模块操作,不会影响收发器和VREG。
0=禁用USB模块。
此位置1将会使能USB模块的操作。此位置1将引起SIE复位它的所有ODD位到BDT。
(11)地址寄存器(ADDR)
ADDR寄存器包含唯一的7位设备地址,这个地址将被识别如USB一样。在复位输入已经激活或者USB模块已经解析了USB复位信号以后,这个寄存器将被重置为0x00。当固件处理一个设置地址(SET_ADDRESS)请求时,它将会改变这个值。位定义如下:
ADDR[6:0]为USB地址位。这7位定义了USB模块解码的USB地址。
(12)帧编号寄存器(FRMNUML,FRMNUMH)
帧编号寄存器包含了11位帧编码。帧编码寄存器要求两个8位寄存器来实现。低8位在寄存器FRMNUML中,而高8位在寄存器FRMNUMH中。无论何时收到一个SOF令牌,这两个寄存器都会更新成当前的帧编码。位定义如下:
FRM[7:0]为帧编码位。这些位出现在11位帧编码的低8位。
FRM[10:8]为帧编码位。这些位出现在11位帧编码的高8位。
(13)端点控制寄存器(EPCTLn,n=0~6)
每一个解析过地址的USB模块可用端点的控制寄存器都包含了这些端点控制位:EPCTLDIS、EPRXEN、EPTXEN、EPHSHK。这4位定义了所有对任一端点的控制信息。端点0(ENDP0)与控制管道0相关联,这是由USB的所有功能所要求的。因此,在一次USBRST中断接收到以后,MCU必须设置EPCTL0为0x0D。位定义如下:
EPCTLDIS为端点控制位。
这一位定义了一个端点是否被使能和端点方向。端点使能/方向控制如表1-15所示。
表1-15 端点使能/方向控制列表
EPRXEN为端点Rx使能位。
这一位定义了一个端点是否能够外向传送。端点使能/方向控制如表1-15所示。
EPTXEN为端点Tx使能位。
这一位定义了一个端点是否能够内向传输。端点使能/方向控制如表1-15所示。
EPSTALL为端点拖延位。
1=端点n被拖延。
0=端点n没有被拖延。
该位在端点控制寄存器中对其他位有优先权,但是仅在EPTXEN=1或EPRXEN=1时才是有效的。对这个端点的任何存取将会引起USB模块返回拖延握手。一旦一个端点被拖延,它需要来自主控制器的干涉。
EPHSHK为端点握手位。
1=在一次对端点的传输期间执行了握手。
0=在一次对端点的传输期间没有执行握手。