<4D F736F F D CFB5C1D0CEA2BFD8D6C6C6F7B2CEBFBCCAD6B2E12E646F63>

Size: px
Start display at page:

Download "<4D F736F F D CFB5C1D0CEA2BFD8D6C6C6F7B2CEBFBCCAD6B2E12E646F63>"

Transcription

1 HCS08 系列微控制器参考手册 第一册 苏州大学飞思卡尔嵌入式系统研发中心翻译 年 11 月

2 目 录 第一章通用信息与结构框图 HCS08 系列微控制器介绍 HCS08 CPU 编程模型 外设模块 MC9S08GB60 的特点 HCS08 系列的共性 MC9S08GB60 的特点 MC9S08GB60 的结构框图... 4 第二章引脚及其连接 简介 推荐的系统连接 电源 MC9S08GB60 振荡器 复位 背景 / 模式选择 (BKGD/MS) 通用 I/O 及外设端口... 8 第三章工作模式 简介 特征 运行模式 背景调试模式 等待模式 停止模式 Stop1 模式 Stop2 模式 Stop3 模式 停止模式下激活 BDM 使能 设置 OSCSTEN 位 停止模式下 LVD 使能 停止模式下的片上外设模块 系统选择寄存器 (SOPT)... 17

3 3.6.9 系统电源管理状态和控制寄存器 1(SPMSC1) 系统电源管理状态和控制寄存器 2(SPMSC2) 第四章片上存储器 简介 HCS08 核定义的存储器组织 HCS08 存储器组织 MC9S08GB60 存储映像 复位和中断向量表 寄存器地址和位分配 RAM K 字节的 FLASH 特征 写入 擦除和空白检测命令 命令时间和突发模式写入 行和 FLASH 的组织结构 程序命令时序 访问错误 向量重定向 FLASH 块保护 (MC9S08GB60) MC9S08GB60 的安全性 MC9S08GB60 的 FLASH 寄存器和控制位 FLASH 时钟分频寄存器 (FCDIV) FLASH 选项寄存器 (FOPT 和 NVOPT) FLASH 配置寄存器 (FCNFG) FLASH 保护寄存器 (FPROT 和 NVPROT) FLASH 状态寄存器 (FSTAT) FLASH 命令寄存器 (FCMD) FLASH 存储器应用实例 FLASH 模块时钟的初始化 擦除 FLASH 的一页 (12 字节 ) DoOnStack 子程序 SpSub 子程序 FLASH 的字节编程 第五章复位和中断 简介 MC9S08GB60 复位和中断的特征... 47

4 .3 MCU 复位 计算机正常操作监控模块 (COP) 看门狗 中断 中断堆栈结构 外部中断请求 (IRQ) 引脚 引脚配置选项 边沿 / 电平触发 中断向量 中断源和局部屏蔽 低电压检测系统 (LVD) 上电复位操作 LVD 复位操作 LVD 中断操作 低电压警告 (LVW) 实时中断 (RTI) 复位 中断以及系统控制寄存器和控制位 中断请求状态和控制寄存器 (IRQSC) 系统复位状态寄存器 (SRS) 系统背景调试强制复位寄存器 (SBDFR) 系统选项寄存器 (SOPT) 系统设备识别寄存器 (SDIDH SDIDL) 系统实时中断状态和控制寄存器 (SRTISC) 系统电源管理状态控制寄存器 1(SPMSC1) 系统电源管理状态和控制寄存器 2(SPMSC2)... 9 第六章中央处理单元 简介 编程结构和 CPU 寄存器 累加器 (A) 变址寄存器 (H:X) 堆栈指针 (SP) 程序计数器 (PC) 条件码寄存器 (CCR) 寻址方式 隐含寻址方式 (INH) 相对寻址方式 (REL) 立即寻址方式 (IMM) 直接寻址方式 (DIR) 扩展寻址方式 (EXT)... 72

5 6.3.6 变址寻址方式 无偏移量变址方式 (IX) 无偏移量变址 变址加 1 寻址方式 (IX+) 位偏移量变址方式 (IX1) 位偏移量变址 变址加 1 寻址方式 (IX1+) 位偏移量变址方式 (IX2) 位偏移量堆栈寻址方式 (SP1) 位偏移量堆栈寻址方式 (SP2) 特殊操作 复位序列 中断 等待模式 停止模式 背景模式 总线周期的用户观点 通过指令类别进行指令集描述 数据传送指令 加载与存储 位的置位与清零 存储器到存储器的传送 寄存器传输和半字节交换 算术运算指令 加 减 乘和除指令 加一 减一 清零和求补 比较和测试 BCD 的计算 逻辑操作指令 与 或 异或与求补 位测试指令 移位类指令 跳转 转移和循环控制指令 无条件跳转和转移指令 简单转移 有符号转移 无符号转移 位条件转移 循环控制 相关堆栈指令... 97

6 6..7 其他各种指令 指令简表 汇编语言指南 列表行 汇编指令 BASE 设定编译器的缺省数进制 INCLUDE 指定附加源文件 NOLIST/LIST 关闭或打开程序列表 ORG 设置程序的起始位置 EQU 把一个标号和一个数值相关联 dc.b 定义存储器中字节化常量 dc.w 在存储器中定义 16 位 ( 字 ) 常量 ds.b 定义存储 ( 保留 ) 内存变量字节 标号 表达式 通用文件协议 目标代码 (S19) 文件 第七章开发支持 介绍 特点 背景调试控制器 (BDC) BKGD 引脚描述 通信细节 BDC 通信速率考虑事项 位时序细节 BDC 寄存器和控制位 BDC 状态和控制寄存器 BDC 断点匹配寄存器 BDC 命令 SYNC 要求时序参考脉冲 ACK_ENABLE ACK_DISABLE BACKGROUND READ_STATUS WRITE_CONTROL READ_BYTE READ_BYTE_WS

7 READ_LAST WRITE_BYTE WRITE_BYTE_WS READ_BKPT WRITE_BKPT GO TRACE TAGGO READ_A READ_CCR READ_PC READ_HX READ_SP READ_NEXT READ_NEXT_WS WRITE_A WRITE_CCR WRITE_PC WRITE_HX WRITE_SP WRITE_NEXT WRITE_ NEXT_WS 串行接口硬件握手协议 取消握手协议 BDC 硬件断点 与 M68HC12BDM 的不同之处 位体系结构 命令格式 状态位的读写 BDM 与停止和等待模式 SYNC 指令 硬件断点 标识部分和 BDC 强制复位 系统设备识别寄存器 (SDIDH:SDIDL) 系统背景调试强制复位寄存器 片上调试系统 (DBG) 比较器 A 和 B 总线信息捕捉和 FIFO 操作

8 7..3 流程改变信息 标记与强制断点和触发器 CPU 断点请求 触发模式 单独 A 触发模式 A 或 B 触发模式 A 然后 B 触发模式 事件 B 触发模式 ( 存储数据 ) A 然后事件 B 触发模式 ( 存储数据 ) A 和 B 数据触发 ( 全模式 ) A 与非 B 数据触发 ( 全模式 ) 触发范围内 :A 地址 B 触发范围外 : 地址 <A 或者地址 >B DBG 寄存器和控制位 调试比较器 A 的高地址页寄存器 (DBGCAH) 调试比较器 A 的低位寄存器 (DBGCAL) 调试比较器 B 的高地址页寄存器 (DBGCAH) 调试比较器 B 的低位寄存器 (DBGCAL) 调试 FIFO 高地址页寄存器 (DBGFH) 调试 FIFO 低位寄存器 (DBGFL) 调试控制寄存器 (DBGC) 调试触发寄存器 (DBGT) 调试状态寄存器 (DBGS) 应用信息与举例 定向的调试器例子 例 1: 终止对地址 A 的处理 例 2: 终止对地址 A 指令的处理 例 3: 终止在地址 A 或 B 上的指令处理 例 4: 开始跟踪在地址 A 的指令 例 :A 到 B 顺序后停止的尾部跟踪 例 6: 起始跟踪数据 B 写入地址 A 例 7: 从地址 B 中读取被捕获的首八位数据 例 8: 捕获在读地址 A 后写入到地址 B 的值 例 9: 在一个例程中触发所有的执行命令 例 10: 通过触发来试图处理外部 FLASH 硬件断点和 ROM 修补 附录 A 指令集详述

9 A.1 引言 A.2 命名规则 A.3 规范定义 A.4 指令集 ADC Add with Carry( 带进位位加 ) ADD Add without Carry( 无进位位加 ) AIS Add Immediate Value to Stack Pointer( 立即数加到 SP) AIX Add Immediate Value to Index Register( 立即数加到 HX) AND Logical AND( 逻辑与 ) ASL Arithmetic Shift Left( 算术左移 ) ASR Arithmetic Shift Right( 算术右移 ) BCC Branch if Carry Bit Clear(C 为 0 则转移 ) BCLR n Clear Bit n in Memory( 内存单元 n 位清零 ) BCS Branch if Carry Bit Set(C 为 1 则转移 ) BEQ Branch if Equal( 等于则转移 ) BGE Branch if Greater Than or Equal To( 大于或等于则转移 ) BGND Background( 进入背景调试模式 ) BGT Branch if Greater Than( 大于则转移 ) BHCC Branch if Half Carry Bit Clear(H 为 0 则转移 ) BHCS Branch if Half Carry Bit Set(H 为 1 则转移 ) BHI Branch if Higher( 大于则转移 ) BHS Branch if Higher or Same( 大于或等于则转移 ) BIH Branch if IRQ Pin High( 引脚 IRQ 为 1 则转移 ) BIL Branch if IRQ Pin Low( 引脚 IRQ 为 0 则转移 ) BIT Bit Test( 位测试 ) BLE Branch if Less Than or Equal To( 小于或等于则转移 ) BLO Branch if Lower( 小于则转移 ) BLS Branch if Lower or Same( 小于或等于则转移 ) BLT Branch if Less Than( 小于则转移 ) BMC Branch if Interrupt Mask Clear(I 为 0 则转移 ) BMI Branch if Minus( 结果为负则转移 ) BMS Branch if Interrupt Mask Set(I 为 1 则转移 ) BNE Branch if Not Equal( 不等于则转移 ) BPL Branch if Plus( 结果为正则转移 ) BRA Branch Always( 无条件短转移 ) BRCLR n Branch if Bit n in Memory Clear(M 位 n 为 0 则转移 ) BRN Branch Never( 三个总线周期的空操作 ) BRSET n Branch if Bit n in Memory Set(M 位 n 为 1 则转移 )

10 BSET n Set Bit n in Memory(M 位 n 置 1) BSR Branch to Subroutine( 转移到子程序 ) CBEQ Compare and Branch if Equal( 比较, 等于则转移 ) CLC Clear Carry Bit( 进位位 C 清零 ) CLI Clear Interrupt Mask Bit( 中断屏蔽位 I 清零 ) CLR Clear( 清零 ) CMP Compare Accumulator with Memory(A 与 M 比较 ) COM Complement( 按位取反 ) CPHX Compare Index Register with Memory(HX 与 M 比较 ) CPX Compare X with Memory(X 与 M 比较 ) DAA Decimal Adjust Accumulator(A 十进制调整 ) DBNZ Decrement and Branch if Not Zero( 减 1 不为 0 则转移 ) DEC Decrement( 自减 1) DIV Divide( 无符号除法 ) EOR Exclusive-OR Memory with Accumulator(M 与 A 异或 ) INC Increment( 自加 1) JMP Jump( 无条件跳转 ) JSR Jump to Subroutine( 跳转到子程序 ) LDA Load Accumulator form Memory( 取 M 内容到 A) LDHX Load Index Register form Memory( 取 M 内容到 HX) LDX Load X from Memory( 取 M 内容到 X) LSL Logical Shift Left( 逻辑左移 ) LSR Logical Shift Right( 逻辑右移 ) MOV Move(M 单元间数据传送 ) MUL Unsigned Multiply( 无符号数乘法 ) NEG Negate(Two s Complement) ( 求补 ) NOP No Operation( 空操作 ) NSA Nibble Swap Accumulator(A 的高低 4 位对调 ) ORA Inclusive-OR Accumulator and Memory( 逻辑或 ) PSHA Push Accumulator onto Stack(A 进栈 ) PSHH Push H onto Stack(H 进栈 ) PSHX Push X onto Stack(X 进栈 ) PULA Pull Accumulator from Stack(A 出栈 ) PULH Pull H from Stack(H 出栈 ) PULX Pull X from Stack(X 出栈 ) ROL Rotate Left through Carry( 带进位位的循环左移 ) ROR Rotate Right through Carry( 带进位位的循环右移 ) RSP Reset Stack Pointer( 堆栈指针置 $FF)

11 RTI Return from interrupt( 中断返回 ) RTS Return from Subroutine( 子程序返回 ) SBC Subtract with Carry( 带借位减法 ) SEC Set Carry Bit( 进位位置位 ) SEI Set Interrupt Mask Bit( 中断屏蔽位置位 ) STA Store Accumulator in Memory(A 存入 M) STHX Store Index Register(HX 存入 M) STOP Enable IRQ Pin, Stop Processing( 停机 ) STX Store X in Memory(X 存入 M) SUB Subtract( 无借位减法 ) SWI Software Interrupt( 软件中断 ) TAP Transfer Accumulator to Processor Status Byte( 写 CCR) TAX Transfer Accumulator to X(A 复制到 X) TPA Transfer Processor Status Byte to Accumulator( 读 CCR) TST Test for Negative or Zero( 小于或等于 0 测试 ) TSX Transfer Stack Pointer to index Register( 复制 SP 到 HX) TXA Transfer X to Accumulator( 复制 X 到 A) TXS Transfer Index Register Low to Stack Pointer(HX-1 写入 SP) WAIT Enable Interrupts; Stop Processor( 待机 ) 附录 B 通用文件规范 B.1 引言 B.2 存储映射区域划分 B.3 中断向量定义 B.4 位定义的两种方式 B. MC9S08GB60 完整的通用文件

12 HCS08 系列 MCU 参考手册 ( 第一章通用信息与结构框图 ) 第一章通用信息与结构框图 1.1 HCS08 系列微控制器介绍 新型的 FreescaleHCS08 系列微控制器, 尽管包含新指令, 可以执行快速调试和开发功能, 但仍然和旧的 M68HC08 系列完全兼容 这个参考手册使用第一个 HCS08 系列的成员 MC9S08GB60 来描述应用程序和模块行为 若使用 HCS08 系列的其他 MCU 时, 请参照相关 MCU 的数据手册 每个 HCS08 系列的 MCU 都是由 HCS08 核加上几个存储器以及外设模块组成 HCS08 核的组成部分如下 : 1HCS08 CPU 2 背景调试控制器 (BDC) 3 支持多达 32 个中断 / 复位源 4 芯片级地址译码该 HCS08 CPU 可运行 HC08 所有的指令 并增加了背景 (BGND) 调试指令和带有新的寻址方式的 LDHX STHX CPXH 指令, 这提高了编译效率 CPU 的最高时钟频率是 40MHz( 通常由晶振或内部时钟发生器产生 ) 当 CPU 运行在 40MHz 的频率下, 总线最高频率是 20MHz(CPU 时钟频率的一半 ) 更多内容见第六章中央处理器(CPU) 部分 背景调试控制器 (BDC) 内建于 CPU 核内, 以便更容易地访问地址生成电路和 CPU 寄存器信息 BDC 包含一个硬件断点 其他更复杂的断点通常包含在独立的片上调试模块之中 BDC 允许通过 1 个 MCU 上的引脚访问内部寄存器和存储空间 更多内容见第七章开发支持部分 该核包括支持多达 32 个不同向量的中断或复位源 外设模块提供本地中断使能电路和标志寄存器 更多内容见第五章复位和中断部分 虽然该系列的各个 MCU 的存储映像是不同的, 但是由 HCS08 核内的解码逻辑控制的基本方面是相同的 输入输出端口的寄存器和大多数外设模块控制和状态寄存器的地址起始于 $0000, 并延续到 或 128 字节 这些直接页寄存器的结束地址到地址 $107F 之间的空间被保留给了静态 RAM 存储器 起始于 $1800 的空间预留给高地址页寄存器 它们也都是一些状态和控制寄存器, 但不像直接页寄存器那样需要经常存取 例如, 系统设置寄存器在复位之后只需要写入一次, 可以定在高地址页寄存器空间以便在直接寻址空间为寄存器和 RAM 留出更多的空间 剩下的存储空间从 $1C00 到 $FFFF 预留给 FLASH 或 ROM 最后的 64 个单元 ($FFC0--$FFFF) 作为向量空间 ( 总共 32 个中断和复位向量 ) 1

13 HCS08 系列 MCU 参考手册 ( 第一章通用信息与结构框图 ) 1.2 HCS08 CPU 编程模型 HCS08 CPU 的编程模型见图 1-1 所示, 它包括和 M68HC08 相同的寄存器 其中包括一个 8 位累加器 (A), 一个可分别存取高 8 位和低 8 位的 16 位变址寄存器, 一个 16 位栈指针 (SP), 一个 16 位程序计数器 (PC) 和一个状态码寄存器 (CCR), 该 CCR 包含 个处理器状态标志 (V,H,N,Z 和 C) 和全局中断屏蔽标志 (I) 7 0 H X V 1 1 H I N Z C 累加器 A 变址寄存器 HX 堆栈指针 SP 程序计数器 PC 条件码寄存器 CCR 进位 / 借位标志 C 零标志 Z 负标志 N 中断屏蔽位 I 半进位标志 H 溢出标志 V 图 1-1 CPU 的寄存器 1.3 外设模块 一个特定型号的 MCU 的外设可能是多种多样的, 但是每个型号 MCU 总会包含程序存储器 数据存储器 时钟模块和调试模块 HCS08 系列的一些外设模块包括 : 14K-60K 字节的 FLASH 或 ROM 存储器 K 字节的静态 RAM 3 异步串行输入 / 输出 (SCI) 4 同步串行输入 / 输出 (SPI 和 IIC) 定时器 / 脉宽调制模块 (TPM) 6 键盘中断 (KBI) 7 模数转换器 (ADC) 8 时钟发生模块 : 具备功能齐全的内部时钟发生器 (ICG), 可以脱离外部元件 ( 倍频是用 FLL 完成的, 它不需要任何外部滤波元件 ) 运行 传统的没有 FLL 或 PLL 的皮尔斯振荡器 (OSC) 9 有 9 种触发模式和总线捕捉 FIFO 的调试模块 (DBG) 2

14 HCS08 系列 MCU 参考手册 ( 第一章通用信息与结构框图 ) 关于 HCS08 系列各 MCU 的更多特征信息参考相关的数据手册 1.4 MC9S08GB60 的特点 MC9S08GB60 是 HCS08 系列的首款产品, 在这里将其作为 HCS08 系列 MCU 的一个典型实例介绍如下 HCS08 系列的共性 140-MHz HCS08 CPU( 中央处理器 ) 2HC08 指令集和 BGND 附加指令 3 背景调试系统 4 在线调试时允许单个断点设置 ( 另加片上调试模块的两个断点 ) 调试模块包括两个比较器和九种触发模式 八级深度的 FIFO 用来存储程序流程改变的地址和事件数据 调试模块支持标志符和强制两种断点 6 支持多达 32 个中断 / 复位源 7 低功耗模式 : 等待模式和三种停止模式 8 系统保护特征 : 可选的计算机正常操作 (COP) 复位低电压检测复位或中断非法指令码检测复位非法地址检测复位 ( 有些设备没有非法地址 ) MC9S08GB60 的特点 160K 带块保护和安全机制的可片上在线编程的 FLASH 存储器 24K 片上随机存储器 (RAM) 38 通道,10 位模数转换器 (ATD) 4 两个串行通信接口模块 (SCI) 串行外设接口模块 (SPI) 6 时钟源可选晶体振荡器 陶瓷谐振器 外部时钟或经精确 NVM 校准的内部时钟 7 高达 100 kbps 的 IIC 总线 (IIC) 8 一个 3 通道和一个 通道的 16 位定时器 / 脉宽调制器 (TPM) 模块, 每个通道可以选择输入捕捉 输出比较和边缘对齐 PWM 等功能 每个定时模块的每个通道可配置为带缓冲的中心对齐的脉宽调制 (CPWM) 模式 98 引脚键盘中断模块 (KBI) 1016 个大电流引脚 ( 受封装形式限制 ) 11 端口引脚作为输入时, 可以通过软件设置是否有内部上拉, 端口的每一位都可 3

15 HCS08 系列 MCU 参考手册 ( 第一章通用信息与结构框图 ) 以单独设置, 输出时上拉禁止 12 RESET 和 IRQ 引脚内部上拉可减少用户系统开销 13 6 个通用输入输出引脚 (I/O), 和封装形式有关 引脚薄型方型扁平式封装 (LQFP) 1. MC9S08GB60 的结构框图 图 1-2 是 MC9S08GB60 MCU 的整体结构框图, 显示了所有主要外设系统和所有外设引脚 MC9S08GB60 是 HCS08 系列的典型代表 注 4 RESET IRQ 注 2,3 CPU BDC HCS08 系统控制复位 中断运行模式 电源管理 RTI IRQ HCS08 内核 INT BKP COP LVD 内部总线调试模块 DBG 8 位键盘中断模块 KBI IIC 模块 PORTC PORTB PORTA 8 8 PTA7/KBIP7 PTA0/KBIP0 PTB7/AD7 PTB0/AD0 PTC7 PTC6 PTC PTC4 PTC3/SCL PTC2/SDA PTC1/RxD2 PTC0/TxD2 注 1 注 1,6 注 1, 60KB 片内 Flash 程序存储器 V DDAD V SSAD V REFH V REFL 4KB 片内 RAM 10 位 A/D 转换模块 串行通信接口模块 SCI1 串行通信接口模块 SCI2 定时器接口模块 TIM1 PORTE PORTD PTD7/TPM2CH4 PTD6/TPM2CH3 PTD/TPM2CH2 PTD4/TPM2CH1 PTD3/TPM2CH0 PTD2/TPM1CH2 PTD1/TPM1CH1 PTD0/TPM1CH0 PTE7 PTE6 PTE/SPSCK PTE4/MOSI PTE3/MISO PTE2/SS PTE1/RxD1 PTE0/TxD1 注 1 注 1 内部时钟发生器 低功耗的振荡器 定时器接口模块 TIM2 PORTF 8 PTF7 PTF0 注 1, V DD V SS 电压调节模块 串行外设接口模块 SPI 注 : 1. 端口引脚作为输入时可以通过软件设置选择内部上拉设备 2. 若 IRQ 使能 (IRQPE=1), 引脚包括可软件配置的上下拉设备 3.IRQ 没有通过钳位二极管连向 V DD IRQ 不能加载高于 V DD 的电平 4. 引脚包含集成的上拉设备. 大电流驱动 6.PTA[7:4] 引脚包含可软件配置的上拉 / 下拉设备 图 1-2 MC9S08GB60 结构框图 PORTG PTG7 PTG6 PTG PTG4 PTG3/ PTG2/EXTAL PTG1/XTAL PTG0/BKGD/MS 注 1 4

16 HCS08 系列 MCU 参考手册 ( 第二章引脚及其连接 ) 第二章引脚及其连接 2.1 简介 本章介绍了一些典型应用系统的基本连接方法 另外详细介绍了电源 振荡器 复位 模式和背景接口连接 这里以 HCS08 系列里具有代表性的器件 MC9S08GB60 为例进行介绍 片上外设系统某些引脚是共用的, 所以当某个外设模块不使用其引脚时, 那些引脚可以作为通用的输入 / 输出 (I/O) 引脚来用 当设计系统连接时, 设计者应该考虑到这些引脚复位时的情况, 以及软件配置后这些引脚的特性 例如, 一个串行发送引脚 TxD 在 SCI 发送器使能后将会有一个主动驱动 CMOS 的输出 然而, 在复位到应用软件使能 SCI 发送器的时间里, 该引脚会呈现明显的输入高阻态 虽然通常认为使 CMOS 输入悬空是不可取的, 但是从复位到引脚被重设以实现其他功能的时延非常短, 因此这在大多数应用中几乎没有影响 如果用户确定有影响, 可在该引脚上连接一个外部上拉电阻 2.2 推荐的系统连接 图 2-1 显示了 HCS08 应用系统最典型的引脚连接 MC9S08GB60 是 HCS08 系列最具代表性的, 所以这里以它为例 关于特殊的引脚, 可参考该系列各 MCU 的数据手册, 以得到更详细的信息 比较详细的系统连接如下 :

17 HCS08 系列 MCU 参考手册 ( 第二章引脚及其连接 ) 系统供电 注 1 注 2 BDM 接口 注 2 注 3 应用系统的 I/O 和外围设备接口 手动复位 异步中断输入 注 : 1. 如果使用内部振荡器, 这是不需要的 2. 这两个引脚和 PTG1 PTG2 是相同的引脚 3. BKGD/MS 和 PTG0 是同一引脚 图 2-1 基本系统连接 下面将详细介绍系统连接 6

18 HCS08 系列 MCU 参考手册 ( 第二章引脚及其连接 ) 电源 V DD 和 V SS 是 HCS08 MCU 的主要供电引脚 该电压源对所有的输入 / 输出 (I/O) 缓冲电路和内部电压调节器供电 内部电压调节器向 CPU 和其他 MCU 内部电路提供 2. 伏电压 通常应用系统有两个单独的电容器和电源引脚相连 一个大容量电解电容器, 如 10uF 的钽电容, 用来为全体系统提供大电量存储, 和一个 0.1μF 的陶瓷旁路电容, 尽可能的靠近 MCU 电源引脚, 用以抑制高频噪声 由于亚微米工艺的应用,HCS08 内部逻辑电路所需的供电电压比早期的 MCU 低 除了允许更小的版面之外, 这也给降低系统功耗带来了方便 这意味着片上的电压调节器被用来降低从外部 MCU 提供电压到内部逻辑电压之间的电压 V DDAD 和 V SSAD 也是 MCU 的电源引脚 该电压源给 ATD 提供电压 一个 0.1μF 的陶瓷旁路电容应尽可能靠近 MCU 的这两个电源引脚, 用来抑制高频噪声 MC9S08GB60 振荡器 本节描述 MC9SGB60 内的振荡器 并不是所有该系列的 MCU 都使用相同的振荡器, 有些就没有外部振荡器元件 对于该系列特定 MCU 的信息可以参考其数据手册 MC9S08GB60 可以在没有任何外部晶体振荡器的情况下运行 在这种情况下, 该 MCU 使用内部产生的频率, 相当于大约 8MHz 晶体频率 这个频率源在复位启动时使用, 以避免长时间的晶体启动延时 MC9S08GB60 中的振荡器为传统的皮尔斯振荡器, 它可容纳一个晶体或陶瓷谐振器, 其频率范围可通过 ICGC1 寄存器中的 RANGE 位在两个频率范围里进行选择 低频范围是 32KHz 到 100KHz, 高频范围是 1MHz 到 16MHz 除了晶体或陶瓷谐振器, 频率高达 40MHz 的外部振荡器也能和 EXTAL 输入引脚相连, 但 XTAL 输出引脚必须悬空 下面的讨论将参考图 2-1 R S ( 如果使用 ) 和 R F 应该是低电感的电阻, 如碳合成物电阻 绕线电阻和一些金属薄膜电阻有很大的电感值 C1 和 C2 应该是为高频应用专门设计的高品质陶瓷电容 R F 在晶振启动时被用来提供一个偏压电路以保持 EXTAL 输入在其线性范围内, 它的值通常不是关键的 典型的系统使用 1 MΩ 到 10 MΩ 高值对湿度敏感, 低值减小增益 ( 在特殊情况下 ) 可以阻止启动 C1 和 C2 通常在 pf 到 2pF 的范围内, 并按照要求和特定的晶体和谐振器相匹配 在给 C1 和 C2 选定大小时一定要考虑到 PCB 板电容和 MCU 引脚电容 晶体制造商通常指定一个负载电容, 该电容值应等于 C1 和 C2 的串联值,C1 和 C2 一般选用同样大小的电容 作为首选的近似值, 为每个振荡器引脚 (EXTAL 和 XTAL) 使用约 10pF 的电容作为引脚和 PCB 的连接电容 一般情况下,R S 在 32kHz 到 100kHz 范围时使用 最高到 10KΩ 或征求晶体制造商 7

19 HCS08 系列 MCU 参考手册 ( 第二章引脚及其连接 ) 的意见 通常在 1MHz 到 16MHz 范围里不需要 R S, 可用直接连接代替 复位 并非所有的 HCS08 系列 MCU 都有一个复位引脚 如果没有复位引脚, 可以通过下电上电过程来产生上电复位, 也可以通过使用背景命令向 SBDFR 寄存器写入 BDFR 位, 或者用软件的方法强制产生复位, 例如非法指令码复位 在 MC9S08GB60 中, 复位引脚是一个有上拉电阻的专用引脚 它有输入滞后,10mA 输出驱动, 没有输出摆率控制 因为有内部上电复位和低压复位电路, 所以通常不需要外部的复位电路 这个引脚通常连接到标准 6 引脚的背景调试连接器上, 这样开发系统能够直接复位 MCU 系统 如果需要, 可以通过附加一个简单接地开关手动复位 ( 下拉复位引脚强制复位 ) 每当有复位产生 ( 无论来自外部信号还是来自内部系统 ), 复位引脚被拉低约 4.2μ s, 然后释放, 经过约 4.7μs 后再次采样 如果是内部信号源导致复位, 比如低电压复位或看门狗超时, 电路等待复位引脚采样返回逻辑 1 如果引脚在这个采样点仍然是低, 那么就假定复位来自外部信号源 复位电路解析复位的原因并且在复位状态寄存器 (SRS) 中设置相应的位 不要在复位引脚上接大的电容, 因为那将会干扰检测复位源的电路和时序 如果一个外部电容阻止复位引脚在复位采样点之前上升为有效的逻辑 1, 那么所有复位将被看成外部复位 背景 / 模式选择 (BKGD/MS) 背景 / 模式选择 (BKGD/MS) 引脚包括一个内部上拉设备, 输入滞后, 一个 2mA 输出驱动和无输出摆率控制 若这个引脚没有连接, 则 MCU 在复位的上升沿进入正常的操作模式 如果调试系统被连接到 6 引脚的标准背景调试接口, 它可以在复位上升沿时保持 BKGD/MS 为低, 强制 MCU 进入背景模式 BKGD 引脚主要被背景调试控制器 (BDC) 使用, 它使用约定好的协议进行通信, 该协议使用目标 MCU 的 16 个 BDC 时钟周期来传送每一位 目标 MCU 的 BDC 时钟频率可以达到 20MHz 的总线时钟频率, 因此不要将任何大的电容和 BKGD/MS 引脚相连, 那会干扰背景串行通信 虽然 BKGD 引脚是一个伪开漏引脚, 但是背景调试通信协议提供了简短的, 主动驱动, 高加速脉冲以确保快速上升时间 电缆上的小电容和内部上拉设备的绝对值对判断 BKGD 引脚上上升和下降时间几乎不起任何作用 2.2. 通用 I/O 及外设端口 MC9S08GB60 上的有 6 个引脚是由通用输入 / 输出 (I/O) 和片上外设功能模块所共用, 比如定时器和串行 I/O 系统 复位以后,6 个引脚中除了 PTG0/BKGD/MS, 其他 8

20 HCS08 系列 MCU 参考手册 ( 第二章引脚及其连接 ) 引脚全部配置为高阻通用输入口, 内部上拉设备无效 为了避免来自浮动输入引脚的额外电流, 应用程序中的复位初始化程序应使能片上上拉设备或将闲置引脚的方向改变为输出, 使引脚不浮动 有关使用这些引脚作为通用 I/O 引脚的信息, 或者有关片上外设系统如何以及何时用这些引脚的信息, 请参考特定 MCU 的数据手册 当一个片上外设系统使用一个引脚时, 尽管外设模块通过控制引脚输出缓冲使能来控制引脚方向, 但是数据方向控制位仍决定从端口数据寄存器读出的是什么 当 6 个 I/O 引脚作为输入时, 即使这些引脚被片上外设模块控制, 但是它们的上拉使能位仍然可以控制这些引脚是否有片上的上拉或者下拉设备 有时基于控制位, 上拉电阻被替换成下拉电阻, 就象 MC9S08GB60 键盘中断引脚和 IRQ 引脚 当 PTA7--PTA4 引脚被 MC9S08GB60 中的 KBI 模块控制时, 同时配置为上升沿 / 高电平有效, 上拉使能控制位使能下拉设备而不是上拉设备 同样, 当 MC9S08GB60 的 IRQ 作为输入并设置为检测上升沿, 上拉使能控制位使能下拉设备而不是上拉设备 HCS08 输出有软件控制转换率 这一特性允许用户有效的选择两个大小不同的输出晶体管中的一种 当选定小型号晶体管时, 输出开关转换率较低, 可以降低电磁噪声 当重负载的速率比较重要时可选择大型号晶体管 HCS08 有些输出引脚具有吸收和驱动高电流能力, 每个 I/0 可达 10mA, 但所有 I/O 口电流总和有共限值 9

21 HCS08 系列 MCU 参考手册 ( 第三章工作模式 ) 第三章工作模式 3.1 简介 本章讲述了停止和等待两种低功耗模式, 也对运行模式和与之相对的背景调试模式进行了阐述, 并描述了如何进入和退出各个模式及各个模式的功能 片上电压调节器是 Freescale 的 HCS08 系列 MCU 的新特性 它的最主要功能是从 MCU 的 V 电源提供一个内部 2.V 的逻辑电压 该电压调节器具有待命 通过和低 DD 功耗模式, 被用于让 9S08GB/GT 进入 stop1 stop2 和 stop3 模式 本章还讨论了这些模式和与之相关的功能和寄存器 因为所有 HCS08 系列 MCU 的寄存器和控制位可能有所不同, 所以对于特定的 MCU 应参考数据手册得到更多的信息 3.2 特征 1 普通用户在运行模式下操作 2 用于代码开发的背景调试模式 3 等待模式 : CPU 关闭以节能系统时钟仍然运行维持完全的电压稳压 4 停止模式 : 系统时钟停止 ; 电压调节器待命停止 1: 内部电路的全部断电, 以最大程度节能停止 2: 内部电路的部分断电,RAM 内容保留停止 3: 所有内部电路供电, 以快速恢复单独的周期唤醒时钟能运行在 stop2 和 stop3 模式在 stop3 下振荡器打开可以降低晶振的启动时间 3.3 运行模式 这是 9S08GB/GT 的正常操作模式 当 BKGD/MS 在复位的上升沿时是高电平, 此模式被选择 在此模式下复位之后,CPU 从存储器中的 $FFFE:$FFFF 处取出程序执行的起始地址, 执行内存中的代码 10

22 HCS08 系列 MCU 参考手册 ( 第三章工作模式 ) 3.4 背景调试模式 背景调试模式的功能由 HCS08 核中的背景调试控制器 (BDC,Background Debug Controller) 管理 BDC 和片上调试模块 (DBG) 一起, 提供了在软件运行时分析 MCU 的操作的方法 可通过以下五种方式进入背景调试模式 : 1BKGD/MS 引脚在复位的上升沿时是低电平 2 从 BKGD 引脚接收到 BACKGROUND 命令 3 当执行 BGND 指令时 4 当遇到 BDC 断点时 当遇到 DBG 断点时进入背景调试模式后,CPU 被置于挂起状态, 等待串行背景命令而不是执行用户应用程序的指令 背景命令有两种类型 : 1 非插入命令, 定义为可在用户程序运行时发出的指令 当 MCU 在运行模式下时, 非插入命令可经由 BKGD 引脚发出 当 MCU 在背景调试模式下也可执行非插入命令 非插入命令包括 : 存储器访问命令存储器访问状态命令 BDC 寄存器访问命令 BACKGROUND 命令 2 背景命令, 只有当 MCU 在背景调试模式下才可以执行 背景命令包括以下命令 : 读写 CPU 寄存器单步调试指令离开背景调试模式, 返回用户应用程序 (GO) 背景调试模式通常用于在 MCU 第一次在运行模式下运行之前向 FLASH 存储器写入一个引导程序或者用户应用程序 当 9S08GB/GT 从 Freescale 出厂时,FLASH 存储器默认为擦除的 ( 除非特别指明 ), 在 FLASH 存储器初次编程之前, 由于 FLASH 存储器中没有程序, 因此在运行模式下没有程序可以运行 背景调试模式也可用于在 FLASH 存储器已经写入程序后擦除和重新写入程序 用户可以选择其他通信方式例如片上串行通信接口 (SCI) 来对 FLASH 存储器进行擦除并重新写入 具有代表性的是用户可以编写一个引导程序放在 FLASH 存储区的高地址处, 这个引导程序能够执行普通的用户应用程序 当探测到来自 SCI 的特定顺序的字符或特殊的 I/O 组合信号时, 控制器能通过引导程序对 FLASH 进行擦除写入或者其他的一些调试操作 用户可以决定引导程序的操作, 因为这些操作不是由 Freescale 编写并且写入到 MCU 中的 用户可以根据 MCU 的能力去自由编写这个程序完成任何功能 引导程序 11

23 HCS08 系列 MCU 参考手册 ( 第三章工作模式 ) 或其他应用程序的功能主要是由程序员决定的 更多有关背景调试模式的信息可见第七章开发支持部分 3. 等待模式 执行到 WAIT 指令时, 即可进入等待模式 在执行 WAIT 指令后,CPU 进入没有时钟的低功耗状态 当 CPU 进入等待模式时,CCR 寄存器里面的 I 位将被清零并允许中断 当有中断请求发生,CPU 就会脱离等待模式, 继续正常处理, 从相应的中断服务程序开始运行 在等待模式中可以关闭外设模块节约功耗, 但那些可以产生中断信号将 MCU 从等待模式中唤醒的外设必须是使能的 在等待模式下, 只有 BACKGROUND 命令和存储器访问状态命令可用 虽然存储器访问状态命令不允许访问存储器, 但是它会报出错误来说明 MCU 在停止模式或等待模式 BACKGROUND 命令可用于使 MCU 从等待模式唤醒进入背景调试模式 3.6 停止模式 在系统选择寄存器中的 STOPE 位置位时, 当执行到一个 STOP 指令就进入了三种停止模式中的一种 在所有的停止模式中, 所有的内部时钟被停止 如果 STOPE 位在 CPU 执行 STOP 指令时没有置位,MCU 将不会进入任何停止模式, 并强制产生一个非法指令复位 可以通过设置 SPMSC2 里的相应标志位来选择进入哪种停止模式 表 3-1 总结了 MCU 在每种停止模式下的行为 表 3-1 停止模式下的行为 模式 CPU, 数字外设,FLASH RAM 时钟模块 ATD KBI 电压调节器 I/O RTI STOP1 关关关不可用关关复位关 STOP2 关待命关不可用关待命 STOP3 待命待命待命 (1) 不可用可选开待命 (1) STOP3 模式下晶振可以设置为运行, 参见 ICG 寄存器 维持状态维持状态 可选开可选开 正常情况下,IRQ 和键盘中断的中断信号输入路径通过同步时钟逻辑传输 因为在停止模式下 MCU 没有有效时钟信号, 所以这些同步器是旁路的, 所有 Stop 模式下的 IRQ 和 Stop3 模式下的 KBI 的异步输入可将 MCU 从 Stop 模式唤醒 表 3-2 总结了 stop1 stop2 stop3 的配置和退出条件 表 3-2 停止模式的选择和退出条件 SPMC2 的配置模式退出源退出后的情况 PDC PPDC 12

24 HCS08 系列 MCU 参考手册 ( 第三章工作模式 ) STOP1 1 0 IRQ 或复位 POR STOP2 1 1 IRQ 复位或 RTI POR(SPMSCR 中的 PPDF 位置位 ) STOP3 0 任意 1. 所有情况下 POR 是有效的退出 IRQ 复位 RTI 或 KBI 复位或者从中断向量表中某个中断服务程序执行 Stop1 模式 STOP1 模式通过使 MCU 内部电路断电来提供最低可能的功耗 为了进入 STOP1 模式, 在执行 STOP 指令之前必须将 SPMSC2 的 PDC 位置 1 和 PPDC 位清 0 当 MCU 处于 STOP1 模式下时, 所有由电压调节器供电的内部电路都是关闭的 电压调节器处于低功耗待命状态, 就像 ATD 模块一样 通过 MCU 的唤醒引脚 (RESET 或者 IRQ) 可离开 STOP1 模式 不管在进入 STOP1 模式之前 IRQ 是如何设置的, 它在 STOP1 模式下总是低电平输入有效 进入 STOP1 自动使能 LVD 在 VDD >V LVDH/L 之前, 不能离开 STOP1 模式 ( V DD 必需升到高于 LVI 重启电压 ) 当从 STOP1 模式中被唤醒后,MCU 将以类似上电复位的方式启动 CPU 将取复位向量 Stop2 模式 STOP2 模式提供非常低的能保持 RAM 内容和所有 I/O 端口状态的待命功耗 为了进入 STOP2 模式, 在执行 STOP 指令前必须将 SPMSC2 的 PDC 位和 PPDC 位置 1 进入 STOP2 模式之前, 用户可以在 RAM 中保存 I/O 口寄存器的内容, 和其它想在退出 STOP2 模式后恢复的寄存器的内容 在离开 STOP2 模式后, 这些内容可在闭锁的端口开放之前被用户软件恢复 当 MCU 处于 STOP2 模式下时, 所有由电压调节器供电的内部电路都是关闭的, 除了 RAM 电压调节器处于低功耗待命状态, 就像 ATD 模块一样 进入 STOP2 模式后,I/O 端口的状态被锁定 这些状态将在 STOP2 模式中被保持, 直到在退出 STOP2 模式后 SPMSC2 寄存器中的 PPDACK 标志位被写 1 通过 MCU 的唤醒端口 (RESET 或者 IRQ) 或者 RTI 中断可离开 STOP2 模式 不管在进入 STOP2 之前 IRQ 是如何设置的, 它在 STOP2 模式下总是低电平输入有效 当用 RTI 唤醒时, 实时中断的单独时钟源 ( 约等于 1KHz) 允许在没有额外元件的情况下将 MCU 从 STOP2 或 STOP3 模式唤醒 当 RTIS2:RTIS1:RTIS0=0:0:0 时, 实时中断功能和 1KHz 时钟源被禁止 当 1KHz 时钟源被禁止时, 功耗更低 当从 STOP2 模式中被唤醒后,MCU 将以类似上电复位的方式启动, 但是端口状态仍然保持锁定 CPU 将取复位向量 系统和所有外设将处于它们的默认复位状态, 且 13

25 HCS08 系列 MCU 参考手册 ( 第三章工作模式 ) 必须被初始化 从 STOP2 模式中唤醒之后 SPMSC2 寄存器中的 PPDF 标志位将置位 该标志位也许用于指示用户代码执行 STOP2 恢复程序 PPDF 保持置位并且 I/O 端口状态保持闭锁, 直到 SPMSC2 寄存器中的 PPDACK 标志位写 1 为保持设置为通用 I/O 引脚的状态, 在向 PPDACK 标志位写入之前, 用户必须用存储在 RAM 中的 I/O 端口寄存器中的内容来恢复端口寄存器 如果在写入 PPDACK 之前, 没有从 RAM 恢复端口寄存器, 当 I/O 端口闭锁打开后,I/O 端口转换成复位状态时, 寄存器中的内容将是它们的复位默认状态的值 对于设置为外设 I/O 口的引脚, 在向 PPDACK 标志位写入之前, 用户必须重新配置外设模块的接口引脚 如果在写入 PPDACK 之前, 外设模块不可用, 当 I/O 端口闭锁打开时, 端口将被它们的相关端口控制寄存器控制 Stop3 模式 进入 STOP3 模式后, 所有 MCU 的时钟 包括振荡器本身都停止了 时钟模块 (ICG), 电压调节器和 ATD 都在待命状态 所有内部寄存器和逻辑, 也包括 RAM 的内容都被保持 I/O 端口的状态不像 STOP2 模式中一样被锁定 取而代之的是, 为了保持它们的状态, 可以使用内部逻辑 退出 STOP3 模式的方法有 : 复位 RESET, 一个异步中断引脚, 或者通过实时中断 异步中断引脚是 IRQ 或 KBI 引脚 如果通过 RESET 退出 STOP3 模式,MCU 将复位, 并从复位向量处执行 如果通过异步中断或实时中断退出,MCU 将从相应的中断向量处执行 实时中断的单独时钟脉冲源 ( 约等于 1KHz) 允许在没有额外部件的情况下将 MCU 从 STOP2 或 STOP3 模式唤醒 当 RTIS2:RTIS1:RTIS0=0:0:0, 实时中断功能和 1kHz 的时钟源不可用 当 1kHz 的时钟源不可用时, 功耗更低, 但此种情况下实时中断不可以将 MCU 从 STOP 模式中唤醒 停止模式下激活 BDM 使能 如果 BDCSCR 寄存器里的 ENBDM 标志位被置位, 从运行模式进入背景调试模式是可能的 BDCSCR 寄存器将在第七章开发支持部分介绍 如果当 CPU 执行 STOP 指令时,ENBDM 被置位, 这样当 MCU 进入到停止模式后背景调试逻辑的系统时钟仍然在工作, 所以背景调试的通信仍然是可以的 另外电压调节器没有进入低功耗待命状态, 而是在满负荷工作中 如果用户尝试通过置 ENBDM 位进入 STOP1 或 STOP2 模式, MCU 会进入到 STOP3 模式而不是 STOP1 或 STOP2 模式 大部分背景命令在停止模式下不可用 存储器存取状态指令不允许存储器存取, 但它们会报告一个错误标志, 标志 MCU 在停止或等待模式 如果 ENBDM 置位, BACKGROUND 指令可以用于将 MCU 从停止模式中唤醒进入背景调试模式 一旦设备进入背景调试模式, 所有背景命令都可用 表 3-3 总结了当 MCU 在进入 STOP 时背 14

26 HCS08 系列 MCU 参考手册 ( 第三章工作模式 ) 景调试模块使能的情况下 MCU 的行为 表 3-3 当 MCU 在进入 STOP 时背景调试模块使能的情况下 MCU 的行为 模式 PDC PPDC CPU, 数字外设,FLASH RAM 时钟模块 ATD 电压调节器 I/O 引脚 RTI STOP3 任意任意待命待命活跃不可用活跃状态保持任意开 3.6. 设置 OSCSTEN 位 在 STOP 模式下振荡器使能时 (OSCSTEN=1), 独立时钟发生器是可用的但供应给 MCU 其他部分的时钟是关闭的 在必要时, 这种选择可以避免长时间的振荡器启动 停止模式下 LVD 使能 当供应电压下降到 LVD 电压值以下时,LVD 系统能够产生中断或复位 当 CPU 执行到 STOP 指令时, 如果此时已经通过置 SPMSC1 寄存器中的 LVDE 和 LVDSE 位使得 LVD 有效, 则在停止模式下电压调节器仍然保持工作 当 LVD 可用时 (LVDSE=1), 用户尝试进入 STOP1 或 STOP2 模式,MCU 会进入到 STOP3 模式而不是 STOP1 或 STOP2 模式 以下表格总结了 MCU 在启用 LVD 的 STOP 模式下的行为 表 3-4 MCU 在启用 LVD 的 STOP 模式下的行为 模式 PDC PPDC CPU 数字外设 FLASH RAM 时钟模块 ATD 电压调节器 STOP3 任意任意待命待命待命不可用活跃状态保持任意开 I/O RTI 停止模式下的片上外设模块 当 MCU 进入任何停止模式, 内部外设模块的系统时钟会停止 即使在例外情况下 (ENBDM=1), 背景调试逻辑的时钟继续工作, 外设的时钟也被停止以减少功耗 见 STOP1 模式 STOP2 模式 STOP3 模式以获得停止模式下系统行为的更多信息 此处提供的信息适用于 MC9S08GB60 关于其他 MCU 的信息请参考相关的数据手册 I/O 引脚 : 1 当 MCU 在 STOP3 模式下, 所有 I/O 端口状态保持不变 2 如果 MCU 配置为进入 STOP2 模式, 所有 I/O 端口状态在进入停止模式前锁定 3 如果 MCU 配置为进入 STOP1 模式, 所有 I/O 端口在进入停止模式后将强制设置成复位以后的默认状态 存储器 : FLASH 存储器的内容在任何 STOP 模式下都不可改变并且被保存 1 所有 RAM 和寄存器内容在 STOP3 模式下都是被保存的 1

27 HCS08 系列 MCU 参考手册 ( 第三章工作模式 ) 2 从 STOP2 模式下唤醒后, 所有寄存器都将复位, 但 RAM 内容保持, 端口状态保持锁定直到 PPDACK 位被写入 用户可以在进入 STOP2 模式之前, 将寄存器的内容保存在 RAM 中, 并在离开 STOP2 模式后恢复这些数据 3 从 STOP1 模式下唤醒后, 所有寄存器都将复位,RAM 内容不被保存 MCU 必须在复位后初始化 ICG 在 STOP3 模式下,ICG 进入低功耗待命状态 当 ICG 在待命状态时, 通过设置适当的控制位 (OSCSTEN), 外部振荡器和内部参考时钟都可以保持工作 在 STOP1 和 STOP2 模式下,ICG 是关闭的 即使在进入停止模式前被使能, 外部振荡器和内部参考时钟均不能在 STOP1 和 STOP2 下工作 从 STOP1 和 STOP2 模式退出时 ICG 必须象上电复位一样进行初始化 ICG 内的数控制振荡器 (DCO) 保持当前的频率设置, 当从 STOP3 模式恢复时允许最快频率锁定 CPU 进入停止模式后,CPU 时钟和操作都停止 如果电压调节器没有被设置为进入掉电模式并且某个中断将 CPU 从 STOP 模式唤醒后,CPU 时钟恢复并且转到中断服务程序执行 当执行 RTI 指令从中断返回时,CPU 执行紧跟着 STOP 指令的那条指令 如果电压调节器掉电或者复位将 MCU 从 STOP 模式唤醒, 通过取得复位向量恢复运行 TPM 当 MCU 进入停止模式时,TPM1 和 TPM2 模块的时钟停止 模块停止工作 如果 MCU 配制成进入 STOP2 或 STOP1 模式, 当从停止模式唤醒以后 TPM 模块被复位并且必须被重新初始化 ATD 当 MCU 进入停止模式时,ATD 将进入低功耗待命状态 在停止模式中, 转换操作不能执行 如果 MCU 配置为进入 STOP2 或者 STOP1 模式, 当从停止模式唤醒以后 ATD 模块被复位并且必须被重新初始化 KBI 在 STOP3 模式中,KBI 引脚仍然可用, 并且作为一个中断源可以将 MCU 从 STOP3 模式唤醒 KBI 在 STOP1 和 STOP2 中不可用, 当从这两种模式中的任一个模式唤醒时,KBI 模块必须重新初始化 SCI 注意避免当 SCI 通信进行时进入停止模式 因为时钟停止, 任何正在进行的串行传送都被停止, 从而导致通信失败 MCU 停止时就不会收到任何 SCI 字节 当 MCU 进入停止模式时,SCI1 和 SCI2 的时钟停止 模块停止操作 如果 MCU 配置为进入 STOP2 或者 STOP1 模式, 当从停止模式唤醒以后 SCI 模块被复位并且必须被重新初始化 SPI 通常不在 SPI 通信进行时进入停止模式 当时钟停止时, 任何进行中的串行传输都会停止 因为 SPI 是一个同步的串行通信接口, 没有最低通信速度的限制 虽然通常不如此使用, 进入停止模式时正在进行的传输可以在停止唤醒后恢复 当 MCU 停止时 SPI 的传输不能完成 当 MCU 进入停止模式时,SPI 的时钟停止 模块停止操作 如果 MCU 配置为进入 STOP2 或者 STOP1 模式, 当从停止模式唤醒以后 SPI 模块被复位并且必须被重新初始化 IIC 当 MCU 进入停止模式时,IIC 的时钟停止 模块停止操作 如果 MCU 配 16

28 HCS08 系列 MCU 参考手册 ( 第三章工作模式 ) 置为进入 STOP2 或者 STOP1 模式, 当从停止模式唤醒以后 IIC 模块被复位并且必须被重新初始化 电压调节器 当 MCU 进入任何停止模式时, 电压调节器将进入低功耗待命状态, 除非 LVD 在停止模式下使能或者 BDM 使能 系统选择寄存器 (SOPT) 本寄存器能在任何时候读取 第 2,3 位无效, 读时为 0 这是一个一次性写入的寄存器所以只有在复位后第一次写入才是有效的 任何后来的对 SOPT 的写入都被忽略以避免敏感设置的意外改变 在用户的复位初始化程序中,SOPT 应该被设置, 以得到希望的控制, 即使希望的设置和默认设置一致 第 7 位 第 0 位读 : COPE (1) COPE (1) STOPE (1) 0 0 (2) BKGDPE (2) 写 : (2) (2) 复位 : (1) 这一位只能在复位后被写一次 再次写入会被忽略 (2) 未定义或预留 COPE COP 看门狗使能这个一次性写入位在复位后默认值为逻辑 1 该位和运行模式没有直接的关系 它被放在这里说明只是因为该寄存器的一些位在复位后只能写一次 1 = 允许 COP 看门狗 ( 超时强制复位 ) 0 = 禁止 COP 看门狗 COPT COP 看门狗超时时间选择这个一次性写入位在复位后设置成逻辑 1 该位和运行模式没有直接的关系 它被放在这里说明只是因为该寄存器的一些位在复位后只能写一次 1 = 长超时时间选择 (2 18 总线时钟周期 ) 0 = 短超时时间选择 (2 13 总线时钟周期 ) STOPE 停止模式使能这个一次性写入位在复位后设置成逻辑 0, 使得停止模式不可用 如果在停止模式不可用的情况下, 用户程序执行 STOP 指令, 将会产生非法操作码复位 1 = 允许停止模式 0 = 禁止停止模式 BKGDPE 背景调试模式引脚使能 BKGDPE 位可以使 PTD0/BKGD/MS 引脚作为 BKGD/MS 功能使用 当此位清 0 时, 引脚作为 PTD0 使用, 是一个只有输入功能的通用 I/O 口 这个引脚在复位后默认作为 BKGD/MS 功能使用 1 = 允许 BKGD 引脚 0 = 禁止 BKGD 引脚 17

29 HCS08 系列 MCU 参考手册 ( 第三章工作模式 ) 系统电源管理状态和控制寄存器 1(SPMSC1) 第 7 位 第 0 位读 : LVDF 0 0 LVDIE LVDRE(1) LVDSE(1) LVDE(1) 写 : (2) LVDACK (2) (2) 复位 : (1) 这一位只能在复位后被写一次 再次写入会被忽略 (2) 未定义或预留 LVDF 低电压检测标志如果 LVDE=1, 这个只读状态位表明低电压检测事件 该位和运行模式没有直接的关系 它被放在这里说明只是因为该寄存器的一些位在复位后只能写一次 LVDACK 低电压检测确认这个只写位用来响应低电压检测事件 ( 向该位写 1 可以清 LVDF 位 ) 读这位总是返回逻辑 0 该位和运行模式没有直接的关系 它被放在这里说明只是因为该寄存器的一些位在复位后只能写一次 LVDIE 低电压检测中断使能该读 / 写位允许 LVDF 产生硬件中断请求 该位和运行模式没有直接的关系 它被放在这里说明只是因为该寄存器的一些位在复位后只能写一次 1 = 当 LVDF=1 时, 产生硬件中断请求 0 = 硬件中断无效 ( 使用查询 ) LVDRE 低电压检测复位使能该读 / 写位允许 LVDF 事件产生硬件复位 ( 当 LVDF=1 时 ) 该位和运行模式没有直接的关系 它被放在这里说明只是因为该寄存器的一些位在复位后只能写一次 1 = 强制 MCU 复位 0 = 不产生 MCU 复位 LVDSE 低电压检测停止使能当 LVDE=1 时, 该读 / 写位决定停止模式下低电压检测功能是否可用 该位和运行模式没有直接的关系 它被放在这里说明只是因为该寄存器的一些位在复位后只能写一次 1 = 停止模式时允许低电压检测 0 = 停止模式时禁止低电压检测 LVDE 低电压检测使能该读 / 写位使能低电压检测逻辑, 并指定寄存器中其它位的作用 该位和运行模式没有直接的关系 它被放在这里说明只是因为该寄存器的一些位在复位后只能写一次 1 = 允许 LVD 逻辑 0 = 禁止 LVD 逻辑 18

30 HCS08 系列 MCU 参考手册 ( 第三章工作模式 ) 系统电源管理状态和控制寄存器 2(SPMSC2) 该寄存器用于报告低电压警告功能的状态, 和配置 MCU 在停止模式的行为 第 7 位 第 0 位 读 LVWF 0 PPDF 0 LVDV LVWV 写 (2) LVDACK (2) PPDACK PDC PPDC 电源复位 0(1) LVD 复位 0(1) 0 U U 其他复位 0(1) 0 U U (1) 当 V Supply 转变到临界点以下 或复位后 V Supply 已经低于 V LVW. 的情况下,LVWF 会置位 (2) 未定义或预留 (3)U= 复位不影响 LVWF 低电压警告标志 LVWF 位显示低电压警告状态 该位和运行模式没有直接的关系 它被放在这里说明只是因为该寄存器的一些位在复位后只能写一次 1 = 低压警告正在发生或已经发生过 0 = 低压警告没有发生 LVWACK 低电压警告响应该 LVWACK 位显示低电压警告状态 该位和运行模式没有直接的关系 它被放在这里说明只是因为该寄存器的一些位在复位后只能写一次 如果当前没有低电压警告状态, 向该位写逻辑 1 将清 LVWF 位 LVDV 低电压检测电压选择该 LVDV 位选择 LVD 触发电压 (V LVD ) 该位和运行模式没有直接的关系 它被放在这里说明只是因为该寄存器的一些位在复位后只能写一次 1 = 选择高触发电压 (3V 系统 ) 0 = 选择低触发电压 (2V 系统 ) LVWV 低电压警告电压选择该 LVWV 位选择 LVW 触发电压 (VLVW) 该位和运行模式没有直接的关系 它被放在这里说明只是因为该寄存器的一些位在复位后只能写一次 1 = 选择高触发电压 (3V 系统 ) 0 = 选择低触发电压 (2V 系统 ) PPDF 部分掉电标志 PPDF 位标识 MCU 部分掉电退出停止 2 模式 1 = 从停止 2 模式恢复 0 = 没有从停止 2 模式恢复 PPDACK 部分掉电响应向该位写 1 清 PPDF 位 PDC 低功耗控制这个一次性写入位控制是否允许进入低功耗模式 ( 停止 1 和停止 2) 19

31 HCS08 系列 MCU 参考手册 ( 第三章工作模式 ) 1 = 允许低功耗模式 0 = 禁止低功耗模式 PPDC 部分掉电控制这个一次性写入位控制进入哪一种低功耗模式 ( 停止 1 或停止 2) 1 = 当 PDC 位置位时, 进入 Stop2 模式, 部分低功耗 0 = 当 PDC 位置位时, 进入 Stop1 模式, 完全低功耗表 3- 停止模式的选择和退出源 模式 PDC SPMC2 设置 PPDC 退出源 退出后的操作 Stop1 1 0 IRQ 或复位 POR Stop2 1 1 IRQ, 复位或 RTI POR(SPMSCR 寄存器中的 PPDF 置位 ) Stop3 0 任意 IRQ, 复位 RTI, 或 KBI 如果是复位, 那么操作是 POR; 否则正常的操作是从中断向量表执行 20

32 HCS08 系列 MCU 参考手册 ( 第四章片上存储器 ) 第四章片上存储器 4.1 简介 本节主要介绍全部 64K 字节存储器的组织, 并详细的介绍各个主要的存储区 1 直接页寄存器, 高地址页寄存器和非易失性寄存器列在表格中, 其中主要介绍寄存器名字 绝对地址和寄存器中控制及状态位的安排 2RAM 主要介绍系统堆栈指针的初始化 3FLASH 主要介绍擦除, 写入操作和块保护 4 安全机制主要介绍如何保护内部的 FLASH 和 RAM, 防止未授权的访问 寄存器描述部分主要解释了与 FLASH 存储模块相关的控制和状态位 4.2 HCS08 核定义的存储器组织 在 HCS08 的体系结构中, 内核在 64K 字节存储空间内为 6 个主要块指定地址解码 片上存储器模块使用这些块解码信号作为模块选择 各个外设模块的基地址是由系统综合模块里附加的解码逻辑决定的, 它为每个外设模块定义一个地址块 然后外设利用这个模块选择和附加的低位地址线为每个在模块里的寄存器提供选择信号 HCS08 存储器组织 表 4-1 列出了由 HCS08 核定义的 个主要的存储空间 对于特定的 MCU 参考其 数据手册取得关于每个块的大小和分界线的精确信息 节介绍了 HCS08 系列 MCU 的典型代表 MC9S08GB60 的存储器组织 表 4-1 HCS08 核定义的存储空间 名称 地址 注释 直接页寄存器 $0000 $00xx 128 字节 RAM $00xx 包括一些直接页的位置 高地址页寄存器 $1800 $18yy 系统配置 FLASH 存储空间 $FFFF 60K 字节 向量区 $FFC0 $FFFF 64 字节 直接页寄存器主要包括 I/O 端口寄存器和大部分的外设控制和状态寄存器 把这些 寄存器放在直接页可以方便得用 BSET BCLR BRSET 和 BRCLR 这些指令对这些寄 21

33 HCS08 系列 MCU 参考手册 ( 第四章片上存储器 ) 存器的任意位进行诸如置位 清零或测试等操作 相对于其他指令的扩展寻址方式, 使用这些指令的直接寻址方式访问这些寄存器可以有效的节省程序空间和执行时间 RAM 区的地址紧接在直接页寄存器地址的后面并且向高地址延伸 例如, 在 MC9S08GB60 中, 直接页寄存器位于地址 $0000-$007F, 而 4096 字节的 RAM 地址则位于 $0080-$107F 由于 RAM 存储空间中包含一部分的直接页地址, 因此, 对于经常使用的程序变量, 应当尽量安排在 RAM 存储空间中的直接页地址中, 这样当执行许多指令时就可以使用直接寻址方式, 能够减少程序的代码长度和执行时间 同样, 由于位处理指令只支持直接寻址方式, 所以该段地址支持可位操作的 RAM 变量 高地址页寄存器位于 $1800 到 $182B 由于这些寄存器比直接页寄存器的使用频率要少的多, 所以它们没有安排在珍贵的直接页地址空间中 这个地址空间包含一些系统配置寄存器, 如看门狗和低电压检测 调试模块寄存器和 FLASH 模块寄存器 在所有的 HCS08 系列的 MCU 中, 有几个高地址页寄存器必须安排在相同的地址 $1801 地址处的寄存器 SBDFR 包含 BDFR 控制位, 这个控制位允许背景调试的主机通过一系列连续的命令来复位 MCU 在地址是 $1806:$1807 的寄存器 SDIDH:SDIDL 中有一个设备识别号 这些寄存器允许一个主机调试系统检测 HCS08 的类型和掩模组号 此信息使调试主机知道目标 MCU 的存储器类型和大小 寄存器的名字 位名和地址 FLASH 存储器分配 64K 字节的存储空间最终分配到地址 $FFFF 这一块的起始地址取决于 MCU 有多少 FLASH 存储空间 例如, 包含 16K 字节的 FLASH, 则 FLASH 的地址范围是 $C000-$FFFF 如果 FLASH 存储器区和高地址页寄存器存储区域有重合的地方, 则寄存器区有优先权, 所以 FLASH 在冲突区域的地址是不能被访问的 这种情况只发生在 FLASH 超过 7K 字节的时候 向量区是 FLASH 区的一部分, 位于 $FFC0-$FFFF, 但是它是单独解码的, 所以当中断向量取出时别的 HCS08 模块可以识别出来 有些 HCS08 的芯片还有其他的地址区域, 如非易失性寄存器区和无效地址区 这些区域在系统集成模块中解码而不是在内核中 MC9S08GB60 存储映像 这一节描述 MC9S08GB60 存储映像, 每个 HCS08 系列 MCU 的数据手册提供了相似的信息来解释每个 HCS08 系列 MCU 的存储映像的详细信息 如图 4-1 所示,MC9S08GB60 的片上存储器由 RAM FLASH 输入/ 输出和控制 / 状态寄存器组成 这些寄存器分成三组 : 1 直接页寄存器 ($0000-$007F) 2 高地址页寄存器 ($1800-$182B) 3 非易失性寄存器 ($FFB0-$FFBF) 复位和中断向量位于 $FFCC 到 $FFFF 区域 如果 CPU 试图访问数据或者执行一个指令, 而这些数据和指令位于 64K 存储空间中的非法地址区域中, 对于这种情况, 有 22

34 HCS08 系列 MCU 参考手册 ( 第四章片上存储器 ) 些芯片有一个非法地址检测功能来强制 MCU 复位 背景调试模式 (BDM) 的访问不会引起非法访问错误 在 MC9S08GB60 中所有的 64K 字节的存储区域都用在了寄存器和存储器上, 所以不存在非法地址区域 寄存器区中未定义的保留区不会被认为是非法地址, 也不触发非法地址错误复位 $0000~$007F 128 字节的直接页寄存器区 $0080~$107F 4096 字节的 RAM 区 $1080~$17FF 1920 字节 FLASH 区 $1800~$182B $182C~$FEEF 高地址页寄存器区 9268 字节 FLASH 用户区 $FEB0~$FFBF $FFC0~$FFFF 16 字节非易失性寄存器区 64 字节 FLASH 向量区 图 4-1 MC9S08GB60 存储映像图 共 9348 字节 FLASH 区 复位和中断向量表 表 4-2 给出了 MC9S08GB60 的复位与中断向量的地址分配, 至于其他 HCS08 系列 MCU 的向量名字和地址分配, 请参考相关的数据手册 表中所示向量名是 Freescalse 公司提供的 MC9S08GB60 文档中给出的名字 有关复位 中断 中断优先权和中断屏蔽控制的详细信息, 请参阅第 章复位和中断 表 4-2 MC9S08GB60 复位和中断向量表地址 ( 高 / 低 ) 向量向量名称 $FFC0:FFC1 $FFCA:FFCB 不用的向量空间 ( 可用于用户程序 ) $FFCC:FFCD RTI Vrti $FFCE:FFCF IIC Viic1 $FFD0:FFD1 ATD 模数转换 Vatd1 $FFD2:FFD3 Keyboard 键盘 Vkeyboard1 $FFD4:FFD SCI2 发送 Vsci2tx $FFD6:FFD7 SCI2 接收 Vsci2rx 23

35 HCS08 系列 MCU 参考手册 ( 第四章片上存储器 ) $FFD8:FFD9 SCI2 错误 Vsci2err $FFDA:FFDB SCI1 发送 Vsci1tx $FFDC:FFDD SCI1 接收 Vsci1rx $FFDE:FFDF SCI1 错误 Vsci1err $FFE0:FFE1 SPI Vspi1 $FFE2:FFE3 TPM2 溢出 Vtpm2ovf $FFE4:FFE TPM2 通道 4 Vtpm2ch4 $FFE6:FFE7 TPM2 通道 3 Vtpm2ch3 $FFE8:FFE9 TPM2 通道 2 Vtpm2ch2 $FFEA:FFEB TPM2 通道 1 Vtpm2ch1 $FFEC:FFED TPM2 通道 0 Vtpm2ch0 $FFEE:FFEF TPM1 溢出 Vtpm1ovf $FFF0:FFF1 TPM1 通道 2 Vtpm1ch2 $FFF2:FFF3 TPM1 通道 1 Vtpm1ch1 $FFF4:FFF TPM1 通道 0 Vtpm1ch0 $FFF6:FFF7 ICG Vicg $FFF8:FFF9 低电压检测 Vlvd $FFFA:FFFB IRQ Virq $FFFC:FFFD SWI Vswi $FFFE:FFFF RESET Vreset 4.3 寄存器地址和位分配 MC9S08GB60 中的寄存器分为以下三组 : 1 直接页寄存器位于存储空间前 128 字节处, 所以可由高效的直接寻址指令访问 2 高地址页寄存器较少被使用, 所以它们位于存储器的 $1800 地址之后, 这样就可以在直接页中留出更多的空间给经常使用的寄存器和变量 3 非易失性寄存器 ($FFB0-$FFBF) 由 FLASH 存储器中位于 $FFB0 $FFBF 地址处 24

36 HCS08 系列 MCU 参考手册 ( 第四章片上存储器 ) 的 16 个位置组成 非易失性寄存器的位置包括 : 在复位时加载到工作寄存器的两个值 用户可以使用一个 8 字节的密码取得加密存储器的使用访问权 在 Freescale 最后的测试中, 存储在保留区域中的一些调整值 因为非易失性寄存器是存储在 FLASH 存储器中的, 所以它必须像其他的 FLASH 存储器那样擦除和写入 直接页寄存器可以被高效的直接寻址方式指令访问 位操作指令可用于访问直接页 寄存器中的任何一位 表 4-3 总结了所有用户可访问的直接页寄存器及其控制位 表 4-3 中的寄存器可以使用比较高效的直接寻址方式访问, 这种方式只需要地址的 低位字节 因此, 第一纵列中地址的低位字节用粗体字表示 表 4-4 和表 4- 中, 第一 纵列中完整的地址用粗体字表示 表 4-3,4-4,4- 中, 第二纵列的寄存器的名称亦用 粗体字表示, 以与右边的字节名称区分 没有定义的字节单元格以阴影表示 有 0 的阴 影单元格表示不使用的字节总是读作 0 有横线的阴影单元格表示不使用或保留的字 节, 可以读作 1 或 0 表 4-3 直接页寄存器概述 地址 寄存器名称 Bit 7 Bit 6 Bit Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 $0000 PTAD PTAD7 PTAD6 PTAD PTAD4 PTAD3 PTAD2 PTAD1 PTAD0 $0001 PTAPE PTAPE7 PTAPE6 PTAPE PTAPE4 PTAPE3 PTAPE2 PTAPE1 PTAPE0 $0002 PTASE PTASE7 PTASE6 PTASE PTASE4 PTASE3 PTASE2 PTASE1 PTASE0 $0003 PTADD PTADD7 PTADD6 PTADD PTADD4 PTADD3 PTADD2 PTADD1 PTADD0 $0004 PTBD PTBD7 PTBD6 PTBD PTBD4 PTBD3 PTBD2 PTBD1 PTBD0 $000 PTBPE PTBPE7 PTBPE6 PTBPE PTBPE4 PTBPE3 PTBPE2 PTBPE1 PTBPE0 $0006 PTBSE PTBSE7 PTBSE6 PTBSE PTBSE4 PTBSE3 PTBSE2 PTBSE1 PTBSE0 $0007 PTBDD PTBDD7 PTBDD6 PTBDD PTBDD4 PTBDD3 PTBDD2 PTBDD1 PTBDD0 $0008 PTCD PTCD7 PTCD6 PTCD PTCD4 PTCD3 PTCD2 PTCD1 PTCD0 $0009 PTCPE PTCPE7 PTCPE6 PTCPE PTCPE4 PTCPE3 PTCPE2 PTCPE1 PTCPE0 $000A PTCSE PTCSE7 PTCSE6 PTCSE PTCSE4 PTCSE3 PTCSE2 PTCSE1 PTCSE0 $000B PTCDD PTCDD7 PTCDD6 PTCDD PTCDD4 PTCDD3 PTCDD2 PTCDD1 PTCDD0 $000C PTDD PTDD7 PTDD6 PTDD PTDD4 PTDD3 PTDD2 PTDD1 PTDD0 $000D PTDPE PTDPE7 PTDPE6 PTDPE PTDPE4 PTDPE3 PTDPE2 PTDPE1 PTDPE0 $000E PTDSE PTDSE7 PTDSE6 PTDSE PTDSE4 PTDSE3 PTDSE2 PTDSE1 PTDSE0 $000F PTDDD PTDDD7 PTDDD6 PTDDD PTDDD4 PTDDD3 PTDDD2 PTDDD1 PTDDD0 $0010 PTED PTED7 PTED6 PTED PTED4 PTED3 PTED2 PTED1 PTED0 $0011 PTEPE PTEPE7 PTEPE6 PTEPE PTEPE4 PTEPE3 PTEPE2 PTEPE1 PTEPE0 $0012 PTESE PTESE7 PTESE6 PTESE PTESE4 PTESE3 PTESE2 PTESE1 PTESE0 $0013 PTEDD PTEDD7 PTEDD6 PTEDD PTEDD4 PTEDD3 PTEDD2 PTEDD1 PTEDD0 $0014 IRQSC 0 0 IRQEDG IRQPE IRQF IRQACK IRQIE IRQMOD $001 保留 $0016 KBI1SC KBEDG7 KBEDG6 KBEDG KBEDG4 KBEDG3 KBEDG2 KBEDG1 KBEDG0 $0017 KBI1PE KBIPE7 KBIPE6 KBIPE KBIPE4 KBIPE3 KBIPE2 KBIPE1 KBIPE0 $0018 SCI1BDH SBR12 SBR11 SBR10 SBR9 SBR8 $0019 SCI1BDL SBR7 SBR6 SBR SBR4 SBR3 SBR2 SBR1 SBR0 2

37 HCS08 系列 MCU 参考手册 ( 第四章片上存储器 ) $001A SCI1C1 LOOPS SCISWAI RSRC M WAKE ILT PE PT $001B SCI1C2 TIE TCIE RIE ILIE TE RE RWU SBK $001C SCI1S1 TDRE TC RDRF IDLE OR NF FE PF $001D SCI1S RAF $001E SCI1C3 R8 T8 TXDIR 0 ORIE NEIE FEIE PEIE $001F SCI1D Bit Bit 0 $0020 SCI2BDH SBR12 SBR11 SBR10 SBR9 SBR8 $0021 SCI2BDL SBR7 SBR6 SBR SBR4 SBR3 SBR2 SBR1 SBR0 $0022 SCI2C1 LOOPS SCISWAI RSRC M WAKE ILT PE PT $0023 SCI2C2 TIE TCIE RIE ILIE TE RE RWU SBK $0024 SCI2S1 TDRE TC RDRF IDLE OR NF FE PF $002 SCI2S RAF $0026 SCI2S3 R8 T8 TXDIR 0 ORIE NEIE FEIE PEIE $0027 SCI2D Bit Bit 0 $0028 SPI1C1 SPIE SPE SPTIE MSTR CPOL CPHA SSOE LSBFE $0029 SPI1C MODFEN BIDIROE 0 SPISWAI SPC0 $002A SPI1BR 0 SPPR2 SPPR1 SPPR0 0 SPR2 SPR1 SPR0 $002B SPI1S SPRF 0 0SPTEF MODF $002C 保留 $002D SPI1D Bit Bit 0 $002E 保留 $002F 保留 $0030 TPM1SC TOF TOIE CPWMS CLKSB CLKSA PS2 PS1 PS0 $0031 TPM1CNTH Bit Bit 8 $0032 TPM1CNTL Bit Bit 0 $0033 TPM1MODH Bit Bit 8 $0034 TPM1MODL Bit Bit 0 $003 TPM1C0SC CH0F CH0IE MS0B MS0A ELS0B ELS0A 0 0 $0036 TPM1C0VH Bit Bit 8 $0037 TPM1C0VL Bit Bit 0 $0038 TPM1C1SC CH1F CH1IE MS1B MS1A ELS1B ELS1A 0 0 $0039 TPM1C1VH Bit Bit 8 $003A TPM1C1VL Bit Bit 0 $003B TPM1C2SC CH2F CH2IE MS2B MS2A ELS2B ELS2A 0 0 $003C TPM1C2VH Bit Bit 8 $003D TPM1C2VL Bit Bit 0 $003E 保留 $003F $0040 PTFD PTFD7 PTFD6 PTFD PTFD4 PTFD3 PTFD2 PTFD1 PTFD0 $0041 PTFPE PTFPE7 PTFPE6 PTFPE PTFPE4 PTFPE3 PTFPE2 PTFPE1 PTFPE0 $0042 PTFSE PTFSE7 PTFSE6 PTFSE PTFSE4 PTFSE3 PTFSE2 PTFSE1 PTFSE0 $0043 PTFDD PTFDD7 PTFDD6 PTFDD PTFDD4 PTFDD3 PTFDD2 PTFDD1 PTFDD0 $0044 PTGD PTGD7 PTGD6 PTGD PTGD4 PTGD3 PTGD2 PTGD1 PTGD0 $004 PTGPE PTGPE7 PTGPE6 PTGPE PTGPE4 PTGPE3 PTGPE2 PTGPE1 PTGPE0 $0046 PTGSE PTGSE7 PTGSE6 PTGSE PTGSE4 PTGSE3 PTGSE2 PTGSE1 PTGSE0 $0047 PTGDD PTGDD7 PTGDD6 PTGDD PTGDD4 PTGDD3 PTGDD2 PTGDD1 PTGDD0 $0048 ICGC1 0 RANGE REFS CLKS OSCSTEN -* 0 26

38 HCS08 系列 MCU 参考手册 ( 第四章片上存储器 ) $0049 ICGC2 LOLRE MFD LOCRE RFD $004A ICGS1 CLKST REFST LOLS LOCK LOCS ERCS ICGIF $004B ICGS DCOS $004C ICGFLTU FLT $004D ICGFLTL FLT $004E ICGTRM TRIM $004F 保留 $000 ATD1C ATDPU DJM RES8 SGN PRS $001 ATD1SC CCF ATDIE ATDCO ATDCH $002 ATD1RH Bit 9 Bit 8 Bit 7 Bit 6 Bit Bit 4 Bit 3 Bit 2 $003 ATD1RL Bit 1 Bit $004 ATD1PE ATDPE7 ATDPE6 ATDPE ATDPE4 ATDPE3 ATDPE2 ATDPE1 ATDPE0 $ 保留 $ $008 IIC1A ADDR 0 $009 IIC1F MULT ICR $00A IIC1C IICEN IICIE MST TX TXAK RSTA 0 0 $00B IIC1S TCF IAAS BUSY ARBL 0 SRW IICIF RXAK $00C IIC1D DATA $00D 保留 $00F $0060 TPM2SC TOF TOIE CPWMS CLKSB CLKSA PS2 PS1 PS0 $0061 TPM2CNTH Bit Bit 8 $0062 TPM2CHTL Bit Bit 0 $0063 TPM2MODH Bit Bit 8 $0064 TOM2MODL Bit Bit 0 $006 TPM2C0SC CH0F CH0IE MS0B MS0A ELS0B ELS0A 0 0 $0066 TPM2C0VH Bit Bit 8 $0067 TPM2C0VL Bit Bit 0 $0068 TPM2C1SC CH1F CH1IE MS1B MS1A ELS1B ELS1A 0 0 $0069 TPM2C1VH Bit Bit 8 $006A TPM2C1VL Bit Bit 0 $006B TPM2C2SC CH2F CH2IE MS2B MS2A ELS2B ELS2A 0 0 $006C TPM2C2VH Bit Bit 8 $006D TPM2C2VL Bit Bit 0 $006E TPM2C3SC CH3F CH3IE MS3B MS3A ELS3B ELS3A 0 0 $006F TPM2C3VH Bit Bit 8 $0070 TPM2C3VL Bit Bit 0 $0071 TPM2C4SC CH4F CH4IE MS4B MS4A ELS4B ELS4A 0 0 $0072 TPM2C4VH Bit Bit 8 $0073 TPM2CVL Bit Bit 0 $ 保留 $007F 表 4-4 中所示的高地址页寄存器比其他的 I/O 和控制寄存器要少访问, 所以它们位于可直接寻址的存储器空间之外, 开始于 $

39 HCS08 系列 MCU 参考手册 ( 第四章片上存储器 ) 表 4-4 高地址页寄存器概要 地址 寄存器名称 Bit 7 Bit 6 Bit Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 $1800 SRS POR PIN COP ILCP 0 ICG LVD 0 $1801 SBDFR BDFR $1802 SOPT COPE COPT STOPE BKGDPE - $ 保留 $ $1806 SDIDH REV3 REV2 REV1 REV0 ID11 ID10 ID9 ID8 $1807 SDIDL ID7 ID6 ID ID4 ID3 ID2 ID1 ID0 $1808 SRTISC RTIF RTIACK RTICLKS RTIE 0 RTIS2 RTIS1 RTIS0 $1809 SPMSC1 LVDF LVDACK LVDIE LVDRE LVDSE LVDE 0 0 $180A SPMSC2 LVWF LVWACK LVDV LVWV PPDF PPDACK PDC PPDC $180B 保留 $180F $1810 DBGCAH Bit Bit 8 $1811 DBGCAL Bit Bit 0 $1812 DBGCBH Bit Bit 8 $1813 DBGCBL Bit Bit 0 $1814 DBGFH Bit Bit 8 $181 DBGFL Bit Bit 0 $1816 DBGC DBGEN ARM TAG BRKEN RWA RWAEN RWB RWBEN $1817 DBGT TRGSEL BEGIN 0 0 TRG3 TRG2 TRG1 TRG0 $1818 DBGS AF BF ARMF 0 CNT3 CNT2 CNT1 CNT0 $ 保留 $181F $1820 FCDIV DIVLD PRDIV8 DIV DIV4 DIV3 DIV2 DIV1 DIV0 $1821 FOPT KEYEN FNORED SEC01 SEC00 $1822 保留 $1823 FCNFG 0 0 KEYACC $1824 FPROT FPOPEN FPDIS FPS2 FPS1 FPS $182 FSTAT FCBEF FCCF FPVIOL FACCERR 0 FBLANK 0 0 $1826 FCMD FCMD7 FCMD6 FCMD FCMD4 FCMD3 FCMD2 FCMD1 FCMD0 $ 保留 $182B 表 4- 中所示的非易失性 FLASH 寄存器位于 FLASH 存储器中 包括两个 FLASH 存储器模块初始化寄存器和一个 8 字节的密钥, 这个密钥用于获得对加密存储器的访问权 在复位后,FLASH 存储器的非易失性寄存器中 NVPROT 和 NVOPT 的内容被转移到相应的位于高页面寄存器中的 FPROT 和 FOPT 工作寄存器中, 从而控制加密和阻止保护选项 表 4- 非易失性寄存器概要 地址 寄存器名称 Bit 7 Bit 6 Bit Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 $FFB0- $FFB7 NVBACKKEY 8 字节密钥 $FFB8- 保留

40 HCS08 系列 MCU 参考手册 ( 第四章片上存储器 ) $FFBC $FFBD NVPROT FPOPEN FPDIS FPS2 FPS1 FPS $FFBE 保留 (1) $FFBF NVOPT KEYEN FNORED SEC01 SEC00 注 :1. 这个位置可用于存储 ICG 的工厂预设值 如果密钥使能位 (KEYEN) 为 1,8 字节的密钥将被用于暂时性的跳出存储器的安全保护模式 密钥机制只能由在安全模式下运行的用户代码访问 ( 密钥不可直接通过背景调试命令键入 ) 当 KEYEN 标志位为 0 时, 密钥功能失效 如果密钥不可用, 离开安全保护模式的唯一途径就是整体擦除 FLASH 存储器 ( 通常通过背景调试接口 ), 并且校验 FLASH 存储器为空 为避免在下一次复位后又返回安全保护模式, 向保护位 (SEC01:SEC00) 写入 (1:0) 即可 在 4.6 节中有更多关于存储器安全的介绍 4.4 RAM MC9S08GB60 包含 4096 字节的静态 RAM 位于 $0080 到 $107F 之间 前面的 128 字节 RAM($0080-$00FF) 可以使用更高效的直接寻址方式访问, 这一区域中的任何单独一位都可以通过位操作指令 (BCLR BSET BRCLR 和 BRSET) 访问 一般将最常用的程序变量放在 RAM 的这一区域 当 V DD 提供的电压高于 RAM 的最小保持电压并且没有进入 stop1 模式, 这时 RAM 中的内容是可以保持的 如果通过在 SPMSC2 中置 PDC 位和清 PPDC 位选择可以进入 stop1 模式, 那么当进入 stop1 模式时, 内部电路 ( 包括 RAM) 的电压调节器关闭 在退出 stop1 模式之后,RAM 中的内容是未初始化的并且所有的其他寄存器都回到复位默认状态 ( 参看第三章可以得到更多的关于 stop 模式的信息 ) 为了和旧的 M68HC0 MCU 兼容,HCS08 初始化时将栈指针定在 $00FF 在 MC9S08GB60 中, 一般来说最好将栈指针重新初始化指向 RAM 的顶部 ($107F), 这样 RAM 的直接页 ($0080-$00FF) 可以用于存储经常使用的 RAM 变量以及可以位寻址的程序变量 将以下两个指令加入到初始化程序中 ( 在 Freescale 提供的文档中,RamLast 等同于 $107F) LDHX #RamLast+1 ; 指示上一个 RAM TXS ;SP<-(H:X-1) 4. 60K 字节的 FLASH 60K 字节的 FLASH 主要用于程序存储 在线编程允许应用程序在最后一次编译以后下载到 FLASH 存储器中 可以大约在三秒钟之内通过单一连线的背景调试接口对整个 60K 字节的 FLASH 进行写入 因为对 FLASH 的擦除和写入操作不需要特殊的电压, 所以可以通过串行通信接口 (SCI) 或一些其他软件可控制的通信方式对应用程序进行下载 在线编程的详细信息请参见 4.8 节的 FLASH 应用例子 29

41 HCS08 系列 MCU 参考手册 ( 第四章片上存储器 ) 4..1 特征 FLASH 有以下特征 : 1FLASH 大小 字节 (120 页, 每页 12 字节 ) 2 单一电压供电的擦除 / 写入 3 用于快速写入和擦除操作的命令接口 4 全自动快速的字节写入 页擦除 整体擦除或者空白检查操作 ( 写入 60K 字节大约需要三秒钟 ) 在正常的电压和温度下, 高达 的写入 / 擦除次数 6 灵活易用的块保护 7FLASH 和 RAM 的安全机制 8 自动低功耗和低频率读访问 FLASH 存储模块包括完整的擦除 / 写入电压发生器和独立的指令处理状态机, 可以实现自动字节写入, 页擦除 (12 字节的 FLASH) 整体擦除或空白检测命令的功能 这些命令是写在命令接口中的, 状态标志可以报告错误并且可以指示命令是什么时候完成的 在 FLASH 存储区的末端的 12 1K 2K 4K 8K 16K 或者 32K 字节的块可以进行块保护 另外的控制位允许对整个 FLASH 区的 60K 字节进行块保护 ( 见 节 FLASH 保护寄存器 (FPROT 和 NVFPROT)) 可以通过设置非易失性的初始化寄存器 (NVFPROT) 来设置块保护 可以使用安全机制来预防对 FLASH 和 RAM 存储内容的非法访问 用户可以使用密钥来取得安全模式下的存储器内容的访问控制 4..2 写入 擦除和空白检测命令 在执行任何一条擦除或者写入命令之前, 必须首先设置 FLASH 时钟分频寄存器, 将 FLASH 模块的内部时钟设到 10kHz 到 200kHz 之间 (f FCLK ),( 见 节 FLASH 时钟分频寄存器 FCDIV), 这个寄存器只能被写一次, 所以一般在复位初始化中设置该寄存器 设置好的时钟周期被命令处理器用来对擦除和写入脉冲进行计时 这些计时脉冲的整数倍作为时钟被命令处理器用来完成一个擦除或者写入的命令 命令写入到 FLASH 的命令接口中可以完成以下的操作 : 1 在 FLASH 中写入一个字节 2 擦除 FLASH 存储器的一页 (12 字节 ) 360K 字节的 FLASH 存储器整体擦除 4 检测 FLASH 存储器是否是空白的必须严格地紧跟着一个监控程序, 否则命令不会被接受 这样可以将无意识的改变 FLASH 存储器的可能性降到最低 命令缓冲区空标志 (FCBEF) 表明命令缓冲区何时有空间来接收新的命令 命令完成标志 (FCCF) 表明何时所有的指令都完成了并且在 FLASH 命令缓冲区中没有新的命令在等待执行 在执行 FLASH 存储器的任何一条新 30

42 HCS08 系列 MCU 参考手册 ( 第四章片上存储器 ) 的命令之前, 必须通过向 FCBEF 位写入 1 来指示命令队列执行完毕 图 4-2 表示执行命令的过程 当命令执行时有下面两类错误会出现 : 1 当执行一条命令来擦除或者写入 FLASH 中被保护的块区域时,FSTAT 中的 FPVIOL 位会指示是否有一个侵害保护错误产生 ( 见 节 FLASH 保护寄存器 (FPROT 和 NVFPROT)) 2 其他任何违反时序或者其他类型的错误, 都会将 FSTAT 寄存器中的访问错误标志位 FACCERR 置位 产生错误的行为的详细列表参见 4..4 访问错误一节 假设没有侵害保护和访问错误出现, 命令序列可以简单地分成以下的三个基本步骤 : 1 向要擦除的 FLASH 区域的一个地址写入一个数值 这个写入的地址和数值的信息将被放在命令缓冲区中 命令序列的第一步就是进行这个写入 对擦除和空白检测命令来说, 这个数据的值是不重要的 但是对于页擦除命令, 这个地址必须是要擦除的 12 字节的 FLASH 页中的任意一个地址 对于整体擦除命令和空白检测命令, 这个地址可以是 60K 字节的 FLASH 存储器中的任意一个地址 2 向 FCMD 写入已经设计好的命令 五个已经设计好的命令是 : 空白检查命令 ($0), 写入一个字节命令 ($20), 突发模式写入命令 ($2), 页擦除命令 ($40), 整体擦除命令 ($41) 这些命令将会写入到命令缓冲区 3 向 FSTAT 寄存器的 FCBEF 位写 1, 可以清 FCBEF 位和登记命令 ( 包括它的地址和数据信息 ) 在写存储器之后, 写 1 清零 FCBEF 和已完成的命令之前的任何时候可以向 FCBEF 手动写 0, 使部分命令序列失效 用这种方式使命令失败可使 FACCERR 存取错误标志位置位, 而这位在开始执行新命令之前必须被清零 31

43 HCS08 系列 MCU 参考手册 ( 第四章片上存储器 ) 开始 FACCERR? 0 1 清除错误 FCBEF? 0 1 向 FLASH 写入来缓存地址和数据 向 FCMD 写入命令 向 FCBEF 写入 1 登记命令和 FCBEF (1) (1) 在检测 FCBEF 或者 FCCF 之前应至少等待 4 个总线周 是 0 FPVIO 或 FACCERR? 否是否有更多的命令? 结束 否 FCCF? 1 是 错误退出 图 4-2 FLASH 命令流程图 4..3 命令时间和突发模式写入 这一部分详细地解释了非易失性存储器命令的时序和时间问题 在一行中多于一个字节一个接一个被写入时, 这就叫做突发模式写入 在一行中, 相对于随后的字节的写入, 写入第一个字节花费较长的时间 行和 FLASH 的组织结构 60K 字节的 FLASH 存储器由 120 页组成, 每页 12 字节 每页由 8 行组成, 每行 64 字节,FLASH 存储器地址从 $1000 开始 地址线的 A-A0 定义行内地址,A8-A6 定义行号,A1-A9 定义页号 12 字节的页是 FLASH 允许擦除的最小块 FLASH 第一 32

44 HCS08 系列 MCU 参考手册 ( 第四章片上存储器 ) 行的前面的 128 字节 ($1000-$107F) 由于和前面的 RAM 地址的高地址重复而被隐藏 分行是很重要的, 如果当前的地址与先前的字节或者突发模式写入命令的地址在同一行中时, 突发模式写入命令花费的时间要少些 为了象这样节省写入时间, 在当前同一行中的字节写入命令完成之前, 突发模式写入命令必须放在命令缓冲中 ( 否则, 需要一个额外的字节写入操作 ) 程序命令时序在这节讨论中, 假设 FCDIV 设置成 微秒的命令状态机的计时脉冲 如果 FCDIV 的设置和系统的时钟频率导致一个不同的计时脉冲周期, 所有的编程时间间隔都要相应的调整 一个完整的写入命令包括 7 个时间间隔, 它们是 : 1 开始 0 到 微秒, 由命令和 200kHz 内部非易失性存储器时钟的同步决定 当命令缓冲区一直处于满状态时, 每条指令在 200kHz 时钟的边缘结束 新的命令要等待一个完整的周期来同步时钟, 这样开始的时间才能保持在完整的 微秒 2 非易失性设置 微秒 3 写入设置 微秒 4 写入字节 20 微妙 写入保持 10 纳秒 ( 可以忽略 ) 6 非易失性保持 微秒 ( 减去写入保持的时间 ) 7 存储器恢复时间 微秒在同一行中对超过一个位置进行写入 ( 只要命令缓冲区依然被一个快速写入命令充满, 这样在命令之间就不存在间隔 ) 叫做快速写入, 除了字节写入的时间所有其他的步骤都被跳过 表 4-6 列出了写入和擦除的时间 系统时钟和控制位的设置决定了 FCLK 的频率 f FCLK 一个 FCLK 的周期的时间是 t Fcyc =1/fFCLK 时间是以 FCLK 的周期数表示的, 假设 t Fcyc =µs 表 4-6 写入和擦除的时间参数 FCLK 的周期数时间 ( 设 FCLK=200kHz) 字节写入 9 4µs 字节写入 ( 快速 ) 4 20µs(1) 页擦除 ms 整体擦除 40, ms (1) 不包括开始和结束时间 33

45 HCS08 系列 MCU 参考手册 ( 第四章片上存储器 ) 4..4 访问错误 下面的任何一个操作都会造成 FSTAT 中的访问错误标志 (FACCERR) 置位 一旦发生了访问错误, 在执行新的命令之前必须向 FSTAT 中的 FACCERR 写 1 来清 FACCERR 标志 1 在写一个 FLASH 地址之前, 内部 FLASH 时钟频率没有通过 FCDIV 寄存器设置 2 在写 FCMD 之前, 写一个无效的 FLASH 地址 (MC9S08GB60 没有无效的 FLASH 地址 ) 3 当 FCBEF 没有置位时, 写 FLASH 地址 ( 在命令缓冲区为空之前不可以开始一个新的命令 ) 4 在登记先前的命令之前, 再一次写入 FLASH 地址 ( 每一个命令只写一次 FLASH) 在登记先前的命令之前, 再一次写 FCMD( 对每一个命令只写一次 FCMD) 6 向写入 FLASH 地址后, 设置除 FCMD 外的任意其他控制寄存器 7 向 FCM 写除了五个正确的命令 ($0,$20,$2,$40, 或 $41) 之外的任何命令 8 向 FCMD 中写入命令字之后, 设置除 FSTAT( 清 FCBEF 和命令 ) 之外的任意 FLASH 控制寄存器 9 当执行写入或者擦除命令时,MCU 进入停止模式 ( 这个命令是被中止的 ) 10 当 MCU 处于安全状态时, 用背景调试命令写字节写入 突发模式写入和页擦除这些命令 ( 当 MCU 处于安全状态时, 背景调试控制器只能进行空白检测和整体擦除命令 ) 11 向 FCBEF 位写 0 取消一个未完成的命令 4.. 向量重定向 无论是哪种块保护, 复位和中断向量都将被保护 向量重定向允许用户修改中断向量信息而不需要解保护引导程序和复位向量空间 向地址为 $FFBF 的 NVOPT 寄存器的 FNORED 位写入 0, 可以使向量重定向有效 为了让重定向发生, 必须设置位于 $FFBD 地址处的 NVPROT 寄存器让 FLASH 存储器中的一部分而不是全部块保护 所有的中断向量 ($FFC0 $FFFD) 都会重定向, 除了复位向量 ($FFFE:$FFFF) 举个例子, 如果 FLASH 的 12 个字节被保护, 保护地址区域是从 $FE00 到 $FFFF 则中断向量 $FFC0 $FFFD 被重定向到 $FDC0 $FDFD 以一个 SPI 中断来举例, 地址 $FDE0: FDE1 将取代地址 $FFE0:FFE1 的值被中断向量使用 这就允许用户在离开保护区域时, 可以使用新的程序代码和新的向量值去编程 FALSH 未被保护的部分, 而留下包含默认向量地址的被保护区域不被改写 4..6 FLASH 块保护 (MC9S08GB60) 块保护防止对指定地址范围的 FLASH 存储空间进行写入或擦除操作 当 FLASH 34

46 HCS08 系列 MCU 参考手册 ( 第四章片上存储器 ) 的任意块被保护时, 整体擦除无效 MC9S08GB60 允许 FLASH 存储器的后面的一块或者全部 FLASH 存储器被保护 FPROT 寄存器的七个位中, 一个控制位和一个三位的控制区, 允许用户设置这个块的大小为 12 1K 2K 4K 8K 16K 或者 32K 字节 一个独立控制位允许保护全部 FLASH 存储阵列 所有的这 个控制位都在 FPROT 寄存器中 ( 见 节 FLASH 保护寄存器 FPROT 和 NVPROT) 复位时, 高地址页寄存器 (FPROT) 装入 NVPROT(FLASH 存储器的非易失寄存器 ) 的内容 FPROT 的值不能被应用软件直接改变, 所以一个跑飞的程序不能改变块保护设置 ( 有意或者无意 ) 用背景调试命令来写 FPROT 控制位可以擦除一个被保护的 FLASH 块 块保护的一个用途是为引导程序提供一个保护了的 FLASH 存储区域 这样引导程序就可以用于擦除并且重新写剩余的 FLASH 存储器 因为引导程序被保护, 所以即使 MCU 在写入或者擦除操作过程中掉电, 该程序也是完整的 4.6 MC9S08GB60 的安全性 MC9S08GB60 使用硬件电路来防止对 FLASH 存储器和 RAM 存储器的数据的非法访问 当安全机制使用时,FLASH 和 RAM 都被看作被保护资源 直接页寄存器, 高地址页寄存器, 背景调试控制器被看作是非保护资源 保护区的程序执行时, 可以正常访问任何位置的内存数据和资源, 但通过背景调试接口或来自非保护存储空间的程序执行来访问保护资源是不允许的 ( 写操作被忽略, 读时总为 0) 是否使用安全机制是由 FOPT 中的非易失性的寄存器位 SEC01:SEC00 来设置的 在芯片复位时, 非易失性的 NVOPT 的内容从 FLASH 中复制到工作着的高地址页寄存器 FOPT 中 用户通过写 NVOPT 来使用 MCU 的安全机制 如果是 1:0 状态, 则取消 MCU 保密性, 其他的组合都启用 MCU 保密性 注意擦除的状态 (1:1) 使得 MCU 安全 在开发过程中, 无论 FLASH 何时被擦除, 立即将 NVOPT 中的 SEC00 位清 0 是提倡的操作 这样就可以在复位以后让 MCU 仍然是非保护的 当 MCU 处于安全模式时, 芯片的调试模式是不能被使能的 这个独立的背景调试控制器仍然用于非插入的背景存储器访问命令, 但是,MCU 不会进入背景调试模式, 除非在复位的上升沿, 保持 BKGD/MS 引脚低电平 用户可以通过 8 字节的后门密钥来允许或者禁止安全机制 如果 NVOPT 或者 FOPT 中的非易失性位 KEYEN 是 0, 后门密钥是无效的, 这时如果没有擦除整个的 FLASH 就没有方法离开安全模式 如果 KEYEN 是 1, 一个在安全模式下的用户程序可以通过以下的方法暂时离开安全模式 : 1 将 FCNFG 的 KEYACC 位置 1 这使 FLASH 模块将后门密钥地址 (NVBACKKEY 到 NVBACKKEY+7) 写入的数据解释为比较密钥, 而不是 FLASH 写入或擦除的第一步 2 向 NVBACKKEY 到 NVBACKKEY+7 的位置依次写入 8 字节的用户进入密钥值 写入顺序为 NVBACKKEY 开始,NVBACKKEY+7 结束 通常, 用户程序可以从 MCU 系统外部通过一个通讯接口 ( 如 SCI) 获得该密钥 3

47 HCS08 系列 MCU 参考手册 ( 第四章片上存储器 ) 3 将 FCNFG 的 KEYACC 位置 0, 如果用户写入的 8 字节和其在 FLASH 之中的 8 字节位置是匹配的,MCU 将 SEC01:SEC00 改写成 1:0, 从而取消 MCU 的保密性 这种机制只能由处于保护模式下的代码执行, 而不能由背景调试命令和非保护区域的代码执行 后门密钥 (NVBACKKEY 到 NVBACKKEY+7) 分布在 FLASH 存储器的非易失性寄存器空间中, 因此用户可以象写其他 FLASH 寄存器一样写这些寄存器 这个非易失性的寄存器与复位和中断向量一起都位于同样的一块 12 字节的 FLASH 存储区域中, 所以块保护这块区域也就保护了后门密钥 块保护不能通过用户的应用程序改变, 因此, 如果向量空间是块保护空间, 这个后门安全密钥机制永远不能改变块保护 安全设置和后门密钥 安全模式可以通过背景调试接口按照下面的步骤来消除 : 1 通过写 FPROT 来使块保护失效,FPROT 只能通过背景调试命令来写, 而不是通过应用软件 2 如果需要可以整体擦除 FLASH 存储器 3FLASH 的空白检测, 如果 FLASH 被完全擦除, 安全模式被禁止直到下一次复位 为了避免下一次复位时返回安全模式, 置 NVFOPT 的 SEC01:SEC00=1:0 4.7 MC9S08GB60 的 FLASH 寄存器和控制位 尽管这些寄存器和控制位都是 HCS08 系列的典型寄存器和控制位, 但是在编写某个特定的 HCS08 系列 MCU 的应用软件时仍然要参考数据手册 MC9S08GB60 的 FLASH 模块有 6 个 8 位的寄存器位于高地址页寄存器空间, 两个位于 FLASH 存储器的非易失性寄存器空间, 当复位时, 内容被复制到相应的高页区域的控制寄存器 同样也有一个 8 字节的密钥在 FLASH 存储器中 表 4-4 和表 4- 列出了所有 FLASH 寄存器的绝对地址 这里通过这些寄存器和控制位的名称来引用它们 通常,Freescale 提供一个头文件把它们的名称翻译为绝对地址 FLASH 时钟分频寄存器 (FCDIV) 该寄存器的第 7 位是一个只读状态标志位 第 0 位到第 6 位在任何时候都可以被读, 但只能写一次 在任何擦除或写入操作之前, 必须向该寄存器写入内容用以在有效的范围内设置时钟的频率 第 7 位 第 0 位 读 : 写 : DIVLD 无效 PRDIV8 DIV DIV4 DIV3 DIV2 DIV1 DIV0 复位

48 HCS08 系列 MCU 参考手册 ( 第四章片上存储器 ) DIVLD 时钟分频加载标志位这个只读标志位被置位时, 表示 FCDIV 寄存器在复位后已经被写过了 复位清零该位且第一次向该寄存器写入导致该位置位不管数据是否写入 1 = FCDIV 已经被写过, 可以对 FLASH 进行擦除和写入操作 0 = FCDIV 没有被写过, 不可以对 FLASH 进行擦除和写入操作 PRDIV8 FLASH 预分频设置位 1 = FLASH 分频器的时钟输入是总线时钟频率的八分之一 0 = FLASH 分频器的时钟输入是总线时钟频率 DIV:DIV0 时钟分频位 FLASH 时钟分频器通过这六位的值来对总线时钟频率 ( 或者当 PRDIV8=1 时是总线时钟频率的八分之一 ) 进行分频 在对 FLASH 进行操作时, 内部时钟必须降到 10KHz~200KHz 擦除/ 写入操作的时序脉冲是内部 FLASH 工作时钟的一个时钟周期, 所以擦 / 写的时间相应的在 6.7μs~μs 自动的写入逻辑使用这个时钟周期的整数倍时间完成擦除或写入操作 内部时钟 ffclk 的计算方法如下 : 等式 1: 如果 PRDIV8=0, 则 f FCLK =f Bus ([DIV:DIV0]+1) 等式 2: 如果 PRDIV8=1, 则 f FCLK =f Bus (8 ([DIV:DIV0]+1)) 表 4-7 列出了对 PRDIV8 和 DIV:DIV0 设置不同数值时的 FLASH 时钟频率 表 4-7 FLASH 时钟分频器设置 f Bus PRDIV8 ( 二进制 ) DIV:DIV0 ( 十进制 ) f FCLK 擦除 / 写入脉冲时间 ( 最少 μs, 最多 6.7μs) 20 MHz kHz.2μs 10 MHz kHz μs 8 MHz kHz μs 4 MHz kHz μs 2 MHz kHz μs 1 MHz kHz μs 200KHz kHz μs 10KHz kHz 6.7μs FLASH 选项寄存器 (FOPT 和 NVOPT) 复位时, 非易失性的 NVOPT 的内容从 FLASH 拷贝到 FOPT 第 2 到 位为无效 位, 读时一直为 0 该寄存器在任何时刻可读, 但是写入没有任何影响 为了改变这个 寄存器的值, 象平常一样擦除或者写入 FLASH 存储器中的 NVOPT 位置, 然后执行 MCU 复位 第 7 位 第 0 位 读 : KEYEN FNORED SEC01 SEC00 写 : 无效 无效 无效 无效 无效 无效 无效 无效 复位 : 在复位时, 这个寄存器从非易失性区域 NVOPT 中装载 37

49 HCS08 系列 MCU 参考手册 ( 第四章片上存储器 ) KEYEN 后门密钥机制使能当这位为 0 时, 后门密钥机制不可用于离开安全模式 后门密钥机制只能被安全的用户固件使用 BDM 命令不能用于改变密钥的值 更多的后门密钥机制的描述见 4.6 节安全性 KEYEN=1, 如果用户固件写的一个 8 字节值与非易失性的后门密钥即 NVBACKKEY~NVBACKKEY+7 相匹配, 安全模式暂时失效直到下一次 MCU 复位 KEYEN = 0, 禁止 FLASH 安全密钥 FNORED 向量重定向禁止位该位为 1 时, 向量重定向不可用 FNORED = 1, 向量重定向禁止 FNORED = 0, 向量重定向使能 SEC01:SEC00 安全状态码这两位决定 MCU 的安全状态, 详见表 4-8 当 MCU 在安全模式时,FLASH 和 RAM 的内容不能被任何来自非法源 ( 包括背景调试接口 ) 的指令访问 安全模式更详细的信息参见 4.6 节安全性 表 4-8 安全状态码 SEC01:SEC00 描述 0:0 保密的 0:1 保密的 1:0 非保密的 1:1 保密的 在一次成功的后门密钥进入或 FLASH 空白检测后 SEC01:SEC00 变为 1: FLASH 配置寄存器 (FCNFG) 第 位可以在任何时间被读写 剩下的位通常读为 0 且不能被写 第 7 位 第 0 位读 : KEYACC 写 : 无效无效无效无效无效无效无效复位 : KEYACC 写访问密钥允许位该位使能写访问密钥 更详细的描述见 4.6 节安全性 KEYACC = 1, 写 NVBACKKEY($FFB0 $FFB7) 被认为是进行密码比较 KEYACC = 0, 写 $FFB0 $FFB7 被认为是 FLASH 写入或擦写命令的开始 FLASH 保护寄存器 (FPROT 和 NVPROT) 复位期间, 非易失 NVPROT 的内容从 FLASH 拷贝到 FPROT 第 2~0 位无效且一直读为 0 该寄存器在任何时刻可读, 但是用户程序向它写入是无效且没有意义的 38

50 HCS08 系列 MCU 参考手册 ( 第四章片上存储器 ) 背景调试命令可以设置 FPROT, 地址为 $1824 第 7 位 第 0 位 读 : FPOPEN FPDIS FPS2 FPS1 FPS 写 : (1) (1) (1) (1) (1) 无效 无效 无效 复位 : 在复位时, 这个寄存器从非易失性区域 NVOPT 中装载 (1) 背景命令可以改变 FPROT 寄存器中的这些位 FPOPEN 打开非保护的 FLASH 进行擦写 FPOPEN = 1,FLASH 中非保护区域可以进行擦写操作 FPOPEN = 0, 整个 FLASH 区域都是保护的, 不可以进行擦写操作 FPDIS FLASH 保护禁止位 FPDIS = 1,FLASH 不进行保护 FPDIS = 0, 由 FPS2:FPS1:FPS0 决定的 FLASH 区域被块保护 FPS2:FPS1:FPS0 FLASH 保护区域选择 当 FPDIS = 0, 这三个位决定在 FLASH 末端的高地址位的保护块的大小 ( 见表 4-9), 受保护的 FLASH 区域不可被擦写 表 4-9 高地址保护地址块 FPS2:FPS1:FPS0 保护地址范围 保护块大小 (1) 重定向的向量 0:0:0 $FE00 $FFFF 12 bytes $FDC0 $FDFD (2) 0:0:1 $FC00 $FFFF 1 bytes $FBC0 $FBFD 0:1:0 $F800 $FFFF 2 bytes $F7C0 $F7FD 0:1:1 $F000 $FFFF 4 bytes $EFC0 $EFFD 1:0:0 $E000 $FFFF 8 bytes $DFC0 $DFFD 1:0:1 $C000 $FFFF 16 bytes $BFC0 $BFFD 1:1:0 $8000 $FFFF 32 bytes $7FC0 $7FFD 1:1:1 $8000 $FFFF 32 bytes $7FC0 $7FFD (1) 当 FPOPEN=0 或者 FNORED=1 时没有重定向 (2) 复位向量不可重定向 4.7. FLASH 状态寄存器 (FSTAT) 第 0,1,3 位一直读为 0 且对它的写入都是无效且没有意义的 剩下的五位都是状态位, 它们任何时刻都是可读的 向这些位写入是有特殊的意义的, 这些意义在下面描述 第 7 位 第 0 位读 : FCCF 0 FBLANK 0 0 FCBEF FPVIOL FACCERR 写 : 无效无效无效无效无效复位 : FCBEF FLASH 命令缓冲区空标志位写入的 FLASH 命令是放在缓冲区中的, 在一个快速写入命令序列中当命令处理器正在执行另外一条命令时, 第二条命令可以写入到缓冲区中 当一个命令完成时, 如果缓冲区中有新命令, 命令处理程序就能立即添加缓冲区中的命令序列进来执行 39

51 HCS08 系列 MCU 参考手册 ( 第四章片上存储器 ) 当命令缓冲区可以接受一个新的命令时,FCBEF 位自动置位 命令被登记后, 通过向 FCBEF 位写入 1 清 FCBEF 位 在向 FLASH 写入之后,FCBEF 位清除之前, 向 FCBEF 写 0 将导致当前部分进入的命令被人工中止 FCBEF = 1, 命令缓冲区可以接收一个新的命令 FCBEF = 0, 命令缓冲区不空, 不可以接收新的命令 FCCF FLASH 命令完成标志位当命令缓冲区为空且没有命令在执行时该位自动置位 当一个新的命令开始时 ( 通过向 FCBEF 写 1 来存入命令 ), 该位自动清零 向该位写入无效且没有效果 FCCF = 1, 所有命令都完成 FCCF = 0, 命令还在执行 FPVIOL 保护标志位当 FCBEF 位被清除来存入一个擦写命令试图访问保护区域时,FPVIOL 位自动置 1( 这个错误命令被忽略 ) 向 FPVIOL 写 1 可以自动清 FPVIOL FPVIOL = 1, 表示试图对保护区域进行擦写操作 FPVIOL = 0, 表示不进行侵害保护设置 FACCERR 访问出错标志位当正常的命令序列没有正确的跟随时, 在 FCDIV 寄存器初始化之前尝试擦除或者写入操作 ; 或者当命令正在处理时 MCU 进入停止模式,FACCERR 被置位 会引起访问出错的行为的详细讨论见 4..4 节访问错误 向 FACCERR 位写 1 将清 FACCERR, 向 FACCERR 写入 0 是没有意义和无效的 FACCERR = 1, 表示一个访问错误已经发生 FACCERR = 0, 没有访问错误发生 FBLANK FLASH 空白标志位如果执行空白检测命令检测到整个 FLASH 都是被擦除的,FBLANK 位将自动置位 通过清除 FCBEF 来写入一个新的命令可以清 FBLANK 位 向该位写入是没有意义和无效的 FBLANK = 1, 一个空白检测命令完成之后且 FCCF=1,FBLANK=1 表示 FLASH 是空的, 即所有的字节为 $FF FBLANK = 0, 一个空白检测命令完成之后且 FCCF=1,FBLANK=0 表示 FLASH 是非空 FLASH 命令寄存器 (FCMD) 第 1,3,4,7 位通常是 0, 并且不能通过用户的应用程序写入 在正常用户模式中, 只有 个命令代码可以被识别, 见表 4-10 FLASH 的写入, 擦除和空白检测操作见 4..2 节 40

52 HCS08 系列 MCU 参考手册 ( 第四章片上存储器 ) 第 7 位 第 0 位 读 : 写 : FCMP7 FCMP6 FCMP FCMP4 FCMP3 FCMP2 FCMP1 FCMP0 复位 : 表 4-10 FLASH 命令 命令 FCMD 等价的文件标志 空白检测 $0 mblank 字节写入 $20 mbyteprog 字节写入 - 快速模式 $2 mburstprog 页擦除 $40 mpageerase 整体擦除 ( 整个 FLASH) $41 mmasserase 所有其他的命令都是非法的并且产生一个访问错误 整体擦除操作之后没有必要去执行 空白检测命令 只有当作为安全解锁机制的一部分时空白检测命令才是需要的 4.8 FLASH 存储器应用实例 本节通过几个例子来演示怎么对 HCS08 系列的 MCU 进行擦除和写入操作 这些例子应用在典型的应用系统, 而不是第一次对 FLASH 的初始化写入中 通常, 需要第三方工具才能把第一个应用程序 ( 包括这些演示例子 ) 写入 HCS08 系统内 在应用手册 AN2140 Serial Monitor for MC9S08GB60 中全面地介绍了监控程序 这个引导程序位于 FLASH 的高地址末端的保护存储区域, 使用者可以通过 MC9S08GB60 的异步通信接口 SCI1 对 FLASH 进行擦除 写入或者调试应用程序操作 这个监控程序提供一组初始的二进制监控命令, 这样运行在 PC 机上的主机调试器可以读写存储器和寄存器, 设置断点, 跟踪指令或者执行用户程序 更多的信息参考 AN2140 大多数的第三方调试系统和编程器用背景调试接口来实现所有的写入操作 通常先下载一个小的程序到目标系统的 RAM 然后执行这个程序 这样比用一系列的背景调试命令来操作 FLASH 写入工作更加有效, 所以当有大块的非易失性存储器需要写入时这是个首选的方法 由于在 HCS08 中非易失性存储区已经内嵌在处理器里用来处理实时操作, 所以直接用背景调试命令来控制编程操作也是可以的 一般的, 当主机需要几个个别的位置时会使用这种模式 FLASH 模块时钟的初始化 控制 FLASH 写入和擦除操作的内部状态机使用的内部时钟频率是 10kHz 到 200kHz, 可以通过总线频率分频得到 FLASH 时钟分频寄存器 (FCDIV) 用来设置分频因子 在复位后 FCDIV 只能写一次, 并且在写入完成之前是不允许进行写入和擦除操作的 一般在复位后的复位初始化程序中写此寄存器 41

53 HCS08 系列 MCU 参考手册 ( 第四章片上存储器 ) 分频器必须合理设置使得 FCLK 在 10kHz 到 200kHz 之间 写入和擦除操作都是在固定的时钟周期内完成的, 所以 FCLK 越接近 200kHz, 命令操作完成得越早 例如, 如果 FCLK 是 200kHz, 对 FLASH 一个随机地址的写入需要 4 微秒 如果 FCLK 是 10kHz 同样的字节写入操作需要 60 微秒 参考下面代码段理解下面的论述 代码例子的第一部分是一个相当于给 FCDIV 寄存器设置初始值的程序 第二部分的两行代码将被放置在复位初始化程序中 注意在这里, 没有用指令 MOV 给 FCDIV 赋初始值, 这是因为 FCDIV 寄存器是高端页寄存器而 MOV 指令只能用在立即, 直接和变址寻址方式中 例子中的初始值是假设系统是 kHz 的晶振并且用 FLL 把总线频率倍频到 BUSCLK= MHz FCDIV 的初始值设置用 8 12 来分频 BUSCLK 得到结果 FCLK= kHz( 尽可能的接近 200kHz 但是不能超过 ) InitFCDIV: equ % ;FLASH 时钟分频 ; ; +-DIV0 \ ; +--DIV1 ; +---DIV2 > -- 用 (11+1) 分频 ; +----DIV3 总线频率 /(8*12)~= Hz ; DIV4 ; DIV / ; PRDIV8 -- 用 8 分频 ; DIVLD --- 只读标志位 lda initfcdiv sta FCDIV ; 设置 f Fclk =200kHz 系统要求的 FCLK 至少是 10kHz 这意味着 BUSCK 也必须至少是 10kHz( 因为 FCDIV 的最小分频因子是 1) 这个条件仅用于写入操作和擦除操作, 而读操作则不是必须的 这也意味着低的总线频率可以减少电源的消耗, 但是在进行写入和擦除操作的过程中总线频率不能低于 10kHz 在正常的操作中如果用 post-fll 分频控制器来调整总线频率, 要特别注意在进行写入和擦除操作过程中 FCLK 要求的频率 由于 FCDIV 寄存器只能写一次, 所以它不能动态的调整来适应总线频率的变化 在写入和擦除时, 总线时钟应该改变使 FCLK 进入到规定的范围 许多应用软件并不动态的调整总线时钟, 故这个问题也就不存在了 擦除 FLASH 的一页 (12 字节 ) 和许多应用程序相比, 对 FLASH 的写入和擦除操作是有些复杂的, 因为在对 FLASH 进行写入和擦除操作时, 在 FLASH 之外执行程序是不可能的 这个例子介绍了一个方法来克服这个限制, 即把程序放置在堆栈区, 这样当 FLASH 因为写入和擦除操作而不可用时 CPU 就可以从 RAM 的堆栈区开始执行程序 42

54 HCS08 系列 MCU 参考手册 ( 第四章片上存储器 ) 下面例子的程序代码是在 FLASH 存储器里, 并且可以擦除一页 12 字节的 FLASH( 也就是除了程序所在位置的任何页 ) 由于 HCS08 没有单独的 EEPROM, 所以这个程序是非常有用的 在一个 HCS08 设备里, 可以用一页或多页 FLASH 来存储非易失性的固定数据或者是历史数据 一般地, 应用程序代码的主体, 包括这些 FLASH 擦写程序, 需要放置在 FLASH 的一个块保护区域内 这要求一个 BDM 接口来改变块保护区域的设置, 可以使被保护的代码不会因为应用程序的错误而被擦除或者写入 这个擦除程序 FlshErase1 调用子程序 DoOnStack, 这个程序依次复制一个小的指令序列到堆栈, 然后跳转到堆栈区 再返回位于 FLASH 中的调用程序之前完成 FLASH 的写入和擦除命令 FLASH 的写入和擦除程序的初始几步可以在 FLASH 中执行, 但是命令序列本身是不能在 FLASH 存储器中执行的 ;***************************************************************************** ;*FlashErase1 擦除 FLASH 的一页 (12 字节 ) ;* 入口 :H:X- 要擦除页的地址 ;* 调用规则 :jsr FlshErase1 ;* 调用 :DoOnStack 用到 SpSub ;* 返回 :H:X 没有改变,A=FSTAT 左移 2 位,Z=1 擦除成功,Z=0 违反保护规则和访问错 ;* 误 调用这个程序 BSR/JSR 要用 32 字节的堆栈区 +2 字节 ;****************************************************************************** FLASHErase1 : psha ; 为 DoOnStack 调用调整 sp lda #(mfpviol+mfaccerr) ; 掩码 sta FAST ; 中断命令和清除错误 lda #mpageerase ; 页擦除命令 bsr DoOnStack ; 从堆栈的底部开始执行命令 ais #1 ; 从堆栈中分配数据单元 rts ;Z=0 表示这里有个错误 ;************************* FLASHErase1 开始处的 PSHA 指令把一个空数据放在堆栈区, 这样随后子程序 DoOnStack 可以用指令 LDA SpSubSize+6,sp 取出该数据 在 FLASHErase1 末端的指令 AIS #1 可以在 RTS 之前释放这个字节的位置 由于存在一些从先前的操作中留下来的未知的侵害保护和访问错误 (FPVIOL 或者 FACCERR), 所以 FLASHErase1 中的第二条和第三条指令要清除这些错误, 这样可以保证指令处理器准备好接收新的指令 至于在这个例子中没有检测这些错误, 是因为明确知道正在做什么 然而, 一些应用软件应该包含附加的 FPVIOL 和 FACCERR 检测机制防止无意的错误例如试图擦除受保护的单元 DoOnStack 子程序 这是一个与众不同的子程序, 它把指令移动到堆栈区然后跳转至此, 这样 FLASH 命令子程序就可以在 RAM 的堆栈区完成操作 这就解决了当有写入和擦除操作进行时不能在 FLASH 存储器里执行指令的问题 DoOnStack 子程序在 FLASH 存储器里, 但是当有写入和擦除操作在进行时,CPU 会从堆栈区执行这些指令 ( 也就是片上 RAM) 43

55 HCS08 系列 MCU 参考手册 ( 第四章片上存储器 ) ;****************************************************************************** ;*DoOnStack 把程序 spsub 复制到堆栈区并调用它 ( 也见 spsub) ;* 从 spsub 返回后释放堆栈空间 ;* 允许 FLASH 编程和擦除操作在 RAM 外执行 ( 在堆栈内 ) 当 FLASH 不在存储映像图里 ;* 这个程序可以用作 FLASH 的字节编程和擦除命令 ;*calling Convention: ;* psha ; 保存数据到程序 ( 或者空数据, 如果是擦除命令 ) ;* lda #(mfpviol+mfaccerr) ; 掩码 ;* sta FAST ; 中断命令和清除错误 ;* lda #mbyteprog ; 字节写入命令 ;* jsr DoOnStack ; 执行 RAM 堆栈区代码 ;* ais #1 ; 从堆栈中分配数据单元, 不影响标志位 A 和 CCR ;* 或者用 #mpageerase 代替擦除页 ;* 用 BSR/JSR 调用时占用 29 字节的堆栈 +2 字节空间 ;* 返回 H:X 不变 A=0 and Z=1 没有错误 ;****************************************************************************** DoOnStack: pshx pshh ; 保存指针到 FLASH psha ; 保存命令到堆栈 ldhx #SpsubEnd ; 指向要移动数据的最后一个字节地址到堆栈 SpMoveLoop: lda,x ; 从 FLASH 读取数据 psha ; 移动到堆栈 aix #-1 ; 移动的下一个字节 cphx #SpSub-1 ; 是否结束? bne spmoveloop ; 循环直到整个数据在堆栈 tsx ; 指向刚刚入栈数据的地址 tpa ; 移动 CCR 到 A 作测试 and #$08 ; 检查中断屏蔽位 I bne I_set ;I 已经置 1 则跳转 sei ; 当 FLASH 忙时屏蔽中断 lda SpSubSize+6,sp; 为命令预装数据 jsr,x ; 在堆栈里执行 sub cli ; 清除中断屏蔽 bra I_cont ; 继续从堆栈里出栈 I_set: lda SpSubSize+6,sp; 为命令预装数据 jsr,x ; 在堆栈里执行 sub I_cont: ais SpSubSize+3 ; 释放空间, 共 subbody+h:x+command 个字节 ;H:X FLASH 指针 OK 从 SpSub lsla ; 除非 PVIOL 或者 ACCERR,A=00,Z=1 rts ; 返回 DoOnStack 调用处 ;***************** 首先,DoOnStack 把 FLASH 地址指针 (H:X) 和指令代码 (A) 放在堆栈里, 使这些 CPU 寄存器空闲 H:X 指向 SpSub 子程序的最后字节 接下来的 条指令循环地一次 一个字节地把 FLASH 存储区中的程序移动到堆栈区 当把最后一个字节移动到堆栈区 后,SP 指针指向下一个低位地址, 指令 TSX 首先把 SP 加 1 然后再整体的复制到 H:X 寄存器里 这样 H:X 就指向刚刚移入堆栈区的程序的第一个字节 接下来的几条指令来检测中断是否被屏蔽, 如果中断屏蔽 (I 置 1), 寄存器 A 被赋 44

56 HCS08 系列 MCU 参考手册 ( 第四章片上存储器 ) 值, 该值是对 FLASH 进行写入或擦除的数据 这时堆栈中的程序被调用 如果中断没有被屏蔽, 指令 SEI 用来屏蔽中断, 寄存器 A 赋值,SpSub 子程序被调用 (JSR,X), 指令 CLI 开中断 堆栈子程序在接下来的 节 SpSub 子程序里有介绍 从 SpSub 返回时, 指令 AIS #SpSubSize+3 释放被用于 SpSub 的堆栈空间和相关联的参数 ASLA 移动 PVIOL 和 ACCERR 错误标志到寄存器 A 的高 2 位 如果没有错误此时 A 应该是 SpSub 子程序 SpSub 子程序是被子程序 DoOnStack( 在上面的 有介绍 ) 移动到堆栈里面然后被调用的 ( 从 DoOnStack) 这个子程序完成写入和擦除操作, 然后等到所有的 FLASH 命令都完成后才返回 这些命令是在片上 RAM 的堆栈区的被执行的 这就解决了当有写入和擦除操作进行时不能在 FLASH 里执行指令的问题 ;****************************************************************************** ;*SpSub 这个 SpSub 的变化形式完成在 RAM 中进行 FLASH 编程和擦除操作的所有步骤 ;* SpSub 从 RAM. 复制到堆栈区,SP 复制到 H:X, 接着用指令 JSR 0,X 调用 SpSub 在 RAM 中的 ;* 备份 ;* ;* 当 SpSub 被调用时, 编程需要的数据 ( 擦除操作需要的空数据 ) 在 A 里,FLASH 地址在堆 ;* 栈区 SpSub 的上面, 返回后 PVIOL 和 ACCERR 标志在 A 的 6 位和 位, 如果 A 在返 ;* 回后左移 1 位应该是 0, 除非有 FLASH 错误 ;* 调用它要用 24 字节的堆栈和 2 字节空间 ;****************************************************************************** SpSub: ldhx SpSubSize+4,sp ; 从堆栈区得到 FLASH 地址 sta 0,x ; 向 FLASH 写数据和地址 lda SpSubSize+3,sp ; 得到 FLASH 命令 sta FCMD ; 写 FLASH 命令 lda #mfcbef ; 初始化命令位 sta FSTAT ;[pwpp] 寄存器命令 nop ;[p] 最少需要 4 周期从 w 周期到 r ChkDone: lda FSTAT ;[prpp]fccf 有效 Lsla ;FCCF 现在是 MSB bpl ChkDone ; 如果 FCCF=0 循环 SpSubEnd: rts ; 返回 SpSubSize: equ (*-SpSub) ;**************** 在 SpSub 里,H:X 里装载 ( 用堆栈指针相对寻址的指令 LDHX) 的是 FLASH 写入和 擦除程序的地址 指令 STA 0,X 完成 FLASH 写入和擦除操作指令序列的第一步 接 着是另外一个堆栈指针相对寻址指令 LOAD 用擦除页 PageErase 和字节写入 ByteProgram 命令来给 A 赋值, 并且这个命令码写入 FCMD 接下来的两条指令写 1 到 FSTAT 的 FCBEF 位建立指令并开始写入和擦除操作 指令 STA FSTAT NOP 和 LDA FSTAT 的执行周期在注释区域里用方括号标注, 是 因为在 FSTAT 写寄存器命令之后, 在第一次读取确认 FCBEF 和 FCCF 状态标志之前 4

57 HCS08 系列 MCU 参考手册 ( 第四章片上存储器 ) P 周期是取指令周期,W 周期是寄存器 FSTAT 写周期,r 周期是 FSTAT 读周期 接着, 指令 ASLA 把 FCCF 标志移动到累加器的最高有效位, 并且根据 FCCF 的值来置位或清零 CCR 的 N 位 如果 FCCF 被清 0, 指令 BPL 会引起回转到 ChkDoneE 来重复状态检测 如果 FCCF 被置 1, 则命令已经完成且没有额外的指令需要执行, 循环退出 此时,FLASH 再次出现在存储器映像中, 这样用 RTS 指令返回到在 FLASH 里的调用程序是安全的 4.8. FLASH 的字节编程 这个例子演示了一个简单的程序来向 FLASH 的选定区域写入 假设这个区域先前是空白的 ( 被擦除成 $FF) 且不进行任何错误检测 假定遵守正确的编程操作过程也不会遇到错误, 并且假定程序员知道这个区域不在保护区内, 如果在保护区会引起侵害保护错误 这个例子用到的 DoOnStack 和 SpSub 程序在上面的 和 章节有讲述 ;****************************************************************************** ;*FLASHProg1 FLASH 的字节编程操作 ;* 这个程序在所有的命令完成之后返回 ;* 假设要编程的地址已经擦除过, 这个程序可以从 FLASH 里执行 ;* 入口 :H:X: 指向要编程的 FLASH 字节 ;* A : 包含编程的数据 ;* 调用方法 :jsr FLASHProg1 ;* 调用子程序 :DoOnStack 调用 SpSub ;* 出口 :H:X 无变化,A=FSTAT 左移两个位置 ;* Z=1 写入成功,Z=0 违反保护规则或者是访问错误 ;* 使用 32 字节堆栈空间 +2 字节用于 BSR/JSR 指令 ;****************************************************************************** FLASHProg1: psha ; 暂存入口 A 里的数据 lda #(mfpviol+mfaccerr) ; 掩码 sta FSTAT ; 退出任何当前命令, 清除错误 lda #mbyteprog ; 字节编程命令 bsr DoOnStack ; 从 RAM 的堆栈区执行编程代码 ais #1 ; 释放数据位置 rts ;Z=0 表示有错误 ;************************ 这种 FLASHProg1 和 FLASHErase1 被写入方法的一个优点是这些代码可以驻留在 FLASH 里 当 FLASH 不在存储器映像中时, 只有实际进行 FLASH 写入或擦除操作的代码被拷贝到堆栈中执行 这种方法的一个不足之处是, 在继续进行其它操作之前, 必须完成每个 FLASH 命令 如果应用程序一次只需写入少数的位置, 这个问题不算是很严重 另一方面, 这个方法不适于写入大量的数据块到 FLASH 里面 在那样的情况下可把全部的编程算法都放在 RAM 程序里 突发写入命令可以被队列化, 使得在缓冲中总有一条命令在等待, 以便一旦前一条命令完成, 它可以立即被送入到命令处理器 突发写入模式花费的时间比单个地址编程的方法所花费时间的一半还要少 46

58 HCS08 系列 MCU 参考手册 ( 第五章复位和中断 ) 第五章复位和中断.1 简介 本章介绍了 HCS08 系列 MCU 基本的复位和中断机制以及大部分 HCS08 系列 MCU 的各种复位和中断源, 一些来自外设模块的中断源在本手册的其他章节会做详细介绍, 本章汇总了所有复位和中断源信息以方便参考 有些复位和中断源, 如系统正常操作监视模块 (COP) 看门狗和定期中断定时器, 不属于片上外设系统的部分, 它们有单独的章节 本章介绍了其功能和各种寄存器 有关该系列各个特定 MCU 的复位和中断源的更多信息, 请参考相关的数据手册.2 MC9S08GB60 复位和中断的特征 对于 HCS08 系列的不同 MCU, 其复位和中断源的设置是不同的 本节以 HCS08 系列第一款芯片 (MC9S08GB60) 为例来介绍这些复位和中断源 关于某个特定 MCU 的复位和中断源的更多信息, 可以参考相关的数据手册 复位和中断源包括 : 18 种可能的复位源发现上电复位 (POR) 使能外部 RESET 引脚 COP 看门狗使能和两个溢出时间选择非法地址 ( 在 MC9S08GB60 中没有非法地址 ) 非法操作码检测时钟脉冲发生器失锁或时钟丢失低电压检测使能背景调试主机发的连续命令 2 复位状态寄存器 (SRS) 指出最近一次发生复位的原因 32 个独立的中断向量 ( 减少查询的开销 ) 软件中断指令 (SWI) IRQ 引脚使能, 可选择中断的极性, 电平和触发沿低电压检测使能时钟脉冲发生器失锁或时钟丢失 10 个定时器中断 : 两个溢出中断, 两个总共 8 通道的 TPM 中断 1 个 SPI 中断 6 个 SCI 中断 :2 个 SCI 模块都有 Rx Tx 和错误中断 47

59 HCS08 系列 MCU 参考手册 ( 第五章复位和中断 ) 键盘唤醒 A/D 转换完成周期性从 STOP 模式唤醒的使能和基于内部 1MHz 时钟源或外部时钟源的倍频.3 MCU 复位 复位提供一种从已知的初始条件设置来启动处理的方法 在复位期间, 大部分控制和状态寄存器都设为复位默认值, 从地址 $FFFE~$FFFF 取出两字节的复位向量送到程序计数器 PC 片上外设模块不可用,I/O 引脚初始化设为通用的高阻抗输入引脚无上拉 条件码寄存器 (CCR) 的 I 位被置位来屏蔽中断, 直到用户程序初始化堆栈指针 (SP) 和系统控制设置 复位时,SP 被设为 $00FF, 但是这个地址一般不是 HCS08 系列 MCU 堆栈指针 SP 应该在的地址, 一般来说,SP 在复位初始化期间会被改变的 MCU 默认使用自身的时钟模式 ( 大约是 4MHz 的总线时钟 ), 因此不需要等待外部的振荡器来启动使它稳定 在大多数的系统中, 用户的初始化程序会配置时钟模块使系统在最佳的频率范围内运行.4 计算机正常操作监控模块 (COP) 看门狗 当应用程序没有按照预期执行时,COP 看门狗会强制系统复位 为了防止 COP 复位 ( 当 COP 被使能 ), 应用软件必须周期性地复位 COP 定时器 如果应用软件在 COP 定时器溢出前忘记或者没有复位 COP, 就会产生一个系统复位信号使系统回到可知的开始点 通过设置 SOPT 寄存器 ( 见.8.4 系统选项寄存器 ) 的 COPE 位来设置 COP 看门狗是否可用并控制 COP 看门狗 通过向 SRS 写入任意值来复位 COP 定时器 这个写入动作不会影响到只读 SRS 寄存器的数据, 但会被认为是发送一个复位信号到 COP 定时器 在任何一个复位之后,COP 定时器被使能 因为看门狗本来就是用来检测软件错误的 依靠应用程序的命令来允许看门狗是不可靠的, 如果应用程序中没有使用看门狗, 通过清 SOPT 的 COPE 位是不会引起 COP 复位的 同样,COPT 位可以被用于选择两 个时间溢出周期的中的一个 ( 2 或 2 个总线时钟周期 ) 即使应用程序使用 COPE 和 COPT 的默认设置, 在复位初始化时, 用户仍应该向一次性写入的 SOPT 寄存器写入, 来锁存这些设置, 这样即使应用程序跑飞也不会被意外的改变 对 SRS 的写入 ( 清零 COP 定时器 ) 不能放到中断服务程序 (ISR) 里, 因为即使主程序失败,ISR 可能仍会周期性地执行. 中断 中断提供了一种方法来保存当前 CPU 状态和各寄存器内容, 执行中断服务例程 48

60 HCS08 系列 MCU 参考手册 ( 第五章复位和中断 ) (ISR), 然后恢复 CPU 状态使处理器从中断发生的地方继续执行 这不同于软件中断 (SWI),SWI 是一条程序指令, 而这种中断都是由 IRQ 引脚边缘触发或者连续的 I/O 接收等硬件事件引起的 在特定环境下调试模块也能产生 SWI 软中断 ( 参见 7..9 节 ) 如果一个可用中断源中一个事件发生, 一个相关的只读状态标志位将被置位 当本地中断屏蔽位被置为 1( 使得中断可用 ) 且 CCR 的 I 位为 0( 允许中断 ) 时 CPU 才会对这个事件作出反应 CCR 的中断屏蔽位 (IMASK) 在复位后被置位可以屏蔽所有的中断源 这样在清这一位以允许 CPU 响应中断之前就可以让用户程序初始化堆栈指针并执行其他系统设置 当 CPU 接收到一个有效的中断请求时, 它在完成当前的指令以后响应此中断 中断的执行过程就像 SWI 指令的一个周期一个周期的执行顺序一样, 包括以下步骤 : 1 在堆栈中保存 CPU 寄存器 ; 2 将 CCR 中的 I 位置位来屏蔽中断 ; 3 取出当前等待的最高优先级的中断向量 ; 4 用从中断向量地址处取得的前三个字节的程序信息来填充指令队列 ; 当 CPU 响应中断时,I 位自动置位以防止其他的中断进入而打断 ISR( 称为嵌套中断 ) 通常状态下, 当 CCR 恢复到进入 ISR 前堆栈保留的值,I 位回复到 0 在很特殊的情况下, 即若中断过程也允许响应新的中断, 可在中断服务程序中用 CLI 指令开放中断 I 位可能会被中断清零让其他中断程序可以在不等待第一个中断服务程序结束后就先执行 这种做法不被推荐, 除非是非常有经验的编程人员, 否则会导致一些难以调试的错误, 可用其他编程技巧处理相关问题 中断服务程序由 RTI 指令结束, 用堆栈中的值来恢复 CCR A X 及 PC 寄存器, 用以获得先前被保存的信息 为了能够和 HCS08 兼容,H 寄存器是不会自动的保存和恢复的 因此, 好的编程习惯是 : 在中断服务例程 (ISR) 开始时将 H 压栈, 在 ISR 返回指令 RTI 前将其恢复..1 中断堆栈结构 图 -1 显示了堆栈结构的内容和组织形式 中断之前, 堆栈指针 (SP) 指向堆栈的下一个可用的位置 CPU 寄存器的当前值被储存在堆栈中 依次保存的是从程序计数器中低地址位 (PCL) 开始到 CCR 结束的部分, 在这些寄存器入栈以后,SP 指向堆栈中的下一个可用位置, 这个地址是 CCR 被保存的地址的低一个地址 入栈的 PC 值是主程序中的若中断没有发生所要执行的下一个指令的地址 49

61 HCS08 系列 MCU 参考手册 ( 第五章复位和中断 ) 出栈顺序 低地址方向 中断入栈后的 SP 6 1 CCR 寄存器 2 累加器 A 4 3 变址寄存器的低字节 X* 3 4 程序计数器的高字节 程序计数器的低字节 中断入栈前的 SP 高地址方向 入栈顺序 * 变址寄存器的高半字节 (H) 没有入栈 图 -1 中断堆栈框架当一条 RTI 指令被执行时, 这些值都就会按照出栈的顺序从堆栈中恢复过来 作为 RTI 序列的一部分,CPU 通过读取三个字节的程序信息来装满流水线, 从由堆栈中恢复的 PC 地址开始 由中断触发所修改的状态标志必须在 ISR 返回前清除 一般地, 这个标志应该在 ISR 开始时清零, 这样另一个同源中断发生时, 该状态标志可以记录这个事件, 使得在完成当前 ISR 后, 该事件可被响应..2 外部中断请求 (IRQ) 引脚 外部中断被 IRQSC 状态和控制寄存器管理 当 IRQ 功能可用, 同步逻辑监控引脚是边沿触发还是边沿 / 电平触发 当 MCU 处于停止状态并且系统时钟被关闭时, 一个异步通道被使用以至于 IRQ( 如果被使能 ) 可以将 MCU 从停止模式唤醒..2.1 引脚配置选项为了将引脚中断请求 (IRQ) 输入, 寄存器 IRQSC 的 IRQ 引脚使能控制位 (IRQPE) 必须设为 1 作为 IRQ 输入时, 用户可以选择检测的边沿和电平的极性 (IRQEDG), 不论仅是边沿检测还是边沿和电平同时检测, 事件发生时是直接触发中断还是只置 IRQF 标志, 待软件处理 当 IRQ 引脚被设定为侦测上升沿, 一个可选的下拉电阻比上拉电阻更为有用 BIH 和 BIL 指令可能在引脚设为 IRQ 输入时被用做侦测 IRQ 引脚的电平 V 注意 : 上拉 IRQ 引脚标准电压不低于 DD 0.7V 所有的其他带有上拉电阻的引 V 脚将有 DD 的无负荷度量..2.2 边沿 / 电平触发逻辑同步是用于探测触发边沿的 预先探测触发边沿,IRQ 引脚必须置为空 在一 0

62 HCS08 系列 MCU 参考手册 ( 第五章复位和中断 ) 个总线周期内, 当 IRQ 的输入引脚信号置为逻辑 1, 下个周期变成逻辑 0 时, 下降沿将会被探测到 在一个总线周期内, 当 IRQ 的输入引脚信号置为逻辑 0, 下个周期变成逻辑 1 时, 上升沿将会被探测到 IRQMOD 控制位可以被重新设置为边沿 / 低电平触发模式选择位 在边沿触发模式中, 当一个边沿被侦测时 IRQF 状态标志位置位, 但是标志位保持为 1( 不能被清零 ) 只要 IRQ 引脚还是处于该电平沿..3 中断向量 中断源和局部屏蔽 表 -1 给予出了 MC9S08GB60 中所有中断源的摘要 高优先级的源被定位在表的底部 中断服务程序的高地址字节被定位到向量地址阵列的首地址, 中断服务程序的低地址字节被定位在向量地址阵列的低地址 向量的名字就是 Freescale 提供的通用文件和头文件的标号 当中断条件发生, 相关的标志位被置位 如果该相关的中断屏蔽位为 1, 则中断请求发送到 CPU 在 CPU 的内部, 如果全局中断屏蔽位为 0(CCR 的 I 位 ),CPU 将完成当前的指令, 然后将 CPU 寄存器 PCL PCH X A 和 CCR 入栈,I 位置位, 然后取最高中断优先级的中断向量 然后到中断服务程序中处理 表 -1 MC9S08GB60 中断概述中断优先地址 ( 高 / 低 ) 向量名称模块源使能位描述级 从 低 到 从 $FFCO/FFC1 到 $FFCA/FFCB 不可用的向量空间 ( 对用户程序不可用 ) $FFCC/FFCD Vrti 系统控制 RTIF RTIE 实时中断 $FFCE/FFCF Viic IIC IICIS IICIE IIC 控制 $FFD0/FFD1 Vatd ATD COCO AIEN AD 转换完成 $FFD2/FFD3 Vkeyboard KBI KBF KBIE 键盘引脚 $FFD4/FFD Vsci2tx SCI2 $FFD6/FFD7 Vsci2rx SCI2 $FFD8/FFD9 Vsci2err SCI2 $FFDA/FFDB Vsci1tx SCI1 $FFDC/FFDD Vsci1rx SCI1 $FFDE/FFDF Vsci1err SCI1 TDRE TC IDLE RDRF OR NF FE PF TDRE TC IDLE RDRF OR NF FE PF TIE TCIE ILIE RIE ORIE NFIE FEIE PFIE TIE TCIE ILIE RIE ORIE NFIE FEIE PFIE SCI2 发送 SCI2 接收 SCI2 错误 SCI1 发送 SCI1 接收 SCI1 错误 1

63 HCS08 系列 MCU 参考手册 ( 第五章复位和中断 ) 高 $FFE0/FFE1 Vspi SPI SPIF MODF SPTEF SPIE SPIE SPTIE $FFE2/FFE3 Vtpm2ovf TPM2 TOF TOIE TPM2 溢出 $FFE4/FFE Vtpm2ch4 TPM2 CH4F CH4IE TPM2 通道 4 $FFE6/FFE7 Vtpm2ch3 TPM2 CH3F CH3IE TPM2 通道 3 $FFE8/FFE9 Vtpm2ch2 TPM2 CH2F CH2IE TPM2 通道 2 $FFEA/FFEB Vtpm2ch1 TPM2 CH1F CH1IE TPM2 通道 1 $FFEC/FFED Vtpm2ch0 TPM2 CH0F CH0IE TPM2 通道 0 $FFEE/FFEF Vtpm1ovf TPM1 TOF TOIE TPM1 溢出 $FFF0/FFF1 Vtpm1ch2 TPM1 CH2F CH2IE TPM1 通道 2 $FFF2/FFF3 Vtpm1ch1 TPM1 CH1F CH1IE TPM1 通道 1 $FFF4/FFF Vtpm1ch0 TPM1 CH0F CH0IE TPM1 通道 0 $FFF6/FFF7 Vicg ICG ICGIF (LOLS/LOCS) LOLRE/LOCRE $FFF8/FFF9 Vlvd 系统控制 LVDF LVDIE 低电压检测 $FFFA/FFFB Virq IRQ IRQF IRQIE IRQ 引脚 $FFFC/FFFD Vswi 核 SWI Instruction 软件中断 COP COPE 看门狗定时器 $FFFE/FFFF Vreset 系统控制 LVD LVDRE 低电压检测 RESET pin 外部引脚 Illegal opcode 非法操作码 SPI ICG.6 低电压检测系统 (LVD) MC9S08GB/GT 包含一个预防低电压的保护系统, 在电压变更时用来保护存储器的内容和控制 MCU 系统状态 这个系统是由一个上电复位 (POR) 电路和一个 LVD 电路 ( 用户选择触发电压, 高电压 V LVDH 或者低电压 V LVDL ) 当 SPMSC1 的 LVDE 为高并且触发电压通过 SPMSC2 的 LVDV 位被选择时,LVD 电路被激活 停止模式时 LVD 在所有入口上不可用除非 LVDSE 位被置位 如果 LVDSE 和 LVDE 都被置位, 则 MCU 不能进入停止 1 模式和停止 2 模式, 并且处于 LVD 被激活的停止 3 模式的功耗将会变大.6.1 上电复位操作 当 MCU 刚通电时, 或者当供应电压降落到 VPOR 以下时,POR 电路将会产生一个复位条件 随着供应电压的升高,LVD 电路将保持芯片在复位状态直到供电电压升高到大于 V LVDL 伴随着上电复位,SRS 的 POR 位和 LVD 位都将被置位.6.2 LVD 复位操作 此时 LVD 能被设置为在侦测到一个低电压条件时 ( 即 LVDRE 为 1 时 ) 产生一个复位 LVD 复位发生后,LVD 系统将会保持 MCU 在复位状态直到供应电压升高到高于由 L VDV 设定的电压 当 LVD 复位产生时,LVDV 是不会改变的 伴随着 LVD 复位或 2

64 HCS08 系列 MCU 参考手册 ( 第五章复位和中断 ) 者上电复位,SRS 寄存器的 LVD 位将被置位.6.3 LVD 中断操作 当一个低电压条件被侦测到, 并且 LVD 电路被设置为中断操作 (LVDE 置位,LVDIE 置位,LVDRE 清零 ), 然后 LVDF 将会被置位且一个 LVD 中断将发生.6.4 低电压警告 (LVW) LVD 系统有一个低电压警告标志位用以告诉用户供应电压已经接近 LVD 电压, 但是目前还在 LVD 电压以上 LVW 没有与此相关的中断 LVW 有两个触发电压可供选择, 高的 V LVWH 和低的 V LVWL 触发电压通过 SPMSC2 寄存器的 LVWV 位选择.7 实时中断 (RTI) 在运行模式下实时中断功能经常用来产生基于外部振荡器分频的定期中断 如果它在停止模式中被使能, 可以使用内部 1kHz 时钟源将 MCU 从停机 2 模式唤醒, 或者可以使用内部时钟或外部振荡器将 MCU 从停机 3 模式唤醒 系统实时中断状态和控制寄存器 (SRTISC) 的 RTICLKS 位是用来选择这两种模式的 寄存器 SRTISC 包括一个只读状态标志位, 一个只写确认位, 和一个 3 位的控制值 (RTIS2: RTIS1:RTIS0), 该 3 位用于禁止实时中断的时钟源或者选择 7 个唤醒延迟时间 (8 ms 到 秒 ) 中的一个 1kHz 时钟源产生误差在 30% 的周期 RTI 的本地中断使能 RTIE 可用于屏蔽实时中断 向 RTIS2:RTIS1:RTIS0 写入 0:0:0, 时钟源不可用, 无中断可产生, 从而禁止实时中断.8.6 节系统实时中断状态和控制寄存器 (SRTISC), 给出了各寄存器的细节信息.8 复位 中断以及系统控制寄存器和控制位 涉及到复位和中断系统的寄存器有一个在直接页寄存器区的 8 位寄存器,8 个在高地址页寄存器区的 8 位寄存器 寄存器绝对地址的分配参见本手册的第 4 章有关片上存储器直接页寄存器的介绍 本节通过名称来引用各寄存器和控制位,Freescale 提供的通用文件或头文件习惯将这些名称转化为相应的绝对地址 SOPT 和 SPMSC2 寄存器的一些控制位涉及到操作的模式 这里只提供那些位的简要描述, 而相关函数在第三章操作模块里有更加详细的论述 本章描述了 MC9S08GB60 的寄存器和位的细节 虽然该描述阐述了 HCS08 各个部分, 但应经常仔细的查阅 HCS080 系列的数据手册 3

65 HCS08 系列 MCU 参考手册 ( 第五章复位和中断 ).8.1 中断请求状态和控制寄存器 (IRQSC) 直接页寄存器包括 2 个总是读为 0 的未用位,4 个可读写位, 一个只读状态位, 和一个只写位 这些位都是被用于设置 IRQ 功能, 报告状态和确认 IRQ 事件 第 7 位 第 0 位读 : 0 0 IRQF 0 IRQEDG IRQPE IRQIE IQRMOD 写 : 无效无效无效 IRQACK 复位 : IRQEDG 中断请求 (IRQ) 边沿选择这个可读写控制位用来选择导致 IRQF 被置位的 IRQ 引脚的边沿极性或者电平 IRQMOD 控制位决定 IRQ 引脚是边沿 / 电平触发还是仅仅为边沿触发, 当 IRQ 引脚作为 IRQ 输入引脚使能, 并且设置为侦测引脚上升沿时, 可选择上拉电阻被重新配置为可选择下拉电阻 IRQEDG=1 时, 上升沿或者上升沿 / 高电压触发 IRQEDG=0 时, 下降沿或者下降沿 / 低电压触发 IRQPE IRQ 引脚使能这个可读写控制位使能 IRQ 引脚功能 当这位被置位,IRQ 引脚能被用做一个中断请求 同时, 当该位被置位, 无论是内部上拉或者内部下拉电阻是否可用都取决于 IRQMOD 位的状态 IRQPE=1 时,IRQ 引脚功能可用 IRQPE=0 时,IRQ 引脚功能不可用 IRQF IRQ 标志位当一个中断请求事件发生时该只读位被置位 IRQF=1 时, 侦测到 IRQ 事件 IRQF=0 时, 没有 IRQ 请求 IRQACK IRQ 确认这个只写位被用于确认中断请求事件 ( 写 1 清 IRQF 位 ) 写 0 表示没有意义或无影响 读其通常为 0 如果选择边沿/ 电平侦测 (IRQMOD=1), 当 IRQ 引脚还保持它的电平时 IRQF 不能被清零 IRQIE IRQ 中断使能这个可读写控制位决定 IRQ 事件是否产生硬件中断请求 IRQIE=1 时,IRQF=1 时产生硬件中断请求 IRQIE=0 时, 从 IRQF 发来的硬件中断请求不可用 IRQMOD IRQ 监控模式该可读写控制位选择是边沿 / 电平触发还是边沿触发 IRQED 控制位决定触发中断请求事件的边沿和电平的极性..2.2 节有更加详细的介绍 IRQMOD=1 时, 在下降沿和低电压, 或者上升沿和高电压时 IRQ 事件触发 IRQMOD=0 时, 仅在下降沿或者上升沿时 IRQ 事件触发 4

66 HCS08 系列 MCU 参考手册 ( 第五章复位和中断 ).8.2 系统复位状态寄存器 (SRS) 这个寄存器包括用于指示最近复位源的 7 个只读标志位 当一个调试器通过向 SBDFR 寄存器的 BDFR 位写入 1 强制复位时,SRS 的各标志位都不会被置位 向该寄存器地址写入任意值可清零 COP 看门狗计数器但不影响寄存器的内容 这些位的复位状态取决于 MCU 复位的原因 第 7 位 第 0 位读 : POR PIN COP ILOP 0 ICG LVD 0 写 : 向该寄存器地址写入任意值可清零 COP 看门狗计数器上电复位 : 低电压复位 : 其他复位 : 0 (1) (1) (1) 0 (1) 0 0 POR 上电复位复位是由上电检测逻辑引起 因为内部供应电压在这个时候发生跳跃, 低电压复位 (LVD) 状态位也被置位, 用以表明当内部供应电压下降到 LVD 限度时复位发生 POR=1 时, 复位由 POR 引起 POR=0 时, 复位不是由 POR 引起 PIN 外部复位引脚复位由在外部复位引脚上产生的有效低电压而引发 PIN=1 时, 复位由外部复位引脚引发 PIN=0 时, 复位不是由外部复位引脚引发 COP 计算机正常操作监控 (COP) 看门狗复位因看门狗定时器溢出而引发 复位源可通过 COPE=0 锁住 COP=1 时, 复位原因是 COP 时间溢出 COP=0 时, 复位不是由 COP 时间溢出而引起 ILOP 非法操作码复位由非法操作码而引起的复位 如果 stop 被通过设置 SOPT 寄存器的 STOPE=0 而设为不可用的, 则 STOP 指令被认为是非法操作 如果主动背景调试模式通过设置 BDCSC 寄存器中的 ENBDM=1 设为不可用, 则 BGND 指令被认为是非法操作 ILOP=1 时, 复位由非法操作码引起 ILOP=0 时, 复位不是由非法操作码引起 ICG 内部时钟发生模块复位复位由 ICG 模块引起 ICG=1, 复位由 ICG 引起 ICG=0, 复位不是由 ICG 引起 LVD 低电压触发复位如果 LVD 复位可用 (LVDE=LVDRE=1) 且供应电压下降到低于 LVD 临界电压, 就会产生 LVD 复位 该位由 POR 置位 LVD=1, 复位由 LVD 或者 POR 引起

67 HCS08 系列 MCU 参考手册 ( 第五章复位和中断 ) LVD=0, 复位不是由 LVD 或 POR 而引起的.8.3 系统背景调试强制复位寄存器 (SBDFR) 这个寄存器包括一个只写控制位 一个连续背景命令例如 WRITE_BYTE 必须被写 入 SBDFR 系统忽略应用程序对该寄存器的写入 读始终返回 $00 第 7 位 第 0 位 读 : 写 : 无效 无效 无效 无效 无效 无效 无效 BDFR (1) 复位 : (1) BDFR 只能通过背景调试命令而不能通过用户程序写入 BDFR 背景调试强制复位 一个连续的背景调试模式命令例如 WRITE_BYTE 允许一个外部调试器强制目标系 统复位 向该位写 1 可强制 MCU 复位 但用户程序不可写该位.8.4 系统选项寄存器 (SOPT) 这个寄存器可能在任何时间被读 第 3,2,0 位不被用且始终为 0 这是个一次可写入寄存器所以只在复位后的第一次写入有效 任何后来的尝试向 SOPT 写入都是被忽视的, 用以避免敏感设置的意外变化 SOPT 应该在用户复位初始化程序期间被写入用以实现期望的控制, 即使期望的设置与复位后的设置一样 第 7 位 第 0 位读 : 0 0 COPE COPT STOPE 无效 BKGDPE 无效写 : 无效无效复位 : COPE COP 看门狗使能这个一次写入位在复位后的默认值为 1 COPE=1,COP 看门狗定时器可用 ( 时间溢出后复位 ) COPE=0,COP 看门狗定时器不可用 COPT COP 看门狗溢出时间这个一次写入位在复位后的默认值为 1 18 COPT=1, 选择较长溢出时间 ( 2 个总线时钟周期 ) 13 COPT=0, 选择较短溢出时间 ( 2 个总线时钟周期 ) STOPE Stop 模式使能这个一次写入位在复位后默认值为 0, 使得停止模式不可用 如果停止模式不可用且用户程序试图去执行 STOP 指令, 将产生一个非法操作码复位 STOPE=1,Stop 停止模式可用 STOPE=0,Stop 停止模式不可用 6

68 HCS08 系列 MCU 参考手册 ( 第五章复位和中断 ) BKGDPE 背景调试模式引脚使能此位使能 PTG0/BKGD/MS 引脚功能为 BKGD/MS 当这个位被清零, 该引脚将作为 PTD0 使用, 只是一个输出通用 I/O 口 在任何复位后, 该引脚默认为 BKGD/MS 该引脚通常在任何复位后默认作为 BKGD/MS 使用 BKGDPE=1,BKGD 引脚可用 BKGDPE=0,BKGD 引脚不可用.8. 系统设备识别寄存器 (SDIDH SDIDL) 这个只读寄存器使得开发系统可以识别 HCS08 的 MCU 类型和修正版本号 允许开发软件识别目标 MCU 的特殊存储块, 寄存器和目标 MCU 中的控制位 第 7 位 第 0 位 读 : REV3 REV2 REV1 REV0 ID11 ID10 ID9 ID8 复位 : 0 (1) 0 (1) 0 (1) 0 (1) 读 : ID7 ID6 ID ID4 ID3 ID2 ID1 ID0 复位 : (1) 这个在固件代码中版本号反映这个版本 REV[3:0] 修正版本号 $1806 的高 4 位被硬编码用来反映当前屏蔽设置修正版本号 (0-F) ID[11:0] 识别编号 HCS08 系列的所有的派生版本都有一个唯一识别编号 MC9S08GB/GT 被硬编码为值 $ 系统实时中断状态和控制寄存器 (SRTISC) 该寄存器包含一个只读状态标志位, 一个只写确认位, 三个可读写延时选择, 和三个总是读为 0 的无效位 第 7 位 第 0 位读 : RTIF 0 0 RTICLKS RTIE RTIS2 RTIS1 RTIS0 写 : 无效 RTIACK 无效复位 RTIF 实时中断标志位这个只读状态位显示周期性唤醒定时器已经溢出 RTIF=1, 周期性唤醒定时器溢出 RTIF=0, 周期性唤醒定时器未溢出 RTIACK 实时中断确认位这个只写位用来确认实时中断请求 ( 写 1 可清 RTIF) 向该位写 0 表示没有意义且无效 读它总为 0 RTICLKS 实时中断时钟选择 7

69 HCS08 系列 MCU 参考手册 ( 第五章复位和中断 ) 该读写位选择实时中断的时钟源 RTICLKS=1, 实时中断请求时钟源为外部时钟 RTICLKS=0, 实时中断请求时钟源为内部 1KHz 振荡器 RTIE 实时中断使能这个可读写位使能实时中断 RTIE=1, 实时中断可用 RTIE=0, 实时中断不可用 RTIS2:RTIS1:RTIS0 实时中断延时选择这些可读写位选择 RTI 的唤醒延时 实时中断的时钟源是一个频率为 1KHz 的自时钟源, 它独立于 MCU 的其他时钟源 使用外部时钟源, 延时为通过 RTIS2:RTIS1:RTIS0 分频后的晶振频率 表 -2 实时中断频率 RTIS2:RTIS1:RTIS0 1KHz 的时钟源延时 (1) 使用外部时钟延时 ( 晶振频率 ) 0:0:0 不可用的周期性唤醒定时器不可用的周期性唤醒定时器 0:0:1 8ms 26 分频 0:1:0 32ms 1024 分频 0:1:1 64ms 2048 分频 1:0:0 128ms 4096 分频 1:0:1 26ms 8192 分频 1:1:0 12ms 分频 1:1:1 1024ms 分频 1. 列中的值以 f =1kHz RTI 为基准, 关于这些值的规定参考相关的数据手册.8.7 系统电源管理状态控制寄存器 1(SPMSC1) 这个寄存器是用来控制与低 V DD 检测电路有关行为的 通过设置 LVDE=1, 低电压 使能 通过设置 LVDF=1, 使能低电压检测, 第 -3 位控制与低电压检测相关的行为 LVDAC 位用来响应和清零 LVDF 位 第 7 位 第 0 位读 : LVDF LVDIE LVDRE LVDSE LDVE 写 : 无效 LVDACK 无效无效复位 : LVDF 低电压检测标志位如果 LVDE=1, 这个只读状态位表示一个低电压触发事件 LVDACK 低电压检测确认位这个只写位用于确认低电压监控错误 ( 写 1 可清 LVDF 位 ) 读它总是返回逻辑 0 LVDIE 低电压检测中断使能 8

70 HCS08 系列 MCU 参考手册 ( 第五章复位和中断 ) 该读写位使能从 LVDF 发出的硬件中断请求 LVDIE=1, 当 LVDF=1 时请求一个硬件中断 LVDIE=0, 硬件中断请求不可用 LVDRE 低电压检测复位使能该读写位使能 LVDF 错误来产生一个硬件复位 ( 当 LVDE=1 时 ) LVDRE = 1, 当 LVDF=1 时强制 MCU 复位 LVDRE = 0,LVDF 不会产生一个硬件复位 LVDSE 低电压检测停止使能当 LVDE=1 时, 这个可读写位决定在 MCU 停机模式时低电压监控功能是否可用 LVDSE=1, 停止模式时低电压监控可用 LVDSE=0, 停止模式时低电压监控不可用 LDVE 低电压检测使能这个可读写位使能低电压检测逻辑和限定该寄存器的其他位的操作 LDVE=1,LVD 逻辑可用 LDVE=0,LVD 逻辑不可用.8.8 系统电源管理状态和控制寄存器 2(SPMSC2) 该寄存器被用于报告低压警告功能的状态, 和设置 MCU 停机模式行为 第 7 位 第 0 位读 LVWF 0 PPDF 0 LVDV LVWV PDC PPDC 写无效 LVWACK 无效 PPDACK 上电复位 0 (1) LVD 复位 0 (1) 0 U U 其他复位 0 (1) 0 U U (1) 在复位和 V Supply 已经低于 V LVW 或者 V Supply 在临界以下时,LVWF 会被置位 LVWF 低电压警告标志位该位显示低电压警告状态 LVWF=1, 低电压警告已经发生或者正在发生 LVWF=0, 低电压警告没有发生 LVWACK 低电压警告确认位该位表示低电压警告状态, 如果低电压警告不是正在发生, 向该位写入 1, 使得 LVWF 清零 LVDV 低电压检测电压选择该位选择 LVD 临界电压 (V LVD ) LVDV=1, 选择较高临界电压 (V LVD =V LVDH ) LVDV=0, 选择较低临界电压 (V LVD =V LVDL ) LVWV 低电压警告电压选择该位选择 LVW 临界电压 (V LVW ) 9

71 HCS08 系列 MCU 参考手册 ( 第五章复位和中断 ) LVWV=1, 选择较高临界电压 (V LVW =V LVWH ) LVWV=0, 选择较高临界电压 (V LVW =V LVWL ) PPDF 局部低功耗标志位该位显示 MCU 已退出 stop2 模式 PPDF=1, 从 stop2 模式恢复 PPDF=0, 没有从 stop2 模式恢复 PPDACK 局部低功耗确认位向该位写入 1 可清零 PPDF 位 PDC 低功耗控制位这个一次写入 PDC 位控制是否进入低功耗模式 PDC=1, 低功耗模式可用 PDC=0, 低功耗模式不可用 PPDC 局部低功耗控制位这个一次性写入 PPDC 位控制进入哪种低功耗模式,stop1 还是 stop2 PPDC=1, 如果 PDC 置位, 选择 stop2 PPDC=0, 如果 PDC 置位, 选择 stop1 60

72 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) 第六章中央处理单元 6.1 简介 HCS08 CPU 始于 1979 年, 是 CPU 系列中的最新一代, 它随着基于 NMOS(N 沟道金属氧化物半导体 ) 技术的 M680 系列 CPU 同时产生 接下来 Freescale 开发了基于金属门 CMOS( 互补 MOS) 工艺的 M14680 系列 最终, 这个过程被硅门 CMOS 工艺和 Freescale 更先进的产品 M68HC0 CPU 所取代 之后, 该系列的又一次主要的飞越是 M68HC08, 它大大的扩展了指令集, 提高了 C 语言编译效率 当前的 HCS08 CPU 已经使用了新的设计工艺, 这使它与硅处理技术的迅速发展并驾齐驱 与 M68HC08CPU 相比,HCS08CPU 增加的内容为 : 1LDHX 指令的新寻址方式 : 扩展寻址方式 (EXT) 无偏移量变址方式 (IX) 8 位偏移量变址方式 (IX1) 16 位偏移量变址方式 (IX2) 8 位偏移量堆栈寻址方式 (SP1) 2 对 STHX 和 CPHX 指令, 增加了新的寻址方式 : 扩展寻址方式 (EXT) 8 位偏移量堆栈寻址方式 (SP1) 3 新的背景指令 (BGND) 4 操作总线频率提高到 20MHz 指令队列 ( 或管道 ) 可以提高指令的吞吐能力新的寻址方式包含了 16 位的 H:X 寄存器对, 改进了 C 编译器的效率 BGND 指令仅用于调试情况来执行软件断点 指令队列提高了指令的吞吐量, 因为它使得操作码和一字节的操作信息在指令开始前立刻有效 如果没有队列,CPU 将不得不花费前几个指令周期来等待获取程序信息 在任何流程改变时, 如转移 跳转或者中断,CPU 将执行三个程序取指来填补指令队列 比较 M68HC08 CPU, 指令队列使得在时钟周期和操作顺序方面有了一些改变, 但是与开启指令和花费在填补队列流程改变信息的时间相比, 这些还是很有利处 6.2 编程结构和 CPU 寄存器 HCS08 CPU 寄存器的模型结构如图 6-1 所示, 这些 CPU 寄存器不在微处理器的存 61

73 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) 储器中, 而在 CPU 逻辑内 ( 译者注 : 图 6-1 与图 1-1 相同 ) 7 0 H X V 1 1 H I N Z C 累加器 A 变址寄存器 HX 堆栈指针 SP 程序计数器 PC 条件码寄存器 CCR 进位 / 借位标志 C 零标志 Z 负标志 N 中断屏蔽位 I 半进位标志 H 溢出标志 V 图 6-1 CPU 的寄存器 累加器 (A) 这个通用的 8 位寄存器是 HCS08 主要的数据寄存器 数据可以通过 LDA 指令从存储器或通过 PULA 指令从堆栈读入到 A 数据通过存数指令 STA 存入存储器中或通过堆栈指令 PSHA 将 A 进栈到累加器 A 多种寻址方式给存储器的存取指令带来了更大的灵活性 传送指令可以将数据从累加器 A 传送到寄存器 X 中 (TAX), 或者从寄存器 X 传送到累加器 A 中 (TXA), 或者从累加器 A 传送到 CCR 中 (TAP), 或者从 CCR 传送到累加器 A 中 (TPA) TAP 和 TPA 中的 P 表示处理机状态 A 半交换指令 (NSA) 使 A 中数据的高四位和低四位对调 通常对 A 中的值通过 ADD SUB ASLA RORA INCA DECA AND ORA EOR 等指令执行算术 移位和逻辑操作 其中有些指令如 INCA 和 ASLA, 对 A 中的内容进行操作后放回 A 中 另外一种情况如 ADD 和 AND, 它们有两个操作数 : 一个操作数在 A 中, 另一个操作数在存储器中 算术和逻辑操作的结果都是替代累加器内的值 乘法和除法指令使用 A 作为一个操作数, 并且保存部分值到 A 中 MUL 指令将 X 和 A 中的无符号数相乘并将 16 位结果的高低字节分别存储在 X 和 A 中 DIV 指令将 H A 中的 16 位无符号数除以 X 中 8 位无符号数, 再将商储存在 A 中, 余数放入 H 中 在进行两个 BCD 码数的 ADD 或 ADC 操作时, 需执行十进制调整指令 DAA 来纠正 A 中的值, 使其变为有效的 BCD 码 2 位数 关于指令的详细解释请查阅 6..2 节 BCD 算术运算 显然, 累加器是个非常忙的寄存器, 因此如果能够避免使用累加器是很有益的 例如, 从存储器到存储器的传送指令 (MOV) 就很有用 DBNZ 也很有用, 因为它允许循环 62

74 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) 计数器工作在内存变量中而不是在累加器中 X 寄存器在许多情况下被当作另一个通用的 8 位数据寄存器 有些算术运算操作如清零 加 减 取反 求补和移位也可以使用 X 寄存器 变址寄存器 (H:X) 这个 16 位的变址寄存器事实上是两个独立的 8 位寄存器 (H 和 X) 的合并 变址寻址方式使用 H:X 作为 16 位的基本参考点, 且允许有 16 位偏移量 8 位偏移量和无偏移量的指令, 另外一些变址寻址寄存器在变址用于存取存储器操作时自动增加到 16 位变址寄存器 关于变址寻址方式的详细描述请查阅 节的变址寻址方式 8 位 X 寄存器 (H:X 中的低 8 位 ) 也被当作一个通用的数据寄存器 修改类指令 ( 如 ASLX ASRX CLRX COMX DECX INCX LSLX LSRX NEGX ROLX RORX 和 TSTX) 允许能被累加器所执行的 ALU 操作的子集 要注意的是, 当要改变整个 16 位 H:X 变址寄存器时, 不要用这些指令, 因为这些指令只影响 X 下面的指令序列给出了在 X 上的 16 位形式的 8 位操作实例 ldhx #$0000 ;CLRX 的 16 位形式 aix #1 ;INCX 的 16 位形式 aix #-1 ;DECX 的 16 位形式 cphx #$0000 ;TSTX 的 16 位形式 Load store push 和 pull 指令可用于 X 中, 其寻址方式与用于 A 中的变址寻址相 同 在 16 位 H:X 寄存器中也有取数和存数指令, 但没有提供多种不同的寻址方式 进 栈 (PSHH) 和出栈 (PULH) 指令可用于 H 中, 并且这两个简单的指令可将 16 位变址寄存 器 (H:X) 进栈和出栈 pshx ; 将 H:X 中的低 8 位进栈 pshh ; 将 H:X 中的高 8 位进栈 pulh ; 将 H:X 中的高 8 位出栈 pulx ; 将 H:X 中的低 8 位出栈有时堆栈指针值需要被传送到 HX 寄存器中, 因此 H:X 在堆栈中能当作信息指针使用 堆栈指针总是指向堆栈中的下一个可用的位置, 但是一般情况下变址寄存器应该直接指向数据 因此, 堆栈的 16 位值是通过 TSX 指令传送到 H:X 中, 并加一 因为这个调整,TSX 执行后 HX 指向堆栈数据的最后一个字节 当使用 TXS 指令时求补调整就会发生 ( 通过使用 TXS 这个值会自减 1) 可以认为, 当 16 位地址在 SP 中, 它指向下一个有用堆栈位置, 若在 H:X 中, 则它指向最后一个字节信息 为了与早期的 M08HC0 系列兼容, 中断不在堆栈中保存 H 寄存器 一种好的做法是在中断服务例程中将 PSHH 指令作为第一个指令 ( 保护 H) 并且在程序结束 RTI 之前加上 PULH 指令作为最后一个指令 ( 恢复 H) 可以不要这些指令, 如果确信 H 已经不在中断服务例程中被用到, 并且确信没有 AIX 指令或没有变址寻址方式中的自增指令, 因为这些指令能够使 H 发生改变 如果能容许两个字节的额外程序空间 一个在堆栈中额外的临时空间和运行期间五个总线周期的开销, 那么更安全的做法就是把 PSHH 和 63

75 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) PULH 包含进去作为一种习惯 乘除指令把 X 作为操作数, 且 MUL 将一部分乘积存储在 X 中 MUL 将无符号数 A 和 X 相乘, 并把 16 位结果存于 X:A 中 DIV 指令将 H A 中 16 位无符号数与 X 中的 8 位无符号数相除, 商放入 A 中, 余数放入 H 中 堆栈指针 (SP) 这个 16 位地址指针寄存器用于自动维护 CPU 的一个后进先出 (LIFO) 堆栈 当 CPU 执行绝对转移调用 (JSR) 或相对转移调用 (BSR) 指令时, 它会自动保存返回地址到堆栈中 当子程序最后执行返回指令 (RTS) 时, 该返回地址会自动从堆栈中恢复, 并由此继续执行先前暂停的地方, 在那里子程序被调用 SP 是一个满 16 位寄存器, 所以堆栈可以寻址存储映射区的任何地方, 且它可取不超过芯片可用 RAM 空间大小的任意大小 堆栈指针总是指向堆栈中下一个可用位置 当一个数值要进栈时, 它会被写到 SP 指向的地址中, 随后 SP 会自动减少而指向下一个可用位置 当一个数值要出栈时,SP 首先会自增以指向堆栈中最近进栈的数据, 然后从刚被 SP 指向的地址中读出数据 需要注意的是 SP 指向的数据, 在出栈的过程中不会被改变 如果 SP 指向当前内存的下一个位置, 即指向之前最近存储的数据, 当新的数据进栈时, 会覆盖该位置的数据 如果在复位初始化期间, 堆栈的 RAM 区被清空, 那么堆栈扩充时, 可以通过观察哪些存储单元仍然为空来确定最大深度 为了与早期的 M08HC0 系列兼容, 在复位时 SP 的初值为 $00FF 但 HCS08 应用程序几乎不会把堆栈顶部设到 $00FF, 因为从输入 / 输出 (I/O) 寄存器和控制寄存器的末端到 $00FF 的 RAM 区域, 对于经常被访问的变量很有价值 直接寻址方式可以访问内存从 $0000 到 $00FF 的区域, 这比访问其他内存空间要快 为了与 M08HC0 系列兼容, 复位堆栈指针 (RSP) 指令迫使 SP 的低地址向 $FF 逼近 在 M68HC0 中, 复位后 SP 的值为 $00FF RSP 极少用在 HCS08 中, 因为它不能改变 SP 的高地址, 而且此时, 它没有必要使 SP 的值复位 在新的 HCS08 程序中, 一般初始化 SP 的值指向芯片 RAM 的最高地址 一般情况下, 下面的两个指令序列被包含进复位初始化的头几个指令中 ldhx #ramlast+1 ; 指向 RAM 最高地址的下一位 txs ;hx-1 >SP 一般情况下,RAM 被定义在通用寄存器或者它的头文件中, 在实际应用中被认为是特定的 HCS08 芯片 RamLast+1 使 RAM 高端的下一高地址放入 H:X 中, 因为 TXS 指令在传送时会自动调整它的值 ( 自减 1) 调整使得 SP 指向堆栈中的下一个可用的位置 这样,SP 当前指向 RAM 的最后位置 ( 最高地址值 ), 并且将它作为堆栈的第一个位置 当有值进栈时, 堆栈指针会向低地址方向移动 64

76 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) 出栈顺序 低地址方向 中断入栈后的 SP 6 1 CCR 寄存器 2 累加器 A 4 3 变址寄存器的低字节 X* 3 4 程序计数器的高字节 2 程序计数器的低字节 中断入栈前的 SP 1 6 高地址方向 入栈顺序 * 变址寄存器的高半字节 (H) 不可入栈 图 6-2 中断堆栈框架当请求中断时,CPU 将寄存器的当前内容保存在堆栈中, 在完成中断服务例程后处理器将它们恢复以继续执行之前的程序 响应中断时, 保存到堆栈中的 CPU 寄存器的顺序见图 6-2 在中断前,SP 指向堆栈中的下一个可用位置 每个数据通过 SP 保存到堆栈中指定位置并且 SP 会自减以指向堆栈中的下一个可用位置 结束中断例程的 RTI 指令以相反的顺序出栈来恢复 CPU 寄存器 关于中断的详细描述请查阅 节和. 节的中断 为了与早期的 M08HC0 系列兼容, 中断在堆栈中没有保存 H 寄存器 好的方法是在中断服务例程中将 PSHH 指令作为开头指令并且在服务程序结束 RTI 之前将 PULH 指令 ( 从 H 中恢复 ) 作为最后一条指令 SP 与立即数加法指令 (AIS) 用于为局部变量在堆栈中分配空间 该技术在 C 语言中很普通, 在汇编语言中也很有用 下面的代码例子会示范怎样在堆栈中为局部变量分配和释放空间 关于堆栈技术的详细描述请查阅 6..6 的堆栈相关指令 ais #- ;SP-# >SP ais # ;SP+# >SP 与 SP 相关的变址寻址方式有 8 位和 16 位偏移量堆栈寻址方式 (SP1 和 SP2), 它们允许许多指令去直接访问存储在堆栈中的信息 这对 C 语言的编译效率很重要且同样适用于汇编语言 除了从当前 SP 值处存数或取数而不是访问一个特殊的内存单元, 进栈和出栈指令与存数和取数指令很相似 堆栈必须总是 保持平衡, 这就是说当在堆栈中安置一个字节的操作数时, 必须在一定时间内消去该操作数 当有一个 JSR 或 BSR 时, 应该有一个 RTS 当有一个中断或 SWI 时应该有一个 RTI 当有一个进栈时, 就应该有一个出栈 如果用 AIS 指令为局部变量分配空间时, 就应该有适当的 AIS 指令去释放相同数目的空间 假如在子程序中用了进栈指令, 但是在子程序返回时忘记了相关的出栈指令, 那子 6

77 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) 程序返回 (RTS) 就不能正常工作, 因此当执行 RTS 时 SP 就不能指向正确的返回地址 另外一些错误是当子程序调用自己时, 但是没有正确的方法去限定嵌套循环的次数 该错误的结果是空间会分配在堆栈之外 通常当堆栈操作到达 RAM 变量或 I/O 和控制寄存器的顶端, 入栈就结束, 这认为是栈溢出 此外, 当中断子程序将服务程序里的 I 屏蔽清零时, 会形成中断嵌套, 这时栈溢出也会发生 每个嵌套层给堆栈增加了至少五个字节的存储负荷 程序计数器 (PC) 程序计数器是一个 16 位的寄存器, 包含了下一个待取指令或操作数的地址 在程序正常执行期间, 每次在取指令或取操作数时, 程序计数器自动增加到下一个顺序存放地址 转移 跳转 中断以及返回操作用某个特定地址去装载程序计数器, 而不是用下一个指令地址, 这被叫做流程改变 在复位时, 程序计数器 PC 装入地址 $FFFF 和 $FFFF 中的复位向量 该向量所指即复位状态结束后, 程序计数器所指向的第一条指令的地址 6.2. 条件码寄存器 (CCR) 8 位条件码寄存器包含中断屏蔽位 I 和五位状态标志位 第 6 位和第 位永远为逻辑 1 下图描述了 CCR 各位的信息以及怎样使用这些信息 且图 6-3 标出了 CCR 位及其位置 V 1 1 H I N Z C 条件码寄存器 CCR 进位 / 借位标志 C 零标志 Z 负标志 N 中断屏蔽位 I 半进位标志 H 溢出标志 V 图 6-3 条件码寄存器 (CCR) I 位是中断屏蔽控制位, 与其他位不同的是它在 CCR 中不是处理器状况位 在 CCR 的六个可执行位中,I 位也是复位后唯一可被初始化的位 I 位复位后置为 1, 这使得中断被屏蔽直到堆栈指针被初始化 其他五个状态位 (V H N Z 和 C) 在复位后是未知的, 只有在执行一个指令后才能知道 复位后无须强制这些位为特定的值, 因为直到执行了一个影响它们的指令后, 与这些位相关的条件转移才有意义 这五个状态位标志了运算和其他指令的结果 条件转移指令根据 CCR 内状态位的值来决定是直接转移到一个新的程序地址, 还是继续执行下一个指令 简单的条件转移指令 (BCC BCS BNE BEQ BHCC BHCS BMC BMS BPL 和 BMI) 所导致的转移取决于单一的 CCR 位状态, 而其他转移指令则被两三个更复杂的 CCR 位控制 例 66

78 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) 如, 若布尔表达式 [(Z) (N V)] 真, 则将产生小于等于转移 (BLE) V 位 ( 在较早的 M68HC0 指令集中没有 ) 允许符号转移, 因为 V 是二进制补码的溢出标志位 独立的无符号转移指令建立在 C 位的基础上, 因为 C 位在无符号数操作中为有效溢出标志位 通常, 条件转移就像以下序列那样紧随着使 CCR 位更新的指令后 cmp #- ; 比较累加器 A 和立即数 blt less ; 如果 A< 就转移到 less more: deca ; 如果 A>= 就执行此指令 less: 从测试到条件跳转之间, 其他指令可能被执行, 但它们不应影响到 CCR 位而造成 跳转条件的缺失 举一个普通的例子, 当测试在子程序或函数中运行时, 转移条件直到 子程序返回到主程序才会被执行 这也是参数传递的一种形式 ( 即信息通过条件码返回 到调用程序 ) 思考下面的例子, 怎样检验通过 SCI 收到的字符在有效的 16 进制数字 0 9 a f 或 A F 中, 且它是 ASCII 代码 lda SCI1D ; 从 SCI 中读字符 jsr Upcase ;PC 进栈并转 Upcase 处执行 jsr ishex ; 如果 16 进制数成立继续 bne errorhex ; 如果字符不是 16 进制数就转移 goodhex: nop ; 字符是 16 进制数就在这执行 errorhex: ; 如果它不是 16 进制数就执行此指令 ********************* *ishex- 检查字符是否是有效的的 16 进制数 (0-9,A-F) * 入口 :A 中包含一个不知道的大写字符 * 返回 :A 中原来的字符, 并将 Z 置 1 或清零 * 如果 A 是有效的 16 进制数, Z=1, 否则 Z=0 ********************* ishex: psha ; 原有的字符进栈 cmp #'0' ; 检查是否小于零的 ASCII blo nothex ; 如果 C=0 (Z=0) 就转移 cmp #'9' ; 检查字符 0 到 9 bls okhex ; 如果是 ASCII 0-9 就转移 cmp #'A' ; 检查是否小于 A 的 ASCII blo nothex ; 如果 C=0 (Z=0) 就转移 cmp #'F' ; 检查字符 A 到 F bhi nothex ; 如果大于 F 的 ASCll 就转移 okhex: clra ; 将 Z 置 1 nothex: pula ; 原有字符出栈 rts ; 如果字符是 16 进制, 返回 Z=1 ********************* 开始三条转移指令使得, 接收的字符不是 16 进制序列程序就退出, 在这种情况下 程序员知道如果已执行转移指令,CCR 的 Z 位就会为零 有两种方法可以得到正确的 16 进制数, 但 Z 位可为 0, 亦可为 1, 因此上面的 CLRA 指令用于将 Z 位置 1 在测试 更新 Z 位后执行 PULA 和 RTS 指令, 但是在执行 BNE 的 errorhex 指令之前要用 Z 的 67

79 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) 值 它能正常工作, 是因为程序员保证了 PULA 和 RTS 不会干扰到 Z 位 这个例子中展示了哪些指令不能改变 CCR 标志位, 哪些指令能影响 CCR 标志位 1 I 中断屏蔽标志位中断屏蔽位控制全局中断屏蔽, 当 I=1 时表示禁止所有可屏蔽中断 复位使 I 等于 1 即禁止中断直到应用程序初始化堆栈指针 如果在堆栈指针被初始化前允许中断, CPU 寄存器内容会存储于不适合的内存单元中 用户程序可用 SEI 或 CLI 指令使 I 置位或清零 I 位设置成自动响应中断 ( 包含 SWI 指令 ) 去阻止不必要的中断嵌套 在中断服务例程中包含 CLI 指令可允许中断嵌套, 尽管中断嵌套能在可控制的方式下运作, 但这通常不被推荐, 因为它可能导致微小的系统错误, 这些错误往往难以寻找和纠正 WAIT 和 STOP 指令会自动对 I 位清零, 以保证中断能将 CPU 从 WAIT 或 STOP 模式中唤醒 这些指令以前并非设计成这样, 因此那时在执行 WAIT 或 STOP 之前必须用 CLI 指令清零 I 位 在指令中自动清 I 节省了单独的 CLI 指令所需的程序空间和执行时间, 而且在 I 被清 0 后, 但在 WAIT 或 STOP 指令之前, 是不会产生中断的 中断响应时,CCR 的值在 I 位更新前被保存在堆栈中 ( 在堆栈中 I 位将被置为零 ) 当执行 RTI 指令时,CCR 的值会从堆栈中恢复 当 I 位置 1 时, 该改变生效太迟, 以至于不能立刻阻止紧跟着 SEI 或 TAP 指令边缘的中断 在用 TAP 或 SEI 指令设置 I 位情况时,I 实际上在 TAP 或 SEI 的指令末边缘置位或清零 因此, 当在执行 TAP 或 CLI 指令清 I 时, 即使中断已经处于等待, 在 CLI 或 TAP 清零 I 后下一个指令也将一直执行 遇到 RTI 指令时, 在指令的第一个循环周期 CCR 被恢复, 因此有一个周期的延时, 同时 I 清 0 在 RTI 指令结束之前这将花费几个周期时间 在指令中间 WAIT 和 STOP 也能将 I 位清零, 因此实际上在进入 WAIT 或 STOP 模式之前会有周期延迟 2 V 溢出标志位当二进制补码溢出时置位 执行加法操作时, 如果符号相同的两个操作数相加结果溢出,V 位将被置位 对于一个加法操作, 如果两个操作数的符号位 ( 第 7 位 ) 是相同的, 但是不同于结果的符号位 对于执行减法或比较操作时, 如果一个负数 ( 第七位等于 1) 减去一个正数 ( 第七位等于零 ) 并且结果为正数或者一个正数减去一个负数区结果为负数,V 位被置位 V 位的一个普遍作用是在执行 CMP CPHX CPX SBC 或 SUB 指令后支持符号跳转 (BLT BLE BGE 和 BGT) 这些指令使 ALU 从 CPU 寄存器中减去内存单元的内容并且根据结果改变 V N Z 和 C 位 (C 被用于无符号而不是有符号的跳转 ) 在 BLT 的情况下, 如果 CPU 寄存器小于内存单元, 则条件转移将被执行 有几个指令可以影响 V 位, 聪明的程序员有时会用 V 位的状态去控制程序流 关于指令中影响 CCR 位详述, 请参看附录 A 的指令集 如果两个符号相同的操作数在执行加法指令 (ADD) 和带进位加法指令 (ADC) 后结果的符号相反,V 置位 没有转移指令是只基于 V 的, 所以在一个加法指令后, 需要用两个指令来测试该二进制数的溢出情况 可以这么说,BGE 无溢出,BMI 无溢出在 68

80 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) 其后, 且这两个跳转都暗示了有符号溢出条件 这些操作没有通用性, 但通过查看附录 A 指令集的指令详叙中的布尔等式会理解这些操作数 算术左移和逻辑左移 (ASL 或 LSL) 就像乘以二进制数 2 如果结果的符号与原来数值的符号相反,V 就会被置位 在右移操作后,V 的意义会变得没那么有用了, 但它在某些系统中有特定的逻辑意义 DAA 指令能够改变 V 位, 因此不要在 DAA 指令后, 但还没有执行比较或减法指令时, 尝试符号跳转 3 H 半进位标志位半进位标志位多用于 BCD 码的操作 BCD 码是一个从 0 到 9 的十进制编码, 其编码是一个 4 位二进制数 允许一个简单的 8 进制数去包含两个 BCD 码 16 进制数从 $A 到 $F 被认为是不合法的 BCD 码 ALU 的标准二进制数加法函数也能用于 BCD 数值中, 但是结果需要检验和校正, 改正的结果仍然是 BCD 码 在早期的 M68HC08 中, 程序员必须使用一个小程序, 它使用了 BHCC 和 BHCS 条件转移指令 HCS08 用十进制累加器调整 (DAA) 指令, 该指令简单的检查和改正操作数 H 位仅在少数的几个指令中受影响 在执行中断之前,RTI 复位 H 位的值 TAP 允许程序直接取累加器中所有的 CCR 位 乘法指令 (MUL) 清 H 位会影响其他的操作数, 因此, 在一个加法操作和 DAA BHCC 或 BHCS 指令之前避免使用 MUL 指令, 因为这些指令需要使用 H 的值 加法指令 (ADD 和 ADC) 是仅有的影响 H 位的指令 如果相加结果中的低 4 位向上产生进位, 即 D3 向 D4 有进位, 则 CPU 将半进位标志 H 置 1 尽管 BHCC 和 BHCS 指令能够用来编写 BCD 程序, 但 DAA 指令能将 BCD 操作的结果转换成有效的 BCD 结果, 因为它用了简单的指令来执行整个检测和纠正 关于 BCD 码运算的详细说明请查阅 6..2 节 BCD 运算 4 N 负标志位这个标志位表明结果的最高位为被置 1 被称为负标志位, 因为在两个数求补会产生负数, 如果它的符号位为 1 如果一个操作数包含 16 位数 ( 如 LDHX 或 CPHX) 并且结果的第 1 位为 1, 则 N 位被置位 实际上, 这个标志位有很多用法, 并不仅仅和符号运算有关 正转移 (BPL) 和负转移 (BMI) 是简单的转移, 这个转移仅基于 N 位的值 当 N 代表结果的符号时, 它也用于符号转移指令 BLT BLE BGE 和 BGT 所有的取数 存数 转移 算术 逻辑 交换和循环指令使得 N 位更新 当开始执行中断服务例程时,TAP 允许 N 被从 A 中第 2 位的值直接置位, 同时 RTI 还原 Z 为储存在栈中的值 一个 I/O 口的最典型的位, 一个控制寄存器, 或者一个内存变量能被有效的测试, 因为从一个位置装载或者存储会自动更新 N 位 在以下的代码中, 一个端口被读取, 那儿一个开关被连接到位 7 N 位表示了开关状态, 因此不需要更多的测试 lda PTAD ; 读 I/O 的内容到 A 中 bmi swoff ; 如果最高位为正就转移 swon: nop ; 如果 MSB=0 就执行本语句 69

81 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) swoff: ; 如果 MSB=1(sw off) 就执行本语句 Z 零标志位零标志位被置位表明操作结果为 $00( 或是十六进制的 $0000) 相对转移指令是相等转移 (BEQ) 和不相等转移 (BNE), 该比较指令执行时内部 CPU 寄存器内容会减去存储操作数 如果原始操作数是相等的, 内部减法的结果将为 0,Z 将被置为 1 不论相等 (BEQ) 或不相等 (BNE) 转移, 仅仅是基于 Z 位的简单转移 Z 位仍然被带符号转移 BLE BGT 和无符号转移 BLS BHI 使用 所有的取数 存数 转移 算术 逻辑 交换和循环指令使得 Z 位更新 当开始执行中断服务例程时,TAP 允许 Z 被 A 中第 1 位的值直接置位, 同时 RTI 还原 Z 为储存在栈中的值 图表 6-4CCR 位参数的传递给出了 Z 位被用于把子程序信息传递给主程的例子 关于该信息的详情见附录 A 指令集 6 C 进位 / 借位标志位在加法运行后, 如果源操作数同时大于等于 $80 或者操作数中的一个大于等于 $80 但其结果将比 $80 小, 那么 C 位将被置位 这等同于无符号的溢出 如果存储操作中无符号的值比 CPU 寄存器的无符号的值大, 减法或比较在从内部 CPU 寄存器减去存储器内容后, 那么 C 位将置位 这等用于无符号数的借位或下溢 进位清零 (BCC) 和借位置位 (BCS) 是仅基于 C 位的简单转移 C 位也用于无符号转移指令 BLO BLS BHS 和 BHI 加 减 变换和循环指令使得 C 位被更新 在除指令后, 如果执行非法除零操作那么 C 将置位 TAP 允许 C 根据 A 中第 0 位的值直接被置位, 同时 RTI 将把开始执行中断服务例程时储存在栈里的值存储到 C 中 执行置位转移 (BRSET) 或清零转移 (BRCLR) 指令, 复制测试位到 C 位会使得串并转换更有效 SEC 和 CLC 允许进位标志位置位或清零 这对转移和循环指令结合使用是非常有用的, 且能有效的将子程序的状态信息 (C 位 ) 返回给主程序 由于 C 位包含在转移和循环运算中, 所以这些操作数能容易的被扩充为多字节的操作数 转移和循环操作能被当作 9 位转移, 其中包含一个 8 位操作数或 CPU 寄存器和 CCR 的进位位 在一个逻辑移位后,C 保留位移出的 8 位操作数位 如果接下来使用一个循环指令, 这个 C 位将转移进循环操作数, 同时这个位将获得转移出的其他结束操作数来代替 C 中的数值, 所以它能使用在循环指令中 参照 6..4 转换和循环指令, 可以看到更详细的技术说明 6.3 寻址方式 当 MCU 是从存储器读出信息或是将信息写进存储器时, 寻址方式用于确定信息读或写的精确地址 本节讲解不同的寻址方式及其在程序中的用法 例如, 在一些寻址方式中, 通过编译器确定程序写入地址 而另外一些寻址方式允许 CPU 寄存器的内容来参与影响 这很重要, 因为有时程序在执行期间需要计算地址 每个操作码使 CPU 用某种方式去执行某种操作 许多指令例如 LDA 允许多种不同 70

82 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) 的方式来指定将要操作的内存, 并且每个寻址方式需要有一个独立的操作数 所有这些变量用相同的记忆指令, 并且编译器基于操作域的使用情况知道使用了哪些操作数 在某些情况下, 使用特殊的字符表示特殊的寻址方式 ( 如 # 符号表示立即寻址方式 ) 在另外一些情况下, 操作数的值告诉汇编使用哪些寻址方式 例如, 如果操作数的地址在 $0000 和 $00FF 之间, 汇编会选择直接寻址方式而不是扩展寻址方式 一些指令会使用多种寻址方式 例如 MOVE 指令使用一种方式访问内存的源地址, 而使用另一种方式去访问内存单元中的目的地址 对于这些指令, 两个寻址方式都在文档中被列了出来 所有的转移指令使用相对变址寻址方式 (REL) 去确定转移的目的地址, 但是 BRCLR BRSET CBEQ 和 DBNZ 指令还需要访问内存操作数 这些指令根据使用于内存操作数的寻址方式来分类 在接下来的篇幅中, 将讨论每个寻址方式的用法以及编译器通过什么样的语法定义来知道程序员所需的特殊寻址方式 隐含寻址方式 (INH) 当 CPU 知道需完成指令的所有信息或在源码中没有提供地址信息时使用此寻址方式 通常当用到 ASLA CLRX DAA DIV RSP 和其他一些指令时,CPU 需要把操作数读进 CPU 的内部寄存器 像 CLC 和 SEI 这样的指令会影响 CCR 的某一位 某些内在指令, 像 NOP 和 BGND 指令, 没有操作数 另外一组隐含寻址方式 (INH) 指令通常根据堆栈指针的值访问内存 这类指令包括 : PSHx PULx RTI RTS 和 SWI SWI 使用变址寻址方式来将 CPU 寄存器的值压入堆栈中, 而使用扩展寻址方式来取 SWI 的中断向量, 但是因为指令没有提供显式寻址信息, 所以该指令使用的还是隐含寻址方式 相对寻址方式 (REL) 相对寻址方式用于为转移指令确定目的地址 典型的是, 在转移指令操作数字段中程序员用程序标号或语句来确定目的地址 编译器会计算当前计数器 ( 通常指出了转移指令后下个地址 ) 和标号或操作语句的地址差值 这个差值被称为偏移地址, 是一个 8 位二进制补码数 编译器在目标代码中保存了转移指令的偏移地址 在执行期间,CPU 会确定转移的条件 当转移条件满足时,CPU 将当前的 PC 值加上有符号 16 位偏移量, 结果作为下一指令地址继续执行 偏移地址是 8 位的二进制补码值, 是指目的地址与转移指令目标代码的最后字节所表达的地址之间的偏差, 它必须在 -128 到 +127 范围内 通常会使用跳转到自身的转移指令来创建一个无限循环 在调试期间, 有时会使用这种方法来结束简短的目标代码 而要跳出这个无限循环, 会使用调试主机 ( 通过背景调试命令 ) 来停止程序 检查寄存器和内存或者开始执行新的地址 这个结构在正常的应用程序中不会用到, 除了用程序来检测错误和强制 COP 看门狗超时的情况 ( 无限循环反复执行直到看门狗计数器引发复位 ) 71

83 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) 立即寻址方式 (IMM) 该寻址方式的操作数紧跟在指令的操作码之后 当程序被调入并需要使用外在的值时, 这种寻址方式被使用 # 符号用于告诉汇编器该操作数是数值而不是地址 立即操作数的长度是依据指令隐含的 CPU 寄存器大小来定 例如, 取数到 A 或加 A 指令表示是 8 位操作数, 如是取数到 H:X 或比较 H:X 指令表示是 16 位操作数去匹配 H:X 寄存器的内容 编译器会自动缩位或扩展操作数去匹配指令需要的长度 如果期望是 8 位操作数的地方出现了 16 位操作数, 大多数编译器会给出警告 在立即数前忘记了 # 符号是个普遍的错误 在下面的例子中, 第一个指令告诉编译器要比较 H:X 寄存器的内容和引用值 tableend 第二个指令无# 号, 告诉编译器要比较 H:X 寄存器的内容和保存在 tableend 和 tableend+1 的 16 位内容 ( 使用了扩展寻址 ) 182 C04A 6 00BF cphx #tableend ;H:X 指向 table 的最后? 183 C04D 7 BF cphx tableend ; 比较 tableend 中的值 184 C04F A6 lda #$ ; 取立即数 $ 到 A 中 18 C01 B6 lda $ ; 从地址为 $00 的单元中取数到 A 中 程序员在使用立即寻址方式时要用 # 符号告诉编译器 没有 # 符号, 编译器也不认为 出错, 因为仍然有一个可用的指令 ( 尽管这意味着与程序员期望的不同 ) 直接寻址方式 (DIR) 该寻址方式用于存取直接地址空间 ($0000~$00FF) 中的操作数 它比扩展寻址方式更高效, 因为其地址的高 8 位是默认的而不是直接由指令显式提供的 这节省了一个字节的程序空间和需要存取这个字节的总线周期 程序员不需使用任何特殊的句法去选择这种方式 编译器会对标签或操作数字段的语句进行估算, 如果地址在 $0000 到 $00FF 范围内就会自动选择直接寻址方式 在执行期间,CPU 从随后操作码的操作数字节中的直接地址得到低字节, 附上 $00 高字节, 并用这 16 位的地址 ($00xx) 去访问目的操作数 绝大多数 I/O 和控制寄存器分配在存储器的前 64 或 128 个字节 ( 一些很少用的寄存器被定位在存储器的高 $18xx) 某些片上 RAM 也分配在直接页上, 并且允许频繁的变量访问, 因此直接地址能够被经常使用 复位后堆栈指针指向 $00FF, 建议改变 SP 指针以指向 RAM 的顶端, 以使处于 $00FF 之下的 RAM 地址可用于直接地址变量 6.3. 扩展寻址方式 (EXT) 在扩展寻址方式中, 操作数的 16 位地址被包含在操作码后的两字节目标码内 该寻址方式可用于访问 64K 字节的任何内存单元 通常程序员使用程序标号来具体指定地址, 编译器则用被程序编译的 16 位地址替代 72

84 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) 变址寻址方式 变址寻址方式有时被称为间接寻址方式, 因为 CPU 变址寄存器被当作参考, 偏移地址被加到这个参考地址上, 且使用其结果来存取操作数 在有些情况下变址寄存器中的值会自动增加用来存取目的操作数 通过使变址寄存器指向列表中的下一个操作或自增一个循序计数, 可以有效节省程序步骤 变址寻址方式的重要的特征是 : 操作数地址取决于当前 CPU 变址寄存器的内容而不是已被程序设定的常数地址 这允许程序员写一个简洁的程序循环, 每次循环存入一个值到列表中 也允许程序根据先前程序指令的结果, 寻址不同的地址 ( 而不是取一个在编程时已确定的地址 ) 无偏移量变址方式 (IX) 在这种变址方式中, 变址寄存器 H:X 的内容被用于访问操作数的地址 无偏移量变址 变址加 1 寻址方式 (IX+) 在这种变址方式中,H:X 变址寄存器的内容用来访问目的操作数, 然后 H:X 寄存器自增 1 CBEQ 和 MOV 指令是唯一使用这种变址方式的指令 ldhx #stringbytes ; 指向块的顶端 lda #'' ; 搜索模式 findsp: cbeq x+,foundsp ; 找到 ASCII 空间 ($20)? ;H:X 指向这个空间之后的下一个位置 bra findsp ; 保持搜索 foundsp: aix #-1 ; 跳到上一个空间 位偏移量变址方式 (IX1) 在这种变址方式中, 一个无符号的 8 位偏移量与 H:X 寄存器相加, 得到要访问的操作数地址 偏移量的增加是内部计算, 不会影响到 H:X 的内容 位偏移量变址 变址加 1 寻址方式 (IX1+) 在这种变址方式中, 一个无符号的 8 位偏移量与 H:X 寄存器相加, 得到要访问的操作数地址 偏移量的增加是内部计算, 不会影响到 H:X 的内容 在操作数被访问之后,H:X 寄存器自增 1 CBEQ 指令是唯一使用这种变址方式的指令 位偏移量变址方式 (IX2) 在这种变址方式中, 一个无符号的 16 位偏移量与 H:X 寄存器相加, 得到要访问的操作数地址 偏移量的增加是内部计算, 不会影响到 H:X 的内容 这个寻址方式对于在内存中不同的地点的两个数据的访问特别的有用 以下的例子阐述了这种技术 199 ; 在 RAM 中的字符串与 FLASH 中的字符串比较 200 C ldhx #moveblk1 ; 指向在 RAM 的字符串 C chkloop: cphx #moveblk1+10 ; 看是否到结束 73

85 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) 202 C06A beq stringok ; 如果是, 就执行此语句 203 C06C D6 BF7F lda (stringbytes-moveblk1),x ; 从 FLASH 中取字符串 204 C06F 71 F6 cbeq x+,chkloop ; 比较 FLASH 中的字节 20 C071 9D stringbad: nop ; 若字串不匹配就执行此语句 206 stringok: ; 若字符串匹配就执行此语句 在这个例子中, 两个数据拥有相似的结构 一个在 RAM 中并保存了当前的数据值 另一个数据是 FLASH 内存中的常量值 编译器计算表达式 (stringbytes-moveblk1) 的 值来得到 16 位偏移地址 当变址自增 ( 在 CBEQ 指令中 ),LDA(stringBytes-moveBlk1),X 从 stringbytes 寻址下一个字节, 并且 CBEQ 0,X+,chkLoop 寻址从 RAM 的 moveblk1 的下一个字节 位偏移量堆栈寻址方式 (SP1) 在这种变址方式中, 指令集提供一个无符号的 8 位偏移量与堆栈指针 (SP) 相加, 得到要访问的操作数地址 偏移量的增加是内部计算, 不会影响到 SP 的内容 另外 SP 指向的是堆栈中下一个可用的位置, 而不是最后一个进栈的值, 所以带 0 偏移的读操作通常是无用的 堆栈相对变址方式通常用来访问参量和堆栈中的局部变量 这是 C 代码编程的惯例 根据栈中的数相对访问和使用 H:X 寄存器, 编译器有时会暂时储存当前的 H:X 的值然后转移 SP 到 H:X 从而可以使用 H:X 的变址寻址而不是 SP 的堆栈寻址, 因为比起 H:X 相对寻址来,SP 相对变寻址通常少花一个额外的周期和程序空间 209 C072 A7 FD ais #-3 ; 开辟 3 字节的空间 210 ;sp+1 是一个字节大小的位置 211 ;sp+2:sp+3 是 16 位大小的位置 ( 一个整型变量 ) 212 C074 9E6F 02 clr 2,sp ; 对 sp+2 的高字节清零 213 C077 9E6F 03 clr 3,sp ; 对 sp+3 的低字节清零 214 C07A A6 04 lda #4 21 C07C 9EE7 01 sta 1,sp ; 存 4 到 sp C07F A7 FD ais #-3 ; 开辟 3 字节的空间 220 C081 9 tsx ;SP+1 > H:X 221 C082 6F 01 clr 1,x ; 将当前位置的高字节清零 222 C084 6F 02 clr 2,x ; 将当前位置的低字节清零 223 C086 A6 04 lda #4 224 C088 F7 sta,x ; 存 4 到当前位置 位偏移量堆栈寻址方式 (SP2) 在这种变址方式中, 无符号的 16 位偏移量与堆栈指针 (SP) 相加, 得到要访问的操作数地址 偏移量的相加是内部计算, 不会影响到 SP 的内容 注意 :SP 指向堆栈中下一个可用的位置, 而不是将最后一个值进栈 该寻址方式用于访问栈中深度超过 2 的数据 如果偏移量小于或等于 2, 编译 74

86 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) 器将自动使用更有效率的 SP1 寻址方式 6.4 特殊操作 CPU 的大部分行为在指令集中被详尽描述, 但仍需考虑特殊指令的操作 如, 首次上电时, 在应用程序的开头 CPU 是怎样开始工作的 程序一旦运行起来, 当前指令通常会决定 CPU 接下来做什么 异常事件会导致 CPU 暂时中断正常执行的程序 复位事件会使 CPU 从应用程序的开头重新开始就像执行复位矢量那样 硬件中断可以来自外部引脚或外围模块 这些中断使 CPU 去完成当前指令和中断当前操作数而不是继续执行应用程序中的下个指令 最后, 开发系统能使 CPU 保持在活跃背景模式而不是执行应用程序的下个指令 等待和停止模式分别被 WAIT 和 STOP 指令激活, 然而这种特殊的指令在微控制器 (MCU) 中也影响其他系统 当这些模式被激活时,CPU 当前事件被延缓直到某些硬件事件发生来唤醒 MCU 复位序列 程序运行始于复位事件后 在 HCS08 系列芯片中, 能引发复位的事件有微小的差别, 然而, 还是有最通用的事件源, 如上电复位 外部复位引脚 低电压复位 COP 看门狗超时 非法操作码检查和非法地址访问等 想要了解更详细的关于 MCU 如何确认复位及其来源的信息, 可查阅第五部分复位和中断 想要 HCS08 各型号有关复位的更详细的资料, 可参照适当的技术数据手册 复位事件强制 MCU 立即停止正在执行的任何事件, 同时开始执行复位 处理中的任何指令即使没有完成剩余时钟周期, 也将被立即终止 一个小程序可完成判断复位源是外部还是内部以及导致复位的原因 剩下的时间复位源停下当前活动, 内部时钟停下来以节省功耗 在复位事件的后沿, 时钟重新开始,CPU 从复位条件中退出 在执行程序的第一个指令前,CPU 需执行一个 6 周期的序列来退出复位模式 复位向量的高位字节取自地址 $FFFE, 并存储于程序计数器高字节里 复位向量的低字节取自 $FFFF, 并存储在程序计数器的低字节里 下一个总线周期是自由周期,CPU 不访问内存, 因为向量的低位在 CPU 中不可用 CPU 执行存储器读操作时, 都有一个周期延时, 使得数据有时间进出 CPU 接着 CPU 将程序计数器的地址放在总线上, 来获取指令信息的第一个字节, 然后增加程序计数器 ( 程序计数器的复位向量取自 $FFFE 和 $FFFF) 下一个周期( 复位序列中第五个 ) 取指令信息的第二个字节到指令队列中, 接着下一个周期 ( 复位序列中最后一个 ) 获取第三个字节的指令信息, 并以自己的方式进入指令队列 在 6 周期的复位序列后, 指令队列中指令信息的两个字节对 CPU 是有用的, 而第三个字节有它自己的意义 注意 :MCU 操作会形成串连的行为流, 而系统的不同模块通过该行为流以特定的时间片及时查看不同的事件 为了避免混淆, 请看 总线周 7

87 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) 期的用户手册 中断 正如名字所暗含的, 中断就是打断指令的正常执行 除了 SWI 指令, 中断是由硬件事件引起的, 它不同于正常的操作程序 软中断指令 (SWI), 除了它不能被屏蔽 ( 不能通过使 CCR 寄存器中的 I 位为 1 来禁止 ) 外, 和其他中断相似 当产生一个中断请求时,CPU 在响应中断前完成正在执行的指令 中断序列紧跟着与 SWI 指令同样的逐周期序列, 并且在堆栈上保存 CPU 寄存器的值, 在 CCR 中置位 I 位以屏蔽其他中断, 获得当前正在等待的最高优先级的中断向量, 并且为中断服务例程将程序信息的首 3 字节填入指令队列 更多关于 MCU 识别和处理中断的信息请参考第五部分复位和中断 条件码寄存器中的中断屏蔽位 (I 位 ) 是一个全局的中断屏蔽位 当 I 是 1 时, 中断请求被 CPU 忽略 复位后,I 等于 1 以致中断不可用 在清零 I 位使得允许中断前, 要初始化堆栈指针 为了与早期的 M68HC0 系列兼容, 在复位后堆栈指针自动初始化到 $00FF 这在 HCS08 系统中很少用到, 因为这使得堆栈落在宝贵的直接地址空间 ( 从 $0000 到 $00FF 的空间 ) 通常, 在芯片的 RAM 上, 堆栈指针应被设置成指向最高地址 因为没有直接加载堆栈指针的指令, 所以需要将最后 RAM 单元的地址值先放入 H:X 中, 然后把该值转移到 SP 当从 H:X 向 SP 转移时, 它会自动调整 16 位的值, 以使堆栈指针能指向堆栈中下一个可用位置 ( 这时 RAM 芯片的 H:X 指针指向最靠后的一个可用位置 ) 关于堆栈指针的详细情况请查阅 的堆栈指针 (SP) 同样, 为了与早期的 M68HC0 系列兼容,HCS08 在中断响应时, 不保存 H 在很少情况下, 如果很确信服务例程没有改变 H, 可以选择在中断服务例程中不保存 H 许多指令如 AIX 和变址加 1 寻址的指令, 都能够改变 H 因此, 在中断服务程序中, 通常应该包含 PSHH 指令作为首指令并且在服务程序结束 RTI 之前包含 PULH 指令作为最后一个指令 等待模式 执行 WAIT 指令进入等待模式 此指令将 CCR 的 I 位清零 ( 因此中断能将 MCU 从等待模式中唤醒 ), 然后关闭 CPU 时钟以节省功耗 CPU 维持在低功耗状态下直到中断或复位唤醒它 关于等待模式详细信息请查阅 3. 等待模式 停止模式 执行 STOP 指令进入停止模式 此指令在 CCR 中将 I 位清零 ( 因此中断能从停止模式中唤醒 MCU), 然后关闭 CPU 时钟以节省功耗 依靠 MCU 的其他控制设置, 甚至系统振荡器也被禁止用以节省电源消耗 CPU 保留在低功耗状态直到中断或复位唤醒 76

88 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) 它 唤醒条件取决于振荡器是否完全停止, 并且系统使用了什么类型的时钟 详细描述请查阅 3.6 停止模式 6.4. 背景模式 进入活跃背景模式需要以下条件 :CPU 已经停止执行用户程序的指令, 且背景调试系统正在等待串行命令 CPU 不能进入活跃背景模式直到串行的写控制命令在 BDCSCR 中将 ENDBM 位置位 (BDCSCR 在 BDC 中是一个状态和控制寄存器, 它对用户程序不可用 ) 通常 CPU 接受背景命令进入背景模式是通过背景通讯接口 (BKGD 引脚 ) 实现的 复位后 BKGD 引脚保持低电平 BGKD 指令或对硬件断点事件的响应, 也能使 CPU 进入背景模式 复位后, 在任何用户复位向量和用户指令被执行之前,BKGD 保持低电平, 提供了立刻获得当前目标 MCU 控制权的方法 当系统内存和中断还没有被写入程序时, 这对系统非常重要 BGND 指令仅在开发系统设置软断点时使用, 且不能用于普通应用程序中 如果处于运行状态的程序让 CPU 执行 BGND 指令, 但又没有开发系统连接到 BKGD 引脚上,ENBDM 将为 0 且 BGND 指令将被视为非法操作 硬件设备进入 BDC 系统的唯一方法是通过 BKGD 串行指令, 所以这个断点只有在开发系统连接到 BKGD 并且 ENBDM=1 时才发生 有些 HCS08 MCU 可以有附加的在 CPU 和 BDC 系统外的硬件断点 这些硬件断点能像被开发系统一样被用户程序控制 如果这种类型的硬件断点遇到 ENBDM=1,CPU 完成当前指令然后进入背景运行模式 如果这种类型的硬件断点遇到 ENBDM=0,CPU 将执行一个 SWI 指令, 而不是尝试执行一个非法 BGND 指令 通过恰当的设计, 这种技巧能用来实现 ROM 碎片的处理 参照 7..9 硬件断点和 ROM 补丁 CPU 维持在活跃背景模式直到一个串行的 GO TRACE1 或 TAGGO 指令使它返回用户应用程序 在退出活跃背景模式的 3 个周期序列中,CPU 执行 3 个程序取指来填充指令列队 CPU 无法知道开发系统是否已经影响到了程序存储器, 因此 CPU 总是重填指令队列直到从活动背景模式退出 总线周期的用户观点 在现在的微控制寄存器内, 操作数是流水线的, 不同部分的线路能够及时的在任何特殊的例程中处理不同的消息 为了避免混乱, 有相同的参照依据非常重要, 这样其他系统时序能和这个公用参数相比较 HCS08 的这个公用参考就是总线周期 读总线周期是从 CPU 内部产生地址开始的, 然后地址被传送到内部地址总线 在存储器被访问之后, 存储单元把数据放入内部数据总线上 写周期的开始和读周期相似, 即 CPU 内部的地址产生后传送到内部地址总线, 接着数据被写入现行内部数据总线 这些内部行为不能从片外直接查看, 必须先使它们和外部事件相关联, 例如, 复位事件的时序沿 复位操作的周期序列为 vvfppp, 前两个 v 周期是总线周期, 这里复位 77

89 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) 向量的高位和低位字节都是分别从 $FFFE 和 $FFFF 取得的 f 周期是一个空周期,CPU 不使用内部总线 使用 3 个 p 周期来填满指令队列, 使用目标代码的首 3 个字节作为用户程序代码的起始地址, 该起始地址正好取出复位向量 可以看出, 用户能够分辨每个程序的总线周期, 因为每个 CPU 指令和事件都拥有先前已知的总线周期序列 复位退出由内部总线时钟来同步, 因此有一个不确定的总线周期, 使复位引脚上有效低电平释放, 之后第一个 v 周期才开始 从外部振荡器输入 ( 如果存在 ) 到内部总线时钟有一个传播延时, 该延时不能被量化, 因为用户不可能访问内部总线时钟来进行测量 6. 通过指令类别进行指令集描述 本节将按照类型列出各条指令, 并说明这些指令在上下文应用时怎样被使用 实例代码用来展示通用程序结构的使用方法 6..1 数据传送指令 这组指令用于存储器和 CPU 寄存器间 存储器单元间或者 CPU 寄存器间的数据转移 读入 存储和数据传送等指令根据数据的值自动更新条件码 这允许 BEQ BNE BPL 和 BMI 等在载入 储存和数据传送指令后不需要运行特殊的测试或比较指令, 而立即进行条件转移 加载与存储表 6-1 加载与存储指令 源格式 操作 功能描述 CCR 的影响 V H I N Z C 寻址方式 操作码 操作数 周期 LDA #opr8i LDA opr8a LDA opr16a LDA oprx16,x LDA oprx8,x LDA,X LDA oprx16,sp LDA oprx8,sp 将存储器数值送到累加器 A (M) 0 IMM DIR EXT IX2 IX1 IX SP2 SP1 A6 B6 C6 D6 E6 F6 9ED6 9EE6 ii dd hh ll ee ff ff ee ff ff LDHX #opr16i LDHX opr8a LDHX opr16a LDHX,X LDHX oprx16,x LDHX oprx8,x LDHX oprx8,sp 将存储器数值送到变址寄存器 H:X (M:M + $0001) 0 IMM DIR EXT IX IX2 IX1 SP EAE 9EBE 9ECE 9EFE jj kk dd hh ll ee ff ff ff

90 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) LDX #opr8i LDX opr8a LDX opr16a LDX oprx16,x LDX oprx8,x LDX,X LDX oprx16,sp LDX oprx8,sp STA opr8a STA opr16a STA oprx16,x STA oprx8,x STA,X STA oprx16,sp STA oprx8,sp STHX opr8a STHX opr16a STHX oprx8,sp STX opr8a STX opr16a STX oprx16,x STX oprx8,x STX,X STX oprx16,sp STX oprx8,sp 将存储器数值送到寄存器 X( 变址寄存器 ) 累加器内容送到存储器 变址寄存器内容送到目标地址 寄存器 X 内容送到寄存器 X (M) M (A) (M:M + $0001) (H:X) M (X) IMM DIR EXT IX2 IX1 IX SP2 SP1 DIR EXT IX2 IX1 IX SP2 SP1 DIR EXT SP1 DIR EXT IX2 IX1 IX SP2 SP1 AE BE CE DE EE FE 9EDE 9EEE B7 C7 D7 E7 F7 9ED7 9EE EFF BF CF DF EF FF 9EDF 9EEF ii dd hh ll ee ff ff ee ff ff dd hh ll ee ff ff ee ff ff dd hh ll ff dd hh ll ee ff ff Load A 和 Load X 是从存储器中取出一个 8 位数放入累加器 A 或寄存器 X Load H:X 是从存储器中取出 8 位的数放入寄存器 H, 然后再从下一个存储单元取出 8 位数放入寄存器 X 为了尽可能灵活的访问存储器, 加载 A 或 X 都可使用 8 种不同的寻址方式 而 LDHX 可有 7 种不同的寻址方式来指定所取数的存储单元 下列代码展示了加载指令的某些用法 这些指令在实际程序中并不这样用, 它们只是些无关联的加载指令, 用来说明可用不同方式来访问存储器的多种可行的寻址方式 226 ;load A 不同的寻址方式 227 ; 立即寻址方式例子 (IMM) 228 C089 A6 lda #$ ;IMM - $ 表示 16 进制 229 C08B A6 64 lda #100 ; 十进制数 100(16 进制 $64) 230 C08D A6 3F lda #% ;% 表示二进制 231 C08F A6 41 lda #'A' ;ASCII 值加上单引号 232 C091 A6 8D lda #illegalop ; 标签用来作为立即数的值 233 ; 直接 (DIR) 寻址方式例子 234 C093 B6 lda $ ; 从地址 $00 中加载数值 23 C09 B6 9D lda directbyte ; 标签作为直接地址 236 ; 扩展寻址方式 (EXT) 237 C097 C6 FFFE lda $FFFE ; 复位向量的高字节 238 C09A C lda extbyte ; 标签做为地址来使用 239 C09D C6 C09D lda * ;* 意思是 " 这里 ", 加载操作码 ee ff ff

91 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) 240 C0A0 C6 009D lda fwdref ; 强制扩展寻址方式 241 ; 不是所有的汇编以相同的方式对待 D fwdref: equ directbyte ; 直接指向引用 C0A3 4 C00 ldhx #stringbytes ; 指向 FLASH 中字符串 24 ; 变址寻址方式 ( 和 H:X 变址寄存器对相关 ) 246 C0A6 D lda (moveblk1-stringbytes),x ;IX2 方式 247 C0A9 E6 01 lda 1,x ;IX1 8 位偏移量 248 C0AB F6 lda,x ;IX 没有偏移量 ; 变址寻址方式 ( 和 SP 堆栈指针相关 ) 21 C0AC ldhx #1 22 C0AF 94 txs ; 将临时 SP 指针指向 16 位偏移量 ex 23 C0B0 9ED6 012C lda 300,sp ;SP2-16- 位偏移量 24 C0B4 9EE6 01 lda 1,sp ;SP1 8 位偏移量 因为操作数进入 ALU 需要用到累加器 A, 所以通常在执行算术与逻辑操作时, 要 使用 LDA 指令取得一个值, 以便与第 2 个操作数进行运算 ; 求 A+B 的和 ( 假设总和 <=2) lda opra ; 立即数 A-> 累加器 add oprb ; 立即数 A+ 立即数 B-> 累加器在有些情况下, 可设计程序使得放在累加器 A 中的运算结果能用来作为后续运算的操作数 这样可以避免存储结果的过程以及将下一个操作数放入累加器的必要 ; 求 A+B+C 的和 (( 假设总和 <=2) lda opra ; 立即数 A-> 累加器 add oprb ; 立即数 A+ 立即数 B-> 累加器 add oprc ; 累加器 + 立即数 C-> 累加器下面展示了中间值保存在堆栈中的例程 有时这样做比将临时结果存储在存储器中要快 存储的数量依赖于用何种寻址方式放置临时变量至存储器以及 X 寄存器是否被其他操作所使用 ; 计算 (A+B)-(C+D)( 假设没有进位或借位 ) lda oprc ; 立即数 C-> 累加器 add oprd ; 立即数 C+ 立即数 D-> 累加器 psha ; 中间结果放入堆栈 SP+1 lda opra ; 立即数 A-> 累加器 add oprb ; 立即数 A+ 立即数 B-> 累加器 sub 1,sp ;(A+B)-(C+D) 结果放入累加器 ais #1 ; 释放一个变量 80

92 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) 表 6-2. BSET,BCLR,MOVE 和转移指令 源格式操作功能描述 对 CCR 的影响 V H I N Z C 寻址方式 操作码 操作数 周期 BSET n,opr8a 将存储器的第 n 位置 1 Mn 1 DIR (b0) DIR (b1) DIR (b2) DIR (b3) DIR (b4) DIR (b) DIR (b6) DIR (b7) A 1C 1E dd dd dd dd dd dd dd dd BCLR n,opr8a 将存储器的第 n 位清 0 Mn 0 DIR (b0) DIR (b1) DIR (b2) DIR (b3) DIR (b4) DIR (b) DIR (b6) DIR (b7) B 1D 1F dd dd dd dd dd dd dd dd MOV opr8a,opr8a MOV opr8a,x+ MOV #opr8i,opr8a MOV,X+,opr8a 移动 (M)destination (M)source H:X (H:X) + $0001 in IX+/DIR and DIR/IX+ 0 DIR/DIR DIR/IX+ IMM/DIR IX+/DIR 4E E 6E 7E dd dd dd ii dd dd 4 Modes TAX TXA TAP TPA NSA 将累加器中的数值送到寄存器 X 中将寄存器 X 中的数值送到累加器累加器的数值送到 CCR CCR 的数值送到累加器半字节交换累加器的数值 X (A) INH 97 1 A (X) INH 9F 1 CCR (A) INH 84 1 A (CCR) INH 8 1 A (A[3:0]:A[7:4]) INH 位的置位与清零位的置位 (BSET) 与清零 (BCLR) 指令被认为是位级的存储指令, 但是这些指令通常取一个完整的 8 位的数, 修改指定的位, 然后重写整个 8 位的数 在某些情况下, 例如当目标位置与 RAM 变量不对应时, 这个微妙的操作将导致意想不到的结果 如果 BSET 或 BCLR 指令试图改变非易失性存储单元的某一位, 通常这一位不会改变因为非易失性存储器要求更复杂的操作步骤来改变这一位 某些状态位是通过一定步骤清零的, 这一步骤包括读取状态位后写入到外设模块的 81

93 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) 其他寄存器 使用者会惊讶的发现 BSET 和 BCLR 指令能满足读取状态寄存器的要求 为了避免这样的问题, 只要记住 BSET 和 BCLR 指令是能并行读取 8 位数据的读 - 改 - 写指令 某些控制寄存器或 I/O 寄存器不能够读写同一物理逻辑状态 一般来说, 在这些地址区域不使用读 - 改 - 写指令, 因为它们也许会产生意想不到的结果 276 ; 置位的例子 打开 TE 而不需要改变 RE 277 C0D3 16 1B bset TE,SCI1C2 ;SCI 传输使能 278 ; 功能上与下面是相同的 279 C0D B6 1B lda SCI1C2 ; 读当前 SCCR2 的值 280 C0D7 AA 08 ora #mte ;TE 位上或操作 ( 屏蔽 ) 281 C0D9 B7 1B sta SCI1C2 ; 更新 SCCR2 中的值 存储器到存储器的传送 传送指令有助于像 HCS08 那样只有有限数量的 A 累加器的 MCU 进行运算 MOV 指令从存储器区读一个 8 位数值, 并将这个数值存储到存储区的其他地方 就像加载和存储指令一样,MOV 根据被移动数据的值改变 CCR 中 N 和 Z 标志位 尽管加载和存储指令能够完成 MOV 所做的事情, 但 MOV 不需要使用累加器, 在传送操作期间, 累加器 A 能够正常使用 在许多情况下,MOV 比加载 - 存储指令更快更小 ( 目标代码的大小 ) MOV 指令允许四种从指定源到目标的不同的寻址方式 下面的例子展示了使用传送指令初始化几个寄存器的值 284 C0DB 6E mov #$03,PTAD ;0011 到低 4 位 28 C0DE 6E 0F 03 mov #$0F,PTADD ; 使得低 4 位为输出 286 C0E1 6E F0 01 mov #$F0,PTAPE ; 上拉高 4 位 下面例子展示了使用加载和存储指令实现字符串移动操作数, 而不用传送指令 288 ; 块移动例子, 移动字符串到 RAM 块 289 C0E ldhx #moveblk1 ; 指向目标块 290 C0E7 D6 BF7F movloop1: lda (stringbytes-moveblk1),x ; 得到源字节 291 C0EA beq dunloop1 ; 结束循环的条件 292 C0EC F7 sta,x ; 保存到目标块 293 C0ED C incx ; 下一个位置 ( 假设直接寻址 ) 294 C0EE 20 F7 bra movloop1 ; 继续循环 29 dunloop1: 寄存器传输和半字节交换 TAX 和 TXA 提供了一个有效的方法来把 A 寄存器的值送到 X 寄存器或者把寄存器 X 的值送到寄存器 A 如果寄存器 X 未被使用, 可以用来暂存累加器 A 中的值, 这样累加器就可以用来做其他操作 TAP 和 TPA 提供了一个方法在寄存器 A 到 CCR 中或者从 CCR 到寄存器 A 传送数据 这种操作在类似调试监控等开发工具中比在通常用户程序中使用得更多 半字节 A 交换指令交换累加器 (A) 高半字节和低半字节 8 位数叫做一个字节, 半字节是一个字节的高或低四位 每个半字节都对应一个 16 进制数 这个指令在二进制 82

94 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) 十六进制与 ASCII 码转换中是很有用的, 也可以对 BCD 码进行操作 ********************* *chexl - 使寄存器 A 高半字节转换为 ASCII 码 *chexr - 使寄存器 A 低半字节转换为 ASCII 码 * 入口 : 寄存器 A 包含了任何二进制 (16 进制 ) 的数值 * 返回 : 寄存器 A 中返回的是 ASCII 码字符 ********************* chexl: nsa ; ; 交换高半字节到低半字节 chexr: and #$0F ; ; 去除高半字节 add #$30 ; 现在是 $30 - $3F cmp #$39 ; ; 检查是否 <= 9 bls dunchex ; ; 如果是, 返回 add #7 ; ; 否则调整到 $41-$46 dunchex: rts ; ; 在寄存器 A 中返回 ASCII 码 ********************* 6..2 算术运算指令 算术运算指令包含了传统的加 减 乘和除操作, 还包含常用的指令如加一 减一 清零 求补 (2 进制补码 ) 比较 测试和为处理 BCD 码的十进制调整指令 比较指令实际上就是减操作, 影响 CCR 状态位但结果不返回到 CPU 寄存器 测试指令影响着 N 和 Z 位, 但是不影响被测试的数据 加 减 乘和除指令 表 6-3 加, 减, 乘和除指令 CCR 的影响源格式操作功能描述 V H I N Z C ADC #opr8i ADC opr8a ADC opr16a ADC oprx16,x ADC oprx8,x ADC,X ADC oprx16,sp ADC oprx8,sp ADD #opr8i ADD opr8a ADD opr16a ADD oprx16,x ADD oprx8,x ADD,X ADD oprx16,sp ADD oprx8,sp AIX #opr8i 带进位加 不加进位位 加上立即数的值到 A (A) + (M) + (C) A (A) + (M) H:X (H:X) + (M) M is sign 寻址方式 IMM DIR EXT IX2 IX1 IX SP2 SP1 IMM DIR EXT IX2 IX1 IX SP2 SP1 操作码 A9 B9 C9 D9 E9 F9 9ED9 9EE9 AB BB CB DB EB FB 9EDB 9EEB 操作数 ii dd hh ll ee ff ff ee ff ff ii dd hh ll ee ff ff ee ff ff 周期 IMM AF ii 2 83

95 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) 变址寄存器中 extended to a 16-bit value SUB #opr8i SUB opr8a SUB opr16a SUB oprx16,x SUB oprx8,x SUB,X SUB oprx16,sp SUB oprx8,sp SBC #opr8i SBC opr8a SBC opr16a SBC oprx16,x SBC oprx8,x SBC,X SBC oprx16,sp SBC oprx8,sp MUL DIV 减法 带进位减法 无符号乘法 除法 A (A) (M) A (A) (M) (C) X:A (X) (A) A (H:A) (X) H Remainder 0 0 IMM DIR EXT IX2 IX1 IX SP2 SP1 IMM DIR EXT IX2 IX1 IX SP2 SP1 A0 B0 C0 D0 E0 F0 9ED0 9EE0 A2 B2 C2 D2 E2 F2 9ED2 9EE2 Ii Dd hh ll ee ff ff ee ff ff ii dd hh ll ee ff ff ee ff ff INH 42 INH 2 6 ADD 指令将寄存器 A 中的数据加上存储器内的操作数, 并将结果存储到寄存器 A 中 ADC 将寄存器 A 中的数据加上由前一次操作产生的进位, 再加上存储器中的操作数, 将结果存储到寄存器 A 中 该操作允许执行多字节加法, 就像下例所示 ;8 位操作数到 24 位和的加法 lda opra ; ; 取 8 位操作数到寄存器 A add sum24+2 ; ;24 位和的低字节 sta sum24+2 ; ; 更新 24 位和的低字节 lda sum24+1 ; ; 取 24 位和的中间字节 adc #0; ; 保持任何进位 sta sum24+1 ; ; 更新中间字节 lda sum24 ; ; 得到 24 位和的高字节 adc #0; ; 保持进位到高字节中 sta sum24 ; 更新高字节 AIX 指令将把一个有符号的 8 位 2 进制数加到 16 位 H:X 变址寄存器中, 并将结果 存回到 H:X 中 不像其他的算术指令,AIX 指令不影响 CCR 位 ldhx #tblofstruct ;H:X 指向第一个结构 ;aix 更新指针指向 字节结构的表 aix #; ; 指向下个 字节结构 SUB 指令将累加器 A 中的数据减去存储器中的数据, 然后将结果存储到累加器 A 中 对于这个指令, 进位状态位是借位指示器 SBC 指令将累加器 A 中的数据减去由前一次操作所影响的借位再减去存储器中的数据, 然后将结果存储回寄存器 A 中 这个操作允许执行多字节减法, 就像下面例子所显示的 84

96 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) ;16 位减法... 结果是 16 位 =opre-oprf lda opre+1 ; ;opre 的低 8 字节 sub oprf+1 ;opre( 低字节 )-oprf( 低字节 ) sta result16+1 ; ; 结果的低字节 lda opre ; ;opre 的高字节 sbc oprf ; ;opre( 高字节 )-oprf( 高字节 )- 借位 sta result16 ; ; 结果的高字节 MUL 指令将寄存器 X 中无符号 8 位 2 进制数与累加器 A 中的无符号的 8 位 2 进制数相乘, 然后存储 16 位结果到 X:A 中, 高 8 位的结果存储在 X 中, 低 8 位存储在 A 中 这种情况下不可能发生进位 ( 或者是溢出 ), 其结果将总是适合 X:A 的大小 因此在这个操作后 C 将被清零 DIV 将 H:A 中 16 位无符号数除以 X 中无符号的 8 位值, 然后存储 8 位结果到 A 寄存器中, 余数存储到 H 寄存器中 在 X 中的除数无变化, 因此他能够在随后的操作中被使用 如果商为 0 则 Z 标志被置 1 如果商大于 2 就会有溢出发生, 如果发生溢出或除数为 0 则 C 位被置 1 下面这个除法的例子展示了简单 8 位除以 8 位得到一个 8 位的结果 ; 除法的例子 ;8/8 整数除法...A=A/X clrh ; 清零被除数高字节 lda divid8 ; 加载 8 位被除数 ldx divisor ; 加载除数 div ;H:A/X->A, 余数 ->H sta quotient8 ; 保存结果另一个除法的例子证明了怎样使用 DIV 指令来执行一个 8 位到 8 位的除法, 并得到小数部分的结果 ( 可以精确到小数点后 8 位 ) ;8/8 整数除法, 将余数变为 8 位的小数位 ;r8.f8=a/x, 将余数变为 8 位的小数位 ;16 位的结果 ->(8 位整数 ).(8 位小数 ) clrh ; 清零被除数的高字节 lda divid8 ; 加载 8 位被除数 ldx divisor ; 加载除数 div ;H:A/X->A, 余数 ->H sta quotient16 ; 结果的高字节保存整数部分 clra ; H:A= 余数 :0 div ;H:A/X->A sta quotient16+1 ; 低字节放小数部分第三个除法的例子 用一个 8 位的被除数来除一个大于 8 位的除数得到 16 位的小数结果, 小数点在结果最高位的左边 在二进制中,MSB 的数值是整个数值的一半, 右边的下一位占四分之一, 依次类推 ;8/8 小数除法,16 位的小数结果 ;r16=h/x, 结果是一个 16 位的二进制小数 ; 在 H 和 X 中, 假设基数是在相同的位置 ;16 位的结果 ->.(16 位的小数 ) 8

97 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) ; 除数和被除数都被定义了, 因此用 ldhx 加载 H 和 X clra ; 清零 LS 字节的被除数 ldhx divid8 ;H:X= 被除数 : 除数 div ;H:A/X->A, 余数 ->H sta quotient16 ; 结果的高字节 clra ;H:A= 余数 :0 div ;H:A/X->A sta quotient16+1 ; 结果的低字节 第四个除法例子使用了类似长除法的技术, 完成 16 位整数除以 8 位的数的操作 ; 极大的 16/8 整数除法 ( 相当于长除法 ) ;r16.f8=h:a/x, 结果是 16 位整数,8 位二进制小数 clrh ; 清零被除数的高字节 lda divid16 ; 被除数的高字节 ldx divisor ; 装载除数 div ;H:A/X->A, 余数 ->H sta quotient24 ; 结果的高字节 lda divid16+1 ;H:A= 余数 : 被除数 ( 低字节 ) div ;H:A/X->A, 余数 ->H sta quotient24+1 ; 结果的下一个字节 clra ;H:A= 余数 :0 div ;H:A/X->A sta quotient24+2 ; 结果的小数位 第五个例子展示了通过检查溢出来实现 16 位数除以 8 位数的操作 ; 有限的 16/8 整数除法 ( 带溢出检查 ) ;r8= H:A/X, 结果是 8 位的整数 ldhx divid16 txa ldx divisor div bcs divovrflow sta quotient8 divovrflow ;H:X=16 位的被除数 ;H:A=16 位的被除数 ;X=8 位的除数 ;H:A/X->A, 余数 ->H ; 是否溢出 ; 结果的高字节 ; 溢出转到这里 表 6-4 其他算术指令 源格式操作功能描述 CCR 影响 V H I N Z C 寻址方式 操作码 操作数 周期 INC opr8a INCA INCX INC oprx8,x INC,X INC oprx8,sp 自加 1 M (M) + $01 A (A) + $01 X (X) + $01 M (M) + $01 M (M) + $01 M (M) + $01 DIR INH INH IX1 IX SP1 3C 4C C 6C 7C 9E6C dd ff ff

98 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) DEC opr8a DECA DECX DEC oprx8,x DEC,X DEC oprx8,sp 自减 1 M (M) $01 A (A) $01 X (X) $01 M (M) $01 M (M) $01 M (M) $01 DIR INH INH IX1 IX SP1 3A 4A A 6A 7A 9E6A dd ff ff CLR opr8a CLRA CLRX CLRH CLR oprx8,x CLR,X CLR oprx8,sp 清零 M $00 A $00 X $00 H $00 M $00 M $00 M $ DIR INH INH INH IX1 IX SP1 3F 4F F 8C 6F 7F 9E6F dd ff ff NEG opr8a NEGA NEGX NEG oprx8,x NEG,X NEG oprx8,sp 取补 M (M) = $00 (M) A (A) = $00 (A) X (X) = $00 (X) M (M) = $00 (M) M (M) = $00 (M) M (M) = $00 (M) DIR INH INH IX1 IX SP E60 dd ff ff CMP #opr8i CMP opr8a CMP opr16a CMP oprx16,x CMP oprx8,x CMP,X CMP oprx16,sp CMP oprx8,sp 将累加器和存储器相比较 (A) (M) (CCR Updated But Operands Not Changed) IMM DIR EXT IX2 IX1 IX SP2 SP1 A1 B1 C1 D1 E1 F1 9ED1 9EE1 ii dd hh ll ee ff ff ee ff ff CPHX opr16a CPHX #opr16i CPHX opr8a CPHX oprx8,sp 将存储器和变址寄存器相比较 (H:X) (M:M + $0001) (CCR Updated But Operands Not Changed) EXT IMM DIR SP1 3E 6 7 9EF3 hh ll jj kk dd ff CPX #opr8i CPX opr8a CPX opr16a CPX oprx16,x CPX oprx8,x CPX,X CPX oprx16,sp CPX oprx8,sp 将 X 寄存器和存储器相比较 (X) (M) (CCR Updated But Operands Not Changed) IMM DIR EXT IX2 IX1 IX SP2 SP1 A3 B3 C3 D3 E3 F3 9ED3 9EE3 ii dd hh ll ee ff ff ee ff ff TST opr8a TSTA TSTX TST oprx8,x TST,X TST oprx8,sp 测试是否为负或 0 (M) $00 (A) $00 (X) $00 (M) $00 (M) $00 (M) $00 0 DIR INH INH IX1 IX SP1 3D 4D D 6D 7D 9E6D dd ff ff

99 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) DAA 在 ADD 或者 ADC 的 BCD 函数值后, 十进制调整累加器 (A) 10 U INH 加一 减一 清零和求补加一与减一指令可以通过加 1 或减 1 调整寄存器 A X 或存储器内的数据 清零指令可以将寄存器 A X H 或者存储器中的 8 位数值强制改为 0 求补指令执行了二进制补码操作, 求补指令等同于将一个 8 位有符号数乘以 -1 功能上等同于将寄存器 A X 或者存储器中的数据全部取反, 然后加上一 数据 $80 表示有符号数值负 128, 而不是 +128 因为使用 8 位 2 进制补码所能表示的最大是 +127 如果寄存器的值是 $80 然后若执行 NEGA 指令,CPU 首先反转所有的位获得 $7F, 然后再加 1 得 $80 因为这个原因如果一个数据的符号由正变负, 在 CCR 中的 V 标志位将标示为溢出错误 比较和测试 CMP 指令影响 CCR 的位, 就像相应的 SUB 指令 但其结果不会存储回累加器中, 因此 A 寄存器和存储器操作数是不发生变化的 比较指令是比较寄存器 A X 或 H:X 内容与存储器中的操作数 在 CPHX 指令执行时,M 指向存储位置的首地址,H 与存储器位置 M 相对应,X 和存储器位置 M+1 相对应 CPHX 执行一个 16 位减法指令 ( 存储结果不返回 H:X 中 ) 测试指令是将寄存器 A X 或者存储器中的操作数与 0 相减 这个操作清零了 V, 然后依据测试的结果置位或者清零 N 和 Z, 依据在测试指令的结果而定 测试指令不改变测试数的值 BCD 的计算在 BCD 码数值中,16 进制数表示一个有符号的十进制数值 0 到 9 当两个 8 位的 BCD 数值相加,CPU 实际上执行普通的二进制加法 对于 BCD 码, 这个计算的结果可能不再是一个有效的 BCD 码 根据 ADD 或 ADC 指令对 2 个标准的 BCD 数计算所改变的 H 和 C 标志位,DAA 指令可以对结果进行修正使其成为有效的 BCD 数并且修正 C 标志位的内容使其正确的表示使用 BCD 加法后的结果 在过去完成这些操作是非常复杂的, 需要测试每一个 BCD 数值的结果和 H C 标志位 而 DAA 指令则能很简单的完成这个操作 下面例子展示了 2 种可能的情况 : 当 2 个 8 位 BCD 数据相加, 并且使用 DAA 指令对其进行修正, 以修正 BCD 和设置进位标志位 第一个例子展示了一种情况,BCD 码加法后结果不需要调整 第二个例子展示了另一种情况,BCD 码加法后需要对结果调整 在第二个例子中 DAA 指令对数值加上了一个修正的因数并且调整了进位标志使 88

100 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) 其正确表示 BCD 加法的结果 lda #$11 ;BCD 11 add #$22 ; = 33 daa ; 在这个情况中没有调整 LDA #$9 ;BCD 9 ADD #$7 ;9+7=$B0 ;C=0,H=1,A=$B0 想得到 9+7=116 或者当进位置位时 A=$16 DAA ; 加 $66 和设置进位 ;$B0+$66=$16 进位置位 6..3 逻辑操作指令 这些指令执行 8 位操作数的并行布尔运算 取反指令将指定的寄存器或者存储器中操作数按位取反 其他逻辑指令均包括了两个操作数, 一个是累加器 A, 另一个在存储器中 立即寻址 直接寻址 扩展寻址或变址寻址等寻址方式 ( 和 H:X 或者 SP 相关 ) 也允许用来访问操作数 累加器的每个位都执行与 或和异或操作 逻辑操作的结果返回累加器, 覆盖原来的操作数 表 6-. 逻辑运算指令 源格式操作功能描述 CCR 影响 V H I N Z C 寻址方式 操作码 操作数 周期 AND #opr8i AND opr8a AND opr16a AND oprx16,x AND oprx8,x AND,X AND oprx16,sp AND oprx8,sp ORA #opr8i ORA opr8a ORA opr16a ORA oprx16,x ORA oprx8,x ORA,X ORA oprx16,sp ORA oprx8,sp EOR #opr8i EOR opr8a EOR opr16a EOR oprx16,x EOR oprx8,x 逻辑与 逻辑或 逻辑异或 A (A)&(M) 0 A (A) (M) 0 A (A M) 0 IMM IR EXT IX2 IX1 IX SP2 SP1 IMM DIR EXT IX2 IX1 IX SP2 SP1 IMM DIR EXT IX2 IX1 A4 B4 C4 D4 E4 F4 9ED4 9EE4 AA BA CA DA EA FA 9EDA 9EEA A8 B8 C8 D8 E8 ii dd hh ll ee ff ff ee ff ff ii dd hh ll ee ff ff ee ff ff ii dd hh ll ee ff ff

101 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) EOR,X EOR oprx16,sp EOR oprx8,sp IX SP2 SP1 F8 9ED8 9EE8 ee ff ff 3 4 COM opr8a COMA COMX COM oprx8,x COM,X COM oprx8,sp 取反 M (M)=$FF (M) A (A) = $FF (A) X (X) = $FF (X) M (M)=$FF (M) M (M)=$FF (M) M (M)=$FF (M) 0 1 DIR INH INH IX1 IX SP E63 dd ff ff BIT #opr8i BIT opr8a BIT opr16a BIT oprx16,x BIT oprx8,x BIT,X BIT oprx16,sp BIT oprx8,sp 位测试 (A) & (M) (CCR 更新但是操作树没有改变 0 IMM DIR EXT IX2 IX1 IX SP2 SP1 A B C D E F 9ED 9EE ii dd hh ll ee ff ff ee ff ff 与 或 异或与求补 这些指令提供了基本的与 或 异或以及其他的布尔逻辑计算功能 lda #$0C ; 位形式为 and #$0A ; 位格式为 ; 结果是... $ lda #$3 ; 位格式为 and #$0F ; 位格式为 ; 结果是 $ 从示例中可看出这些操作和 BCLR 指令之间有些类似的地方 然而,BCLR 仅能够 在 $0000 $00FF 存储区间使用,AND 能够清零任何合并位, 而 BCLR 仅能够清零一位 AND 能在几个不同的寻址方式下使用与 A 运算的存储操作数 lda #$0C ; 位格式为 ora #$0A ; 位格式为 ; 结果是 $0E ORA 操作和 BSET 指令之间有一些类似的地方 然而,BSET 仅仅被使用在存储区 $0000 $00FF,ORA 能够设置任何合并位, 而 BSET 仅能够置位一位 ORA 能在几个 不同的寻址方式下使用与 A 运算的存储操作数 异或 常在操作数中用来钳制某些位, 有时被认为是掩码, 每个位在掩码通信时 被设置成在另外的操作码有效位并被反向钳制 下面的例子是读 I/O 端口, 异或通过直 接掩码值 $03 钳制两个最小的有效位, 然后向 I/O 端口写入更新的结果 402 C162 A6 0C lda #$0C ; 位格式为 C164 A8 0A eor #$0A ; 位格式为

102 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) 404 ; 结果是 $ C166 B6 00 lda PTAD ; 读 I/O 端口 A 407 C168 A8 03 eor #$03 ; 低两位异或操作 408 C16A B7 00 sta PTAD ; 更新 I/O 端口 A 取反指令简单的转换操作数的每个位, 不要和求补指令相混淆, 取负指令执行的是 一条算术运算指令, 即等效于与一个负 1 相乘 位测试指令 lda #$C ; 位格式为 coma ; 结果是 位指令将相应存储地址中的操作数与 A 寄存器的每个位进行 与操作 ( 就像 A 与 ), 但是结果不存储在累加器中 在执行位指令后, 根据与操作的结果来置位或清零条件码寄存器 N 和 Z 位, 以实现条件跳转 如果使用 掩码 方法进行编程, 则掩码中的每个对应位被测试, 执行 BIT 指令后, 若测试位均不是 1 则 Z 位被置位 scierror: lda SCI1S1 ; 读 SCI 状态寄存器 bit #(mor+mnf+mfe+mpf) ; 所有的错误标志的掩码 bne scierror ; 如果有任何的错误标志被置位则转移 ;A 中值未被改变 ; 如果有任何的错误标志被置位, 则跳转到此 [ 译者注 : 例如用于判断 SCI1S1 中有关错误标志位的掩码 : mor equ % ; 接收超时的掩码 mnf equ % ; 接收干扰标志的掩码 mfe equ % ; 接收端帧差错的掩码 mpf equ % ; 接收端奇偶校验失败的掩码 如果希望当 SCI1S1 中至少有一个错误标志被置位时转移, 则采用复合掩码 : #(mor+mnf+mfe+mpf) 上述程序则采用这种方法 ] 6..4 移位类指令 所有的移位类指令在由 8 位的 A X 或者存储器空间和在 CCR 中的 C 位组成的 9 位空间上操作 附图描述了在指令执行时 C 位如何配合左移位或者右移位操作 逻辑左移指令就是简单地把 0 移位到有效值的最低位, 最高位移位到进位位 算术移位指令将左移的值作为有符号二进制补码来处理 算术左移类似于乘 2 操作, 算术右移类似于除 2 操作 算术右移 (ASR) 指令复制最初的最高有效位 (MSB) 返回到 MSB, 以保护操作数符号 ASL 和 LSL 就像相同指令不同的写法, 因为在逻辑和算术左右移位上, 均没有功能上的较大区别 表 6-6. 循环移位指令 源格式操作功能描述 CCR 的影响 V H I N Z C 寻址方式 操作码 操作数 周期 91

103 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) LSL opr8a LSLA LSLX LSL oprx8,x LSL,X LSL oprx8,sp LSR opr8a LSRA LSRX LSR oprx8,x LSR,X LSR oprx8,sp ASL opr8a ASLA ASLX ASLoprx8,X ASL,X ASL oprx8,sp ASR opr8a ASRA ASRX ASR oprx8,x ASR,X ASR oprx8,sp ROL opr8a ROLA ROLX ROL oprx8,x ROL,X ROL oprx8,sp ROR opr8a RORA RORX ROR oprx8,x ROR,X ROR oprx8,sp 逻辑左移 ( 和 ASL 相似 ) 逻辑右移 算法左移 ( 和 LSL 相似 ) 算法右移 循环左移 循环右移 0 DIR INH INH IX1 IX SP1 DIR INH INH IX1 IX SP1 DIR INH INH IX1 IX SP1 DIR INH INH IX1 IX SP1 DIR INH INH IX1 IX SP1 DIR INH INH IX1 IX SP E E E E E E66 dd ff ff dd ff ff dd ff ff dd ff ff dd ff ff dd ff ff 在移位中包含了进位, 移位允许将这些操作扩展成多字节操作 下面的例子展示了一个 24 位值被左移或者右移 ;24 位的左移操作 clc ; 清零 C 位 ; 最初的条件 sum24 =hhhh hhhh:mmmm mmmm:llll llll:0 lsl sum24+2 ;C 位转移到低字节的最低位 ; 现在 sum24 =hhhh hhhh:mmmm mmmm:c=l(7):llll lll0 rol sum24+1 ; 转移中间字节 ; 现在 sum24=hhhh hhhh:c=m(7):mmmm mmml:llll lll0 rol sum24 ; 转移高字节 ; 现在 sum24 = C=h(7) : hhhh hhhm : mmmm mmml : llll lll0 92

104 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) ;24 位的右移操作 clc ; 清零 C 位 ; 最初的条件 sum24=0:hhhh hhhh:mmmm mmmm:llll llll lsr sum24 ;C 位转移到高字节的最高位 ; 现在的 sum24=0hhh hhhh:c=h(0):mmmm mmmm:llll llll rol sum24+1 ; 转移中间字节 ; 现在的 sum24=0hhh hhhh:hmmm mmmm:c=m(0):llll lll0 rol sum24+2 ; 转移低字节 ; 现在的 sum24=0hhh hhhm:hmmm mmmm:mlll llll:c=l(0) 6.. 跳转 转移和循环控制指令 这组指令引起指令流程改变, 这意味 CPU 将加载新的地址到程序记数器, 因此在当前指令之后程序将执行在另一个位置上的指令而不是当前指令的下一条指令 在执行序列上, 跳转指令导致无条件跳转到一个新的位置 有件转移和循环控制指令导致了在执行序列上的有条件改变 条件转移和循环控制指令使用了相对寻址方式有条件的转移到一个与转移相关的位置 CCR 的处理器状态指示器根据条件分支或循环控制指令, 决定执行新的地址或是简单的继续执行下个指令 BRA 是个特别的指令, 因为无条件转移总是发生,BRN 也很特别, 因为无条件转移从不发生 ( 它的功能与占 2 字节的目标码和 3 时钟周期的 NOP 指令相同 ),BIL 和 BIH 也很特别是因为它们使用 IRQ 引脚的状态而不是 CCR 中的条件位来决定是否需要转移 源格式操作功能描述 JMP opr8a JMP opr16a JMPoprx16,X JMP oprx8,x JMP,X 表 6-7 跳转和无条件转移指令 CCR 影响 V H I N Z C 跳转 PC 跳转地址 寻址方式 DIR EXT IX2 IX1 IX 操作码 BC CC DC EC FC 操作数 dd hh ll ee ff ff BRA rel 无条件转移 无测试 REL 20 rr 3 BRN rel 不转移 使用 3 个总线周期 REL 21 rr 3 BEQ rel 相等转移 如果 (Z) = 1 转移 REL 27 rr 3 BNE rel 不等转移 如果 (Z) = 0 转移 REL 26 rr 3 BCC rel 进位清 0 转移 如果 (C) = 0 转移 REL 24 rr 3 BCS rel 进位置位转移 ( 和 BLO 相似 ) 如果 (C) = 1 转移 REL 2 rr 3 BPL rel 如果正的转移 如果 (N) = 0 转移 REL 2A rr 3 BMI rel 如果负的转移 如果 (N) = 1 转移 REL 2B rr 3 BIL rel 如果 IRQ 引脚低电平转移 如果 IRQ 引脚 = 0 转移 REL 2E rr 3 BIH rel 如果 IRQ 引脚如果 IRQ 引脚 = REL 2F rr 3 周期

105 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) BMC rel BMS rel BHCC rel 高电平转移中断掩码清零转移中断掩码置位转移半进位清零转移 1 转移 如果 (I) = 0 转移 REL 2C rr 3 如果 (I) = 1 转移 REL 2D rr 3 如果 (H) = 0 转移 REL 28 rr 3 BHCS rel BLT rel BLE rel BGE rel BGT rel BLO rel BLS rel BHS rel BHI rel 半进位置位转移 如果少于转移 ( 正的操作数 ) 如果少于并相等则转移 ( 正的操作数 ) 如果多于或相等则转移 ( 正的操作数 ) 如果多于则转移 ( 正的操作树 ) 如果低电平则转移 ( 和 BCS 相似 ) 如果低电平并相同转移如果高电平或者相同转移 ( 和 BCC 相似 ) 如果高电平转移 无条件跳转和转移指令 如果 (H) = 1 转移 REL 29 Rr 3 如果 (N V ) = 1 转移 如果 (Z) (N V) = 1 转移 如果 (N V) = 0 转移 如果 (Z) (N V) = 0 转移 REL 91 rr 3 REL 93 rr 3 REL 90 rr 3 REL 92 rr 3 如果 (C) = 1 转移 REL 2 rr 3 如果 (C) (Z) = 1 转移 REL 23 rr 3 如果 (C) = 0 转移 REL 24 rr 3 如果 (C) (Z) = 0 转移 REL 22 rr 3 跳转 (JMP), 转移 (BRA) 和无转移 (BRN) 指令是无条件的, 不依靠任何 CCR 位的状态 JMP 可以跳转到 64K 字节地址空间的任何一个位置, 而转移指令被限制在当前位置的 -128 到 +127 的区域空间 下面例子的指令使用了 JMP 指令来扩展条件转移的范围 对每一个条件转移指令来说, 均有相反条件操作的转移指令存在 例如相对转移指令, 就有相等转移指令 (BEQ) 和不相等转移指令 (BNE) 等等 假如写出了下面的指令 ;beq faraway ; 多于 128 字节 汇编程序就会标志出一个错误, 因为超过了 128 字节的距离 也可以使用 BNE 来替换 BEQ, 那执行起来就像下面这个跳转指令了 aroundj: bne aroundj jmp faraway ; 如果不相等则转移 ; 如果相等则转移 ; 如果不相等转移到这里 94

106 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) 简单转移简单转移仅仅依靠单个条件状态 (CCR 位或者 IRQ 引脚状态 ) 表 6-8 简单转移指令摘要 转移条件 如果真则转移 如果假则转移 Z BEQ BNE C BCS BCC N BMI BPL IRQ 引脚 BIH BIL I BMS BMC H BHCS BHCC 有符号转移有符号数的操作均可使用用于诸如 : 小于转移 (BLT), 小于等于转移 (BLE), 大于等于转移 (BGE) 和大于转移 (BGT) 等指令 简单转移 相等转移 (BEQ) 和不相等转移 (BEN) 等指令也可以使用 M68HC0 系列没有 CCR 中 V 位, 因此它不能够进行有符号转移 有符号和无符号转移的不同点是有符号转移使用 N 和 V 的异或来代替 C 位作为控制无符号转移的布尔条件 N 和 V 的异或提供了一个高于 +127(+32,767) 或者低于 128( 32,768) 溢出标志 C 位超过 +2(+6,3) 就显示出溢出 无符号转移小于转移 (BLO) 小于等于转移(BLS) 大于等于转移(BHS) 和大于转移 (BHI) 用在无符号数运算 简单转移 相等转移和不相等转移也能用在无符号数运算 表 6-9 位转移和转移控制 源格式操作功能描述 CCR 的影响 V H I N Z C 寻址方式 操作码 操作数 周期 BRCLR n,opr8a,rel 如果存储单元中第 n 位在为 0 则转移 如果 (Mn) = 0 则转移 DIR (b0) DIR (b1) DIR (b2) DIR (b3) DIR (b4) DIR (b) DIR (b6) DIR (b7) B 0D 0F dd rr dd rr dd rr dd rr dd rr dd rr dd rr dd rr 9

107 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) BRSET n,opr8a,rel CBEQ opr8a,rel CBEQA #opr8i,rel CBEQX #opr8i,rel CBEQ oprx8,x+,rel CBEQ,X+,rel CBEQ oprx8,sp,rel DBNZ opr8a,rel DBNZA rel DBNZX rel DBNZ oprx8,x,rel DBNZ,X,rel DBNZ oprx8,sp,rel 如果存储单元中第 n 位在为 1 则转移 相比较和如果相等则转移 减 1 后结果不为 0 则转移 如果 (Mn) = 1 则转移 如果 (A) = (M) 转移如果 (A) = (M) 转移如果 (X) = (M) 转移如果 (A) = (M) 转移如果 (A) = (M) 转移如果 (A) = (M) 转移 A X 或 M 中的值减 1, 如果 (result) 0 则转移 DBNZX 影响 X 不影响 H DIR(b0) DIR(b1) DIR(b2) DIR(b3) DIR(b4) DIR(b) DIR(b6) DIR(b7) DIR IMM IMM IX1+ IX+ SP1 DIR INH INH IX1 IX SP A 0C 0E E61 3B 4B B 6B 7B 9E6B dd rr dd rr dd rr dd rr dd rr dd rr dd rr dd rr dd rr ii rr ii rr ff rr rr ff rr dd rr rr rr ff rr rr ff rr 位条件转移 这些转移指令测试直接寻址空间 ($0000 $00FF) 中的操作数的一个单独的位, 如果测试位被置 1,BRSET 则跳转, 如果测试位为 0,BRCLR 则跳转 尽管这个操作数看起来像被限制在存储位置上, 但它包含了所有的 I/O 和控制寄存器空间和一些 RAM 中的一部分重要的位置, 这些位置用来存放程序中的变量 对于每个位置都有独立的操作数, 这些指令有着特别的效果, 仅需要 3 字节的目标代码和 个总线周期 waitrdrf: brclr RDRF,SCI1S1,waitRDRF ; 循环直到 RDRF 被置位 brclr OneSecond,flags,skipUpdate updatetime: bclr OneSecond,flags ; 承认一个 sec 标志 skipupdate: 循环控制 CBEQ 指令比较累加器和某个存储位置的内容, 如果它们彼此相等就跳转 CBEQA 和 CBEQX 允许寄存器 A 或 X 与一个立即数相比较 与 CBEQ 指令相关的 H:X 变址操作的特殊点是当比较 A 和变址存储位置的内容后 H:X 会自动增加 这些变化可被用来寻找存储器中特殊的值, 例如字符串最后的空值 一个返回值或一个结束标志 CBEQ 其他的变化可用来作为存储区域的循环记数 ( 增加或减少该循环记数可通过另外的在循环中的指令来实现 ) lda #$0D ;ASCII <cr> cbeq opra,gotcr ; 如果立即数等于 $0D 则跳转 ; 这里的立即数可以是任何数除了 <cr> gotcr: ; 如果立即数是 <cr> 则跳转, 96

108 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) ; 相似的, 但是立即数寻址方式代替了直接寻址方式 lda SCI1DRL ;read SCI character ; 读 SCI 字符 cbeqa #$0D,gotCR ; 如果它是 <cr> 则跳转讲解 CBEQ 指令的其他例子可以在 节无偏移量变址寻址和 16 位偏移量变址寻址 (IX+) 与 节 16 位偏移量变址寻址 (IX2) 的地方找到 DBNZ 指令对寄存器 A X 或存储区域的值减 1, 如果结果值不为 0 便转移 这提供了一个有效的实现循环计数的方法 lda #4 ; 循环记数 sta directbyte ; 保存在 RAM 中 looptop: nop ; 开始程序循环 dbnz directbyte,looptop ; 循环直到计数值到 ; 在堆栈中使用局部量来循环记数 lda #4 ; 循环记数 psha ; 将循环记数压栈 looptop1: nop ; 开始程序循环 dbnz 1,sp,loopTop1 ; 循环直到计数值到 6..6 相关堆栈指令 表 相关堆栈指令 源格式操作功能描述 CCR 的影响 V H I N Z C 寻址方式 操作码 操作数 周期 RSP TXS TSX JSR opr8a JSR opr16a JSR oprx16,x JSR oprx8,x JSR,X BSR rel 复位堆栈指针变址寄存器的内容送到堆栈指针堆栈指针的内容送到变址寄存器 跳转到子程序 转移到子程序 SP $FF (High Byte Not Affected) INH 9C 1 SP (H:X) $0001 INH 94 2 H:X (SP) + $0001 INH 9 2 PC (PC) + n (n = 1, 2, or 3) Push (PCL); SP (SP) $0001 Push (PCH); SP (SP) $0001 PC Unconditional Address PC (PC) + $0002 push (PCL); SP (SP) $0001 push (PCH); SP (SP) $0001 PC (PC) + rel DIR EXT IX2 IX1 IX BD CD DD ED FD dd hh ll ee ff ff 6 6 REL AD rr 97

109 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) RTS SWI RTI PSHA PSHH PSHX 子程序返回 软件中断 中断返回 将累加压栈 将寄存器 H( 变址寄存器的高位 ) 压栈 将寄存器 H( 变址寄存器的低位 ) 压栈 SP SP + $0001; Pull (PCH) SP SP + $0001; Pull (PCL) PC (PC) + $0001 Push (PCL); SP (SP) $0001 Push (PCH); SP (SP) $0001 Push (X); SP (SP) $0001 Push (A); SP (SP) $0001 Push (CCR); SP (SP) $0001 I 1; PCH Interrupt Vector High Byte PCL Interrupt Vector Low Byte SP (SP) + $0001; Pull (CCR) SP (SP) + $0001; Pull (A) SP (SP) + $0001; Pull (X) SP (SP) + $0001; Pull (PCH) SP (SP) + $0001; Pull (PCL) INH INH 83 INH 80 9 Push (A); SP (SP) $0001 INH 87 2 Push (H);SP (SP) $0001 INH 8B 2 Push (X);SP (SP) $0001 INH PULA 累加器出栈 SP (SP + $0001); Pull (A) INH 86 3 PULH PULX 寄存器 H( 变址寄存器的高位 ) 出栈寄存器 X (( 变址寄存器的低位 ) 出栈 SP (SP + $0001); Pull (H) INH 8A 3 SP (SP + $0001); Pull (X) INH 88 3 AIS #opr8i 堆栈指针加上立即数 ( 有符号之分 ) SP (SP) + (M) M is sign extended to a 16-bit value IMM A7 ii 2 堆栈指针复位 (RSP) 指令兼容于早期的 M680 该指令使用 $FF 加载 SP 的低 8 位而不影响其高 8 位 在早期的体系结构中,SP 的高 8 位难以改为 $00, 因此 RSP 需要强迫 SP 复位到其原始状态 ($00FF) 在 HCS08 系列中,$00FF 很少被用来作为堆栈的起始指针 所以, 也不能够确定高半部分会保持 $00, 因此,RSP 在新的 HCS08 程序中通常不是太常用 系统在复位初始化时,TXS 指令通常用来设定最初的 SP 值, 使其指向某个特定区域, 在那里实值是位于堆栈中的 TXS 传送指令将 H:X 的内容加载到 SP,H:X 中的值也因此而减少 下面两条指令可以设定 SP 指向 HCS08 RAM 的最后位置, 通常它们用于设定堆栈指针的初始值 98

110 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) ldhx #RamLast+1 ; 指向一个过去的 RAM txs ;SP<-(H:X-1) TSX 指令常用来拷贝 SP 的值到 H:X 中 因此随后的指令能够通过 H:X 相关变址地址指令来访问堆栈中的变量, 这个比起 SP 相关变址指令在效率上有细微的优势 因为 SP 指针在堆栈中指向下一个可用的位置, 指针值会通过一个转移指令自动增加 因此, 在 TSX 转移指令后,H:X 指针在堆栈中指向最近堆栈字节信息 无条件跳转到子程序 (JSR) 和转移到子程序 (BSR) 指令用于转到程序中某个位置的系列指令 ( 子程序 ) 通常, 在子程序的结尾, 返回子程序 (RTS) 指令引导 CPU 返回到因调用子程序而未执行的 JSR 或 BSR 后的下一个指令 软件中断 (SWI) 指令和 JSR 指令相似, 但软件中断在执行时可把 X A 和 CCR 寄存器中的内容保存到堆栈中, 完了又可以返回 PC 地址和特定子程序地址 中断服务子程序是从接近存储器结尾处的中断向量取来地址的 在进行 SWI 时, 矢量定位于 $FFFC 和 $FFFD 之间 SWI 的一系列的详细事件 : 1 在 SWI 代码操作后,PC 指向下一个地址 ( 这是个返回地址 ) 2PCL 压栈 存储 PC( 低位 ) 特定位置指向通过 SP, 然后减少 SP 的值 3PCH 压栈 4 在那样的顺序下将 X A 和 CCR 出栈 在这个顺序的结尾,SP 指向 CCR 进栈地址的下一个位置 在 CCR 中置位 I 位, 以使在执行中断服务子程序期间, 中断不可用 6 从 $FFFC 中加载 PCH 为中断服务子程序取来高地址的字节 7 从 $FFFD 中加载 PCL 8 转移到从 $FFFC:FFFD 取来的地址 为了与早期的 M68HC0 兼容, 高位寄存器 H 不能够自动进栈 在中断服务子程序开始时手动将 H 寄存器压栈和在返回中断子程序时手动将 H 出栈是个很好的习惯 除了保存着中断服务程序地址的中断向量所对应的硬件中断源, 其他硬件中断可以使 CPU 执行一系列与 SWI 一样的微指令 通常, 在中断服务程序中执行的最后指令是中断返回 (RTI),RTI 恢复了 CCR A X PCH 和 PCL 的值, 之前它们按相反的顺序被保存在堆栈中 每个字节从堆栈中取出时,SP 加 1 并指向下一个将被取出的数据, 相应的寄存器从 SP 指向的地址加载数据 在执行 RTI 后, 程序重新返回刚才被压进堆栈的地址 中断屏蔽位 (CCR 之中的 I 位 ) 在进入中断期间 (CCR 被压栈 ) 被置位 在 RTI 期间, 之前的 CCR 的值被恢复, 一般的情况是 :I 位为 0 则允许新的中断 A 压栈 (PSHA),X 压栈 (PSHX) 和 H 压栈 (PSHH) 允许单个 CPU 寄存器保存在堆栈中 进栈操作将选定的寄存器存储到 SP 所指向的内存位置, 继而减少 SP 的值, 以使它指向堆栈中的下一个可用位置 A X 和 H 出栈允许 A X 或 H 从堆栈中加载数据 出栈操作首先增加 SP 然后加载 SP 指向的存储器区域内容到选定的寄存器 下面的例子展示了压栈和出栈的方法 一些 C 编译器使用 X:A 来传递 16 位的参数 99

111 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) 给函数 这个代码段展示了这个整数值在堆栈中如何保存, 然后加载到 H:X 中 (620 行 ), H:X 被作为一个索引指针来使用 注意, 可以将寄存器压栈, 然后从不同的寄存器取值 ( 在堆栈中值没有任何特别的 CPU 寄存器的值和它们有相联 ) 79 ********************* 80 *multacc - 反复乘以 4 次的例子 81 ********************* 82 ;9 个堆栈字节被用在这个程序包含了返回地址 83 ; 指针在 X:A 中被传递,3 个字节被用来存储堆栈中的临时变量 84 ;2 个字节被用来作为堆栈的临时的存储区域 8 ;pntr 指向一系列的 4 个连续的乘数 k(0) - k(3) 86 ;VarY 是 16 字节的整数, VarN 是一个 8 字节的循环记数器 87 ;VarY = sum( k(0)*opra + k(1)*oprb + k(2)*oprc + k(3)*oprd) 88 ;return 结果 (VarY) 在 X:A 中 89 C1F2 87 multacc: psha ; 保存 pntr 的低字节 90 C1F3 89 pshx ; 保存 pntr 的高字节 91 C1F4 A7 FD ais #-3 ; 分配 3 个局部的字节 92 ; 此时 1,sp; 3,sp; 93 4,sp; 94 C1F6 9E6F 02 clr 2,sp ; 堆栈中 VarY 的高字节 9 C1F9 9E6F 03 clr 3,sp ; 堆栈中 VarY 的低字节 96 C1FC A6 04 lda #4 ; 循环记数 97 C1FE 9EE7 01 sta 1,sp ;VarN = 4 98 C A0 ldhx #opra ; 操作数 opra-oprd 99 C204 F6 iteration: lda,x ; 得到操作数 (n) 600 C20 AF 01 aix #1 ; 指向下一个操作数 601 C pshx ;oprx 指针的高字节 602 C208 8B pshh ;oprx 指针的低字节 603 ; 此时 ,sp 60 C209 9EFE 06 ldhx 6,sp ; 从堆栈中加载 pntr(6,sp) 606 C20C 9E6C 07 inc 7,sp ;pntr(lo)=pntr(lo) C20F bne skip ; 如果没有进位就跳转 608 C211 9E6C 06 inc 6,sp ; 把进位和 pntr(hi) 相加 609 C214 FE skip: ldx,x ; 加载 k(n) 610 C21 42 mul ;A*X -> X:A 611 C216 9EEB 0 add,sp ; 增加 VarY(lo) 612 C219 9EE7 0 sta,sp ; 更新 VarY(lo) 613 C21C 9F txa ; 高字节到寄存器 A 中 614 C21D 8A pulh ; 恢复 oprx 指针 ( 高位 ) 61 C21E 88 pulx ; 恢复 oprx 指针 ( 低位 ) 616 ; 此时 1,sp; 2,sp 3,sp; 617 4,sp 618 C21F 9EE9 02 adc 2,sp ; 把进位加到 VarY(hi) 中 619 C222 9EE7 02 sta 2,sp ; 更新 VarY(hi) 620 C22 9E6B 01 DB dbnz 1,sp,iteration ;dec VarN, 如果不是 0 转移 621 C229 9EEE 02 ldx 2,sp ;VarY( 高位 ) 622 C22C 9EE6 03 lda 3,sp ;VarY( 低位 ) 623 C22F A7 0 ais # ; 释放所有的局部量 100

112 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) 624 C rts ; 返回值 VarY 放到 X:A 中 62 ********************* 增加立即数到堆栈指针指令 (AIS) 允许一个 8 位有符号立即数值加到 SP 中 这个情况大多数被用来为局部变量分配空间 在堆栈中增加一个负数到 SP 来分配空间, 增加一个正数到 SP 来释放空间 ais #- ; 为局部变量分配 个字节 ais # ; 释放空间 6..7 其他各种指令 源格式操作功能描述 表 6-11 其他各种指令 CCR 的影响 V H I N Z C 寻址方式 NOP 没有操作 使用 1 总线周期 INH 9D 1 SEC 置位进位位 C 1 1 INH 99 1 CLC 清零进位位 C 0 0 INH 98 1 SEI 置位中断掩码位 I 1 1 INH 9B 1 CLI 清零中断掩码位 I 0 0 INH 9A 1 BGND 等待, 处理 BDM 命令当 ENBDM=1, 进 GO,TRACE1, 或者入主动背景 TAGGO INH 82 + WAIT STOP 中断不可用, 等待中断 中断不可用, 停止处理相应 MCU 工作 I bit 0; 停止 CPU I bit 0; 停止处理 操作码 操作数 循环次数 0 INH 8F 2+ 0 INH 8E 2+ 无操作指令 (NOP) 一般用于在软件中产生程序延时 它消耗执行时间, 但是不引起任何状态码和 CPU 寄存器的改变 下面的例子是用 NOP 来产生 1ms 延时的软件循环 627 ********************* 628 *dly1ms 总线频率延时 1ms 总线频率 = 20MHz 629 ********************* 630 ;1 个总线周期 = 0 个十亿分之一秒, 因此 20,000 个周期 = 1ms 631 ;JSR (EXT) 指令占了 [ 或者 6] 周期, 总的花费的时间是 24-2 周期 632 ; 总的延时 20000= 8n+24; 因此 n = 19976/8 = C232 8B dly1ms: pshh ;[2] 保存 H 634 C pshx ;[2] 保存 X 63 C234 9D nop ;[1] 使得 n 正好 636 C C0 ldhx #2496 ;[3] 转移记数 637 C238 AF FF loop1ms: aix #-1 ;[2] H:X = H:X C23A cphx #$0000 ;[3] 零检查 639 C23D 26 F9 bne loop1ms ;[3] 直到 H:X = $0000 转移 640 C23F 88 pulx ;[3] 恢复 X 101

113 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) 641 C240 8A pulh ;[3] 恢复 H 642 C rts ;[6] 返回 643 ********************* 置位和清零进位位指令 (SEC 和 CLC), 可以用于, 在执行左移或右移指令前, 改变进位位的值 置位中断屏蔽 (SEI) 和清零中断屏蔽 (CLI) 指令被用来让中断使能和禁止 复位后, 在堆栈指针和其他系统条件初始化之前,I 位需要被置位用来防止中断 当完成足够的系统初始化后, 需要用 CLI 指令来放开中断 在某些程序中, 敏感的代码序列需要预防中断 当编写敏感代码序列时,SEI 在序列之前使用,CLI 在序列之后使用 背景 等待和停止指令 (BGND WAIT 和 STOP) 通常用于 CPU 停止执行新指令但不知道要持续多长时间的情况 诸如中断或者连续的后台的调试命令等硬件事件, 必须告诉 CPU 什么时候重新处理正常的指令 在指令详细表中, 被列出的这些指令总线周期最小的数值, 后面跟着 +(plus) 来指出周期需要完成这些指令的最小数值 BGND 指令通常被开发系统用于设置用户调试程序, 以实现软件断点 通常用户程序不使用 BGND 指令 当 CPU 遇到一个 BGND 指令, 它能够在背景调试控制模式下检查 ENBDM 控制位 该控制位不影响用户程序, 它只能被复位或串行背景调试命令改变 如果 ENBDM=0( 它的默认状态 ),BGND 操作码作为非法指令将导致 MCU 复位 要了解更多的背景调试模式信息, 请参见 7.3 背景调试控制 (BDC) WAIT 引发 CPU 关闭时钟来节省功耗 其他的外围系统继续运行 中断或者复位事件可激活 WAIT 模式下的 CPU 中断源可来自外部的 IRQ 引脚或者来自内部的外围设备 请参看 3. 更加详细的 WAIT 模式的讨论 STOP 强迫 MCU 关掉所有的系统时钟来减少系统功率, 达到完全最小的功率 在这之前,M68HC0 和 M68HC08 系统的所有时钟包括振荡器在停止模式下都不能用 根据 HCS08 中的时钟产生电路, 可以设置控制位而使振荡器和时基模块继续在停止模式下运行 这就提供了一个从周期性停止模式来唤醒运行 MCU 的方法而不需要任何外部的部件的参与 在这种模式下, 振荡器和时基模块的双稳态多谐振荡器的时钟均已停止, 因此系统功耗减至最小状态 HCS08 在复位或者停止之后, 总是使用一个自身的时钟源来开始运行, 以避免延长相关的晶振启动时间 停止后,CPU 通过回应中断或者复位甚至激活来开始执行 更详细的信息, 可参见 3.6 的停止模式 6.6 指令简表 指令集摘要术语 : 这里列出的命名法被用在表 6-1 和表 6-12 的指令描述中 1. 操作符 () = 括号中是寄存器内容或者存储单元位置 = 是加载 ( 读 : gets ) 102

114 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) & = 逻辑与 = 逻辑或 = 逻辑异或 = 乘 = 除 : = 连接 + = 加 = 减 2.CPU 寄存器 A = 累加器 CCR= 条件码寄存器 H = 变址寄存器的高 8 位 X = 变址寄存器的低 8 位 PC = 程序计数器 PCH = 程序计数器的高 8 位 PCL = 程序记数器的低 8 位 SP = 堆栈指针 3. 存储和寻址 M = 一个存储单元位置或绝对数据, 依赖于寻址方式 M:M + $0001 = 占用两个连续内存位置的 16 位值 高 8 位在地址 M, 低 8 位在 位置 M+1 4. 条件码寄存器 (CCR) 位 V = 二进制补码溢出标志位, 位 7 H = 半进位标志位, 位 4 I = 中断屏蔽位, 位 3 N = 负标志位, 位 2 Z = 零标志位, 位 1 C = 进位 / 借位标志位, 位 0( 位 7 的进位或借位 ).CCR 变化符号 - = 无影响 0 = 位清 0 1 = 位置 1 = 根据操作结果位置 1 或清 0 U = 操作后未定义 6. 机器代码符号 dd = 一个直接地址 $0000-$00FF 的低 8 位 ( 高位假定为 $00) ee = 16 位偏移量的高 8 位 ff = 16 位偏移量的低 8 位或者 8 位偏移量 103

115 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) ii = 立即数的一个字节 jj = 一个 16 位立即数的高字节 kk = 一个 16 位立即数的低字节 hh = 16 位扩展地址的高字节 ll = 16 位扩展地址的低字节 rr = 相对偏移量 7. 源代码格式 在源代码格式栏中, 除了斜体表达式外, 都是必须出现在汇编源文件中的文字信息 初始的 3- 个字母助记符是文字表达式 所有顿号, 英镑符 (#), 圆括号和加号 (+) 都是 文字符号 N 一个在 0-7 范围内的单个整数的标号或表达式 opr8i 一个 8 位立即数的标号或表达式 opr16i 一个 16 位立即数的标号或表达式 opr8a 一个 8 位数值的标号或表达式 该指令把这个 8 位数作为 64KB 地址空间中直接页的一个地址的低 8 位来处理 opr16a 一个 16 位数值的标号或表达式 该指令把这个数作为 64KB 地 址空间中的一个地址 Oprx8 一个无符号 8 位数值的标号或表达式, 用作变址寻址方式 Oprx16 一个 16 位数值的标号或表达式 由于 HCS08 具有 16 位地址总 线, 所以该值可以是有符号值或无符号值 Rel 指定一个地址的标号或表达式 该地址的范围在现行指令目标码 的下一条指令地址的 -127~+128 范围之间 编译器会计算出这个 8 位有符号偏移量并 且将它包含在该指令的目标码中 寻址方式 INH = 隐含寻址方式 ( 指令不含操作数 ) IMM = 8 位或 16 位立即寻址方式 DIR = 8 位直接寻址方式 EXT = 16 位扩展寻址方式 IX = 16 位无偏移量变址寻址方式 IX+ = 16 位无偏移量变址, 变址加 1 寻址方式 ( 用于 CBEQ 和 MOV) IX1 = 16 位变址,8 位偏移量寻址方式 IX1+ = 16 位变址,8 位偏移量, 变址加 1 寻址方式 ( 用于 CBEQ) IX2 = 16 位偏移量变址寻址方式 REL = 8 位相对变址寻址方式 SP1 = 8 位偏移量堆栈寻址方式 SP2 = 16 位偏移量堆栈寻址方式 104

116 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) 指令助记符操作功能描述 ADC #opr8 ADC opr8 ADC opr16 ADC opr16,x ADC opr8,x ADC,X ADC opr16,sp ADC opr8,sp ADD #opr8 ADD opr8 ADD opr16 ADD opr16,x ADD opr8,x ADD,X ADD opr16,sp ADD opr8,sp AIS #opr8 AIX #opr8 AND #opr8 AND opr8 AND opr16 AND opr16,x AND opr8,x AND,X AND opr16,sp AND opr8,sp ASL opr8 ASLA ASLX ASL opr8,x ASL,X ASL opr8,sp ASR opr8 ASRA ASRX ASR opr8,x ASR,X ASR opr8,sp BCC rel 表 6-12 指令集概要 标识位影响 V H I N Z C 带进位加 A (A)+(M)+(C) - 不带进位加 A (A)+(M) - 有符号立即数 SP (SP)+ 有符号加到堆栈指针 16 位数有符号立即数加 H:X (H:X)+ 有符到变址寄存器号 16 位数 逻辑 与 算术左移 算术右移 进位标志为 0 则转移 A (A)&(M) C 0 b b b b C 寻址方式 IMM DIR EXT IX2 IX1 IX SP2 SP1 IMM DIR EXT IX2 IX1 IX SP2 SP1 操作码操作数周期 A9 B9 C9 D9 E9 F9 9ED9 9EE9 AB BB CB DB EB FB 9EDB 9EEB ii dd hh ll ee ff ff ee ff ff ii dd hh ll ee ff ff ee ff ff IMM A7 ii IMM AF ii 若 (C)=0 则转移 ( 不影响标志位 ) ( 译者注 : 标志位省略, 下同 ) IMM DIR EXT IX2 IX1 IX SP2 SP1 DIR INH INH IX1 IX SP1 DIR INH INH IX1 IX SP1 A4 B4 C4 D4 E4 F4 9ED4 9EE E E67 ii dd hh ll ee ff ff ee ff ff dd ff ff dd ff ff REL 24 rr 3 10

117 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) BCLR n,opr8 BCS rel BEQ rel BGE rel BGND BGT rel BHCC rel BHCS rel BHI rel BHS rel BIH rel BIL rel BIT #opr8 BIT opr8 BIT opr16 BIT opr16,x BIT opr8,x BIT,X BIT opr16,sp BIT opr8,sp BLE rel BLO rel BLS rel BLT opr BMC rel 清存储器单元的第 n 位 进位标志为 1 则转移 相等则转移 大于等于转移 ( 有符号数 ) ENBDM=1 则进入活跃背景大于转移 ( 有符号数 ) 半进位标志为 0 则转移半进位标志为 1 则转移 大于则转移 大于等于则转移 IRQ 引脚为高则转移 IRQ 引脚为低则转移 位测试 小于等于则转移 ( 有符号数 ) 小于则转移 小于等于则转移小于则转移 ( 有符号数 ) 中断屏蔽位为 0 则转移 Mn 0 ( 不影响标志位 ) (C)=1 则转移 ( 不影响标志位 ) (Z)=1 则转移 ( 不影响标志位 ) (N V)=0 则转移 ( 不影响标志位 ) 等待并处理 BDM 命令直到 GO,TRACE1 或 TAGGO (Z) (N V)=0 则转移 ( 不影响标志位 ) (H)=0 则转移 ( 不影响标志位 ) (H)=1 则转移 ( 不影响标志位 ) (C) (Z)=0 则转移 ( 不影响标志位 ) (C)=0 则转移 ( 不影响标志位 ) IRQ =1 则转移 ( 不影响标志位 ) IRQ =0 则转移 ( 不影响标志位 ) (A)&(M) ( 位标志更新, 操作 码不改变 ) (Z) (N V)=1 则转移 ( 不影响标志位 ) (C)=1 则转移 ( 不影响标志位 ) (C) (Z)=1 则转移 ( 不影响标志位 ) (N V)=1 则转移 ( 不影响标志位 ) (I)=0 则转移 ( 不影响标志位 ) DIR(b0) DIR(b1) DIR(b2) DIR(b3) DIR(b4) DIR(b) DIR(b6) DIR(b7) B 1D 1F dd dd dd dd dd dd dd dd REL 2 rr 3 REL 27 rr 3 REL 90 rr 3 REL 92 rr 3 REL 28 rr 3 REL 29 rr 3 REL 22 rr 3 REL 24 rr 3 REL 2F rr 3 REL 2E rr 3 IMM DIR EXT IX2 IX1 IX SP2 SP1 A B C D E F 9ED 9EE ii dd hh ll ee ff ff ee ff ff REL 93 rr 3 REL 2 rr 3 REL 23 rr 3 REL 91 rr 3 REL 2C rr 3 106

118 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) BMI rel BMS rel BNE rel BPL rel 负值则转移 中断屏蔽位为 1 则转移 不等于则转移 正值则转移 (N)=1 则转移 ( 不影响标志位 ) (I)=1 则转移 ( 不影响标志位 ) (Z)=0 则转移 ( 不影响标志位 ) (N)=0 则转移 ( 不影响标志位 ) REL 2B rr 3 REL 2D rr 3 REL 26 rr 3 REL 2A rr 3 BRA rel 无条件转移 ( 不影响标志位 ) REL 20 rr 3 BRCLR n,opr8,rel 存储器单元第 n 位为 0 则转移 (Mn)=0 则转移 DIR(b0) DIR(b1) DIR(b2) DIR(b3) DIR(b4) DIR(b) DIR(b6) DIR(b7) B 0D 0F dd rr dd rr dd rr dd rr dd rr dd rr dd rr dd rr BRN rel 不执行转移时间为三个总线周期 ( 不影响标志位 ) REL 21 rr 3 BRSET n,opr8,rel BSET n,opr8 BSR rel CBEQ opr8,rel CBEQA #opr8,rel CBEQX #opr8,rel CBEQ opr8,x+,rel CBEQ,X+,rel CBEQ opr8,sp,rel 存储器单元第 n 位为 1 则转移 置存储器单元第 n 位为 1 跳至子程序地址 比较, 相等则转移 (Mn)=1 则转移 Mn 1 ( 不影响标志位 ) PC (PC)+2 push(pcl); SP (SP)-1 push(pch); SP (SP)-1 PC (PC)+rel ( 不影响标志位 ) (A)-(M)=$00 则转移 ( 不影响标志位 ) (A)-(M)=$00 则转移 ( 不影响标志位 ) (X)-(M)=$00 则转移 ( 不影响标志位 ) (A)-(M)=$00 则转移 ( 不影响标志位 ) (A)-(M)=$00 则转移 ( 不影响标志位 ) (A)-(M)=$00 则转移 ( 不影响标志位 ) DIR(b0) DIR(b1) DIR(b2) DIR(b3) DIR(b4) DIR(b) DIR(b6) DIR(b7) DIR(b0) DIR(b1) DIR(b2) DIR(b3) DIR(b4) DIR(b) DIR(b6) DIR(b7) A 0C 0E A 1C 1E dd rr dd rr dd rr dd rr dd rr dd rr dd rr dd rr dd dd dd dd dd dd dd dd REL AD rr DIR IMM IMM IX1+ IX+ SP E61 CLC 清进位标志 C INH 98 1 dd rr ii rr ii rr ff rr rr ff rr

119 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) CLI CLR opr8 CLRA CLRX CLRH CLR opr8,x CLR,X CLR opr8,sp CMP #opr8 CMP opr8 CMP opr16 CMP opr16,x CMP opr8,x CMP,X CMP opr16,sp CMP opr8,sp COM opr8 COMA COMX COM opr8,sp COM,X COM opr8,sp CPHX #opr16 CPHX opr16 CPHX opr8 CPHX opr8,sp CPX #opr8 CPX opr8 CPX opr16 CPX,X CPX opr16,x CPX opr8,x CPX opr16,sp CPX opr8,sp DAA DBNZ opr8,rel DBNZA rel DBNZX rel DBNZ opr8,x,rel DBNZ X,rel DBNZ opr8,sp,rel 清中断屏蔽标志 清零指令 比较累加器与存储器 取反指令 比较变址寄存器与存储器 比较 X 寄存器与存储器 ADD 和 ADC 操作后对累加器中 BCD 码结果进行十进制调整 减去 1 后结果不为 0 则转移 I INH 9A 1 M $00 A $00 X $00 H $00 M $00 M $00 M $00 (A)-(M) ( 标识位更新, 操作数不变 ) M M =$FF-(M) A A =$FF-(M) X X =$FF-(M) M M =$FF-(M) M M =$FF-(M) M M =$FF-(M) (H:X)-(M:M+1) ( 标识位更新, 操作数不变 ) (X)-(M) ( 标识位更新, 操作数不变 ) DIR INH INH INH IX1 IX SP1 IMM DIR EXT IX2 IX1 IX SP2 SP1 DIR INH INH IX1 IX SP1 EXT IMM DIR SP1 IMM DIR EXT IX2 IX1 IX SP2 SP1 3F 4F F 8C 6F 7F 9E6F A1 B1 C1 D1 E1 F1 9ED1 9EE E63 3E 6 7 9EF3 A3 B3 C3 D3 E3 F3 9ED3 9EE3 dd ff ff ii dd hh ll ee ff ff ee ff ff dd ff ff hh ll jj kk dd ff ii dd hh ll ee ff ff ee ff ff (A) 10 U - - INH 72 2 A (A)-1 or M (M)-1 or X (X)-1 (result) 0 则转移 (DBNZX 只影响 X) ( 不影响标志位 ) DIR INH INH IX1 IX SP1 3B 4B B 6B 7B 9E6B dd rr rr rr ff rr rr ff rr

120 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) DEC opr8 DECA DECX DEC opr8,x DEC,X DEC opr8,sp DIV EOR #opr8 EOR opr8 EOR opr16 EOR opr16,x EOR opr8,x EOR,X EOR opr16,sp EOR opr8,sp INC opr8 INCA INCX INC opr8,x INC,X INC opr8,sp JMP opr8 JMP opr16 JMP opr16,x JMP opr8,x JMP,X JSR opr8 JSR opr16 JSR opr16,x JSR opr8,x JSR,X LDA #opr8 LDA opr8 LDA opr16 LDA opr16,x LDA opr8,x LDA,X LDA opr16,sp LDA opr8,sp LDHX #opr16 LDHX opr8 LDHX opr16 LDHX,X LDHX opr16,x LDHX opr8,x LDHX opr8,sp 减 1 指令 除法指令 某存储器单元与累加器进行 异或 加 1 指令 跳转指令 跳转至子程序 将存储器数值送到累加器 M (M)-$01 A (A)-$01 X (X)-$01 M (M)-$01 M (M)-$01 M (M)-$01 A (H:A)/(X) H 余数 A (A M) M (M)+$01 A (A)+$01 X (X)+$01 M (M)+$01 M (M)+$01 M (M)+$01 PC 跳转地址 ( 不影响标志位 ) DIR INH INH IX1 IX SP1 3A 4A A 6A 7A 9E6A dd INH PC (PC)+n(N=1,2,or 3) PCL 入栈 ;SP (SP)-$01 PCH 入栈 ;SP (SP)-$01 PC 新的地址 ( 不影响标志位 ) A (M) 将存储器数值 送到变址寄存 H:X (M:M+$01) 器 IMM DIR EXT IX2 IX1 IX SP2 SP1 DIR INH INH IX1 IX SP1 DIR EXT IX2 IX1 IX DIR EXT IX2 IX1 IX IMM DIR EXT IX2 IX1 IX SP2 SP1 IMM DIR EXT IX IX2 IX1 SP1 A8 B8 C8 D8 E8 F8 9ED8 9EE8 3C 4C C 6C 7C 9E6C BC CC DC EC FC BD CD DD ED FD A6 B6 C6 D6 E6 F6 9ED6 9EE EAE 9EBE 9ECE 9EFE ff ff ii dd hh ll ee ff ff ee ff ff dd ff ff dd hh ll ee ff ff dd hh ll ee ff ff ii dd hh ll ee ff ff ee ff ff jj kk dd hh ll ee ff ff ff

121 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) LDX #opr8 LDX opr8 LDX opr16 LDX opr16,x LDX opr8,x LDX,X LDX opr16,sp LDX opr8,sp LSL opr8 LSLA LSLX LSL opr8,a LSL,X LSL opr8,sp LSR opr8 LSRA LSRX LSR opr8,x LSR,X LSR opr8,sp MOV opr8,opr8 MOV opr8,x+ MOV #opr8,opr8 MOV X+,opr8 MUL NEG opr8 NEGA NEGX NEG opr8,x NEG,X NEG opr8,sp 将存储器数值送到 X 寄存器 ( 变址寄存器低 8 位 ) 传送指令 无符号数乘法指令 求补指令 逻辑左移 逻辑右移 X (M) C 0 b b b b C (M) 目的 (M) 源 (IX+/DIR 和 DIR/IX+ 寻址方式下 H:X (H:X)+$01) IMM DIR EXT IX2 IX1 IX SP2 SP1 DIR INH INH IX1 IX SP1 DIR INH INH IX1 IX SP1 DIR/DIR DIR/IX+ IMM/DI R IX+/DIR AE BE CE DE EE FE 9EDE 9EEE E E64 4E E 6E 7E ii dd hh ll ee ff ff ee ff ff dd ff ff dd ff ff dd dd dd ii dd dd X:A (X) (A) INH 42 M -(M)=$00-(M) A -(A)=$00-(A) X -(X)=$00-(X) M -(M)=$00-(M) M -(M)=$00-(M) - - DIR INH INH IX1 IX SP E60 dd ff ff NOP 空操作耗时一个总线周期 ( 不影响标志位 ) INH 9D 1 NSA ORA #opr8 ORA opr8 ORA opr16 ORA opr16,x ORA opr8,x ORA,X ORA opr16,sp ORA opr8,sp PSHA 累加器半字节交换 累加器与存储 A (A) 和 (M) 或运器 或 运算算结果 累加器内容进栈 A (A[3:0]:A[7:4]) INH 推 (A) 入栈 ;SP (SP)-1 ( 不影响标志位 ) IMM DIR EXT IX2 IX1 IX SP2 SP1 AA BA CA DA EA FA 9EDA 9EEA ii dd hh ll ee ff ff ee ff ff INH

122 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) PSHH PSHX H( 变址寄存器高字节 ) 内容进栈 X( 变址寄存器低字节 ) 内容进栈 推 (H) 入栈 ;SP (SP)-1 ( 不影响标志位 ) 推 (X) 入栈 ;SP (SP)-1 ( 不影响标志位 ) INH 8B 2 INH 89 2 PULA 累加器内容出栈 SP (SP+1); 弹出 (A)( 不影响标志位 ) INH 86 3 PULH PULX ROL opr8 ROLA ROLX ROL opr8,x ROL,X ROL opr8,sp ROR opr8 RORA RORX ROR opr8,x ROR,X ROR opr8,sp RSP RTI RTS SBC #opr8 SBC opr8 SBC opr16 SBC opr16,x SBC opr8,x SBC,X SBC opr16,sp SBC opr8,sp H( 变址寄存器高字节 ) 内容出栈 X( 变址寄存器低字节 ) 内容出栈 C b 循环左移 循环右移 SP (SP+1); 弹出 (H) ( 不影响标志位 ) SP (SP+1); 弹出 (X) ( 不影响标志位 ) 推栈指针复位 SP $FF 堆栈指针高字节不受影响 ( 不影响标志位 ) SP (SP)+1; 弹出 (CCR) SP (SP)+1; 弹出 (A) 中断返回 SP (SP)+1; 弹出 (X) SP (SP)+1; 弹出 (PCH) SP (SP)+1; 弹出 (PCL) ( 影响所有标志位 ) SP (SP)+1; 弹出 (PCH) 子程序返回 SP (SP)+1; 弹出 (PCL) ( 不影响标志位 ) 带有进位的减法指令 b b b C A (A)-(M)-(C) - - INH 8A 3 INH 88 3 DIR INH INH IX1 IX SP1 DIR INH INH IX1 IX SP E E66 dd ff ff dd ff ff INH 9C 1 INH 80 9 INH 81 6 IMM DIR EXT IX2 IX1 IX SP2 SP1 A2 B2 C2 D2 E2 F2 9EE2 9ED2 ii dd hh ll ee ff ff ff ee ff SEC 进位标志置 1 C INH 99 1 SEI 中断屏蔽位置 1 I INH 9B 1 111

123 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) STA opr8 STA opr16 STA opr16,x STA opr8,x STA,X STA opr16,sp STA opr8,sp STHX opr8 STHX opr16 STHX opr8,sp 累加器内容送到存储器 M (A) 变址寄存器内 容送到目标地 (M:M+1) (H:X) 址 DIR EXT IX2 IX1 IX SP2 SP1 DIR EXT SP1 B7 C7 D7 E7 F7 9EE7 9ED EFF dd hh ll ee ff ff ff ee ff dd hh ll ff STOP 允许 IRQ 引脚中断, 停止晶振 I 1; 停止晶振 INH 8E 2 STX opr8 STX opr16 STX opr16,x STX opr8,x STX,X STX opr16,sp STX opr8,sp SUB #opr SUB opr8 SUB opr16 SUB opr16,x SUB opr8,x SUB,X SUB opr16,sp SUB opr8,sp SWI TAP TAX TPA TST opr8 TSTA TSTX TST opr8,x TST,X TST opr8,sp TSX X( 变址寄存器低 8 位 ) 内容送到存储器 M (X) 减法指令 A (A)-(M) - - 软中断指令 累加器内容送到条件码寄存器累加器内容送到 X 寄存器 条件码寄存器内容送到累加器 负号及零标志位的测试 堆栈指针送到变址寄存器 PC (PC)+1; (PCL) 入栈 SP (SP)-1; (PCH) 入栈 SP (SP)-1; (X) 入栈 SP (SP)-1; (A) 入栈 SP (SP)-1; (CCR) 入栈 SP (SP)-1; I 1( 只影响此标志位 ) PCH: PCL 中断矢量 (A)-$00 or (X)-$00 or (M)-$00 CCR (A) 不影响标志位 X (A) ( 不影响标志位 ) A (CCR) ( 不影响标志位 ) H:X (SP)+1 ( 不影响标志位 ) DIR EXT IX2 IX1 IX SP2 SP1 IMM DIR EXT IX2 IX1 IX SP2 SP1 BF CF DF EF FF 9EEF 9EDF A0 B0 C0 D0 E0 F0 9EE0 9ED0 dd hh ll ee ff ff ff ee ff ii dd hh ll ee ff ff ff ee ff INH INH 84 1 INH 97 1 INH 8 1 DIR INH INH IX1 IX SP1 3D 4D D 6D 7D 9E6D dd ff ff INH

124 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) TXA TXS WAIT X 寄存器内容送到累加器 变址寄存器内容送到堆栈指针允许中断, 等待中断 A (X) ( 不影响标志位 ) (SP) (H:X)-1 ( 不影响标志位 ) INH 9F 1 INH 94 2 I 0, 停止处理器 INH 8F 2 INH 隐含寻址 IMM 立即寻址 DIR 直接寻址 EXT 扩展寻址 DD 直接 - 直接寻址 IX+D 变址 - 直接 - 变址加 1 寻址 REL 相对变址寻址 IX 无偏移量变址寻址 IX1 8 位偏移量的变址寻址 IX2 16 位偏移量的变址寻址 IMD 立即 - 直接寻址 DIX+ 直接 - 变址 - 变址加 1 寻址 SP1 8 位偏移量堆栈寻址, SP2 16 位偏移量堆栈寻址 IX+ 无偏移量变址 - 变址加 1 寻址 IX1+ 8 位偏移量变址 - 变址加 1 寻址 用 16 进制表示操作码 F0 3 SUB 字节数 1 IX HCS08 指令周期 寻址方式 图 6-4 操作码映象图 1 113

125 HCS08 系列 MCU 参考手册 ( 第六章中央处理单元 ) INH 隐含寻址 IMM 立即寻址 DIR 直接寻址 EXT 扩展寻址 DD 直接 - 直接寻址 IX+D 变址 - 直接 - 变址加 1 寻址 REL 相对变址寻址 IX 无偏移量变址寻址 IX1 8 位偏移量变址寻址 IX2 16 位偏移量变址寻址 IMD 立即 - 直接寻址 DIX+ 直接 - 变址 - 变址加 1 寻址 SP1 8 位偏移量堆栈寻址, SP2 16 位偏移量堆栈寻址 IX+ 不带偏移量的变址, 变址加 1 寻址 IX1+ 8 位偏移量的变址, 变址加 1 寻址 用 16 进制表示操作码 9E60 6 NEG 字节数 3 SP1 HCS08 指令周期 寻址方式 图 6- 操作码映像图 汇编语言指南 虽然本手册的大多数读者对汇编语言编程已经有了基本了解, 但是, 不同的第三方工具开发商编写的编译器, 在语法规则上总有细微的差异 这部分讲述了一些常规的指令规范及语法规则, 它们适用于本手册中的代码例子 如果初学用户使用同样的 Metrowerks 编译器的话, 该部分为编写简单程序提供了充足的基础知识 在所有情况下, 用户都应该参考特定的编译器的文档以获得更多的详细信息 本手册中的代码例子与附录 A 指令集中的每一指令的代码形式一致 为了指令文 114

HCS08微控制器上有关内存分配的几个问题.doc

HCS08微控制器上有关内存分配的几个问题.doc HCS08 shylion@gmail.com HCS08 Tiny Small shylion@gmail.com HCS08...- 1-1.1. HCS08...- 2-1.1...- 2-1.2 RAM...- 5-1.3 FLASH...- 5-1.4 Vectors...- 6-1.2....- 7-1.3. HCS08 Tiny Small...- 9-1.4. heap segment...12

More information

MC9S08AC16: Technical Data Sheet

MC9S08AC16: Technical Data Sheet MC9S08AC16 MC9S08AC8 MC9S08AW16 MC9S08AW8 数据手册 : 技术数据 HCS08 微控制器 MC9S08AC16 第 6 版 2008 年 9 月 飞思卡尔半导体 MC9S08AC16 系列产品的特性 MC9S08AC16 系列 MCU 消费 & 工业 MC9S08AC16 MC9S08AC8 汽车 MC9S08AW16A MC9S08AW8A 8 位 HCS08

More information

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63>

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63> 第三章 Q3 1 1. 省略了 I/O 操作的复杂逻辑, 易实现, 耗费低 ; 2. 可以利用丰富的内存寻址模式实现灵活的 I/O 操作 Q3 2 假设存储单元 ds1 处寄存器地址为 0x2000, 代码如下 #define ds1 0x2000 while ( *ds1 == 0 ) ; Q3 3 假设设备 (dev1) 中有两个寄存器 ds1 和 dd1,dev1 的地址为 0x1000,ds1

More information

<4D F736F F D20414E FC8E7BACEB2C9D3C34D C B5C4CBABC9C1B4E6D5F3C1D0C0B4B7C2D5E F4D2E646F63>

<4D F736F F D20414E FC8E7BACEB2C9D3C34D C B5C4CBABC9C1B4E6D5F3C1D0C0B4B7C2D5E F4D2E646F63> 飞思卡尔应用笔记 AN3404 如何采用 MC9S08LC60D 的双闪存 阵列来仿真 EEPROM 文件编号 :AN3404 版本 :1,03/2007 苏州大学飞思卡尔嵌入式教学与应用培训中心译 2008 年 5 月 目录 1 引言... 1 1.1 MC9S08LC60/36 Flash 存储器的特点... 1 1.2 MC9S08LC60/36 的存储映像图... 2 2 Flash 编程...

More information

第十四章 STC单片机比较器原理及实现

第十四章 STC单片机比较器原理及实现 第 14 章 STC 单片机比较器 原理及实现 何宾 2015.02 1 本章主要内容 STC 单片机比较器结构 STC 单片机比较器寄存器组 STC 单片机比较器应用 2 STC 单片机比较器结构 STC15W 系列单片机内置了模拟比较器 对于 STC15W201S STC15W404S, 以及 STC15W1K16S 系 列单片机的比较器内部结构 3 STC 单片机比较器结构 S T C 15W

More information

MSP430X1XX 系列微控制器具有以下特征 结构框图 超低功耗结构体系 A 额定工作电流在 1MHz V 工作电压 C11X P11X 和 E11X 为 V 从备用模式唤醒为 6 S 丰富的中断能力减少了查询的需要灵活强大的处理能力源操作数有七种寻址模

MSP430X1XX 系列微控制器具有以下特征 结构框图 超低功耗结构体系 A 额定工作电流在 1MHz V 工作电压 C11X P11X 和 E11X 为 V 从备用模式唤醒为 6 S 丰富的中断能力减少了查询的需要灵活强大的处理能力源操作数有七种寻址模 新一代超低功耗 16 位单片机 TI MSP430 系列 美国 TI 公司的 MSP430 系列单片机可以分为以下几个系列 X1XX X3XX X4XX 等等 而且 在不断发展 从存储器角度 又可分为 ROM C 型 OTP P 型 EPROM E 型 Flash Memory F 型 系列的全部成员均为软件兼容 可以方便地在系列各型号间移植 MSP430 系列单片机 的 MCU 设计成适合各种应用的

More information

Microsoft Word - Delta Controller ASCII_RTU_SC

Microsoft Word - Delta Controller ASCII_RTU_SC Delta Controller ASCII/RTU ( 适用台达变频器 伺服驱动器 PLC 温度控制器 ) 人机默认值通讯速率 :9600, 7, None, 2 (ASCII); 9600, 8, None, 2 (RTU) 控制器站号 :1 控制区 / 状态区 :None/None 控制器接线的说明 Delta Servo a. RS-232(DOP-A/AE/AS, DOP-B 系列适用 )

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 The BitCoin Scripting Language 交易实例 交易结构 "result": { "txid": "921a dd24", "hash": "921a dd24", "version": 1, "size": 226, "locktime": 0, "vin": [ ], "vout": [ ], "blockhash": "0000000000000000002c510d

More information

第 卷 第 期 年 月 半 导 体 学 报! " # $%&'%' $!&' #% #$1 /#1 $'! / ?/ ?/ / 3 0,?/ ) * +!!! '!,!! -. & ' $! '! 4% %&1)/1(7%&)03 (% )

第 卷 第 期 年 月 半 导 体 学 报!  # $%&'%' $!&' #% #$1 /#1 $'! / ?/ ?/ / 3 0,?/ ) * +!!! '!,!! -. & ' $! '! 4% %&1)/1(7%&)03 (% ) 第 卷 第 期 年 月!"# $%&'%' $!&'#%#$1/#1 $'! /18103 2?/03101?/18103 /3 0,?/0301.13 )*+!!! '!,!! -.&' $!'! 4%%&1)/1(7%&)03(%)%&,%*(1&0)%$-0*,%30)17*1*)0(+1(1+&1*+*),)1; &113(%44(10&.0701&0-&00*/)%;()1%-1+%&0)0*1*)%

More information

器之 间 向一致时为正 相反时则为负 ③大量电荷的定向移动形成电 流 单个电荷的定向移动同样形成电流 3 电势与电势差 1 陈述概念 电场中某点处 电荷的电势能 E p 与电荷量 q Ep 的比值叫做该点处的电势 表达式为 V 电场中两点之间的 q 电势之差叫做电势差 表达式为 UAB V A VB 2 理解概念 电势差是电场中任意两点之间的电势之差 与参考点的选择无关 电势是反映电场能的性质的物理量

More information

Microsoft Word - 8-Bit通用IO型单片机20P02B_V03.docx

Microsoft Word - 8-Bit通用IO型单片机20P02B_V03.docx 8-Bit 通用 IO 型单片机 20P02B 版本 :V03 日期 :2012/04/23 www.greenmcu.com 目录 目 录 第 1 章简述... 1 1.1 产品简介... 1 1.1.1 产品特性... 1 1.1.2 系统框图... 2 1.1.3 引脚排列... 3 1.1.4 引脚说明... 3 1.1.5 引脚结构示意图... 4 第 2 章系统... 6 2.1 中央处理器...

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 STC 单片机比较器原理及实现 主讲 : 何宾 Email:hebin@mail.buct.edu.cn 2016.03 STC 单片机比较器结构 STC15W 系列单片机内置了模拟比较器 对于 STC15W201S STC15W404S, 以及 STC15W1K16S 系列单片机的比较器内部结 构 STC 单片机比较器结构 从图中可以看出, 比较器正端输入 CMP+ 的输入电压来自单片机的 P5.5

More information

Microsoft Word - 8-Bit通用IO型单片机20P01_V01

Microsoft Word - 8-Bit通用IO型单片机20P01_V01 8-Bit 通用 IO 型单片机 20P01 版本 :V01 日期 :2012/04/18 www.greenmcu.com 目录 目录 第 1 章简述... 1 1.1 产品简介... 1 1.1.1 产品特性... 1 1.1.2 系统框图... 2 1.1.3 引脚排列... 3 1.1.4 引脚说明... 3 1.1.5 引脚结构示意图... 4 第 2 章系统... 6 2.1 中央处理器...

More information

Microsoft PowerPoint - C15_LECTURE_NOTE_05.ppt

Microsoft PowerPoint - C15_LECTURE_NOTE_05.ppt 8088/8086 MICROPROCSOR PROGRAMMING INTEGER INSTRUCTIONS AND COMPUTATIONS The MOVE The move (MOV) instruction is used to transfer a byte or a word of data from a source operand to a destination operand

More information

Microsoft PowerPoint - C15_LECTURE_NOTE_05.ppt

Microsoft PowerPoint - C15_LECTURE_NOTE_05.ppt 8088/8086 MICROPROCESSOR PROGRAMMING INTEGER INSTRUCTIONS AND COMPUTATIONS 8088/8086 MICROPROCESSOR PROGRAMMING INTEGER INSTRUCTIONS AND COMPUTATIONS 5.1 Data-Transfer Instructions 5.2 Arithmetic Instructions

More information

Microsoft Word - AN3521_ColdFire MCF521x 微控制器的Flash模块的使用.doc

Microsoft Word - AN3521_ColdFire MCF521x 微控制器的Flash模块的使用.doc 飞思卡尔应用笔记 AN3521 ColdFire MCF521x 微控制器的 Flash 模块的使用 文件编号 :AN3521 版本 :0,09/2007 苏州大学飞思卡尔嵌入式教学与应用培训中心译 2008 年 5 月 目录 1 引言... 1 2 MCF521x Flash 的特点... 1 2.1 描述... 1 3 FLASH 模块的解释... 1 3.1 实例 :CFM 模块的案例学习...

More information

<4D F736F F D20C7B0CBC4D5C2D7F7D2B5CCE22E646F6378>

<4D F736F F D20C7B0CBC4D5C2D7F7D2B5CCE22E646F6378> 第一章第二章 Q2 1: 高序 : 最低位字节存储在字的最低位 ; 低序 : 最低位字节存储在字的最高位 ; Q2 2: 冯. 诺依曼结构 : 数据和指令都存储在同一存储器中 ; 哈佛结构 : 数据和程序存储在各自独立的存储器中 Q2 3: a) ARM 有 16 个通用寄存器,r0 r15, 其中 r15 还被用作程序计数器 b) CPSR 是程序状态寄存器, 包含了条件码标识 中断禁止位 当前处理器模式和其他状态

More information

2 14 PORTC.1 PORTB.3 PORTA.2/T0 GND PORTB.2 PORTA.0 PORTC.3 PORB.0/OSCO PORTB.1/OSCI PORTC.0 PORTC.2 SH69P21 /SOP PORTA

2 14 PORTC.1 PORTB.3 PORTA.2/T0 GND PORTB.2 PORTA.0 PORTC.3 PORB.0/OSCO PORTB.1/OSCI PORTC.0 PORTC.2 SH69P21 /SOP PORTA 1K 4 SH6610C 4 OTP ROM 1K X 16 RAM 88 X 4-24 - 64 2.4V-5.5V - fosc = 30kHz - 4MHz, = 2.4V - 5.5V - fosc = 4MHz - 8MHz, = 4.5V - 5.5V 11 CMOS I/O 4 ( ) 8 / - 0 PORTA.0 ( / / ) - 0 - PORTB ( ) ( ) - 32.768kHz,

More information

学习MSP430单片机推荐参考书

学习MSP430单片机推荐参考书 MSP430 16 MSP430 C MSP430 C MSP430 FLASH 16 1 CPU 16 ALU 16 PC SP SR R4~R15 2 3 00-FFH 100-1FFH 4 5 1 2 51 24 27 6 1 2 3 4 5 6 4 12 SR SP SR CPU SR CPU C Z N GIE CPUOff CPU OscOff SCG0 SCG1 CPU EXIT SP

More information

M8Rxxx 指令集说明 Version 年 11 月 上海磐芯电子有限公司 SHANGHAI MASSES ELECTRONIC Co., Ltd. 本公司保留对产品在可靠性, 功能和设计方面的改进作进一步说明的权利 说明文档的更改, 恕不另行通知

M8Rxxx 指令集说明 Version 年 11 月 上海磐芯电子有限公司 SHANGHAI MASSES ELECTRONIC Co., Ltd. 本公司保留对产品在可靠性, 功能和设计方面的改进作进一步说明的权利 说明文档的更改, 恕不另行通知 M8Rxxx 指令集说明 Version 1.04 2014 年 11 月 上海磐芯电子有限公司 SHANGHAI MASSES ELECTRONIC Co., Ltd. 本公司保留对产品在可靠性, 功能和设计方面的改进作进一步说明的权利 说明文档的更改, 恕不另行通知 修正记录 版本 日期 描述 Ver1.02 2014-5-15 补全指令说明 Ver1.03 2014-10-8 勘误 Ver1.04

More information

MSP430ϵÁе¥Æ¬»úµÄÖ¸Áîϵͳ.pps [¼æÈÝģʽ]

MSP430ϵÁе¥Æ¬»úµÄÖ¸Áîϵͳ.pps [¼æÈÝģʽ] 作者 : 利尔达 MSP430 系列单片机的指令系统 1 CPU 内核组成 : 16 位的 (ALU) 算术运算单元 16 个寄存器 (PC SP SR R4~R15) 指令控制单元 2 存储器组织结构 3 外围模块寄存器地址 它们被分配在相应的字模块或字节模块当中 分配在 00-FFH 中为字节, 分配在 100-1FFH 中为字 4 寻址模式 : 5 指令格式 : 1) 书写格式标号指令助记符源操作数,

More information

额定规格 / 性能 单相 标准认证 UL CSA. NO. EN-- 额定规格输入 环境温度 项目电压电平额定电压使用电压范围输入电流型号动作电压复位电压 - B ma 以下 DC~V DC.~V DC.V 以下 DC.V 以上 - BL ma 以下 输出 项目 * 根据环境温度的不同而不同 详情请

额定规格 / 性能 单相 标准认证 UL CSA. NO. EN-- 额定规格输入 环境温度 项目电压电平额定电压使用电压范围输入电流型号动作电压复位电压 - B ma 以下 DC~V DC.~V DC.V 以下 DC.V 以上 - BL ma 以下 输出 项目 * 根据环境温度的不同而不同 详情请 加热器用固态继电器 单相 CSM_-Single-phase_DS_C 带纤细型散热器的一体式小型 SSR 备有无过零触发型号, 用途广泛 符合 RoHS 标准 包含无过零触发型号, 产品线齐全 输出回路的抗浪涌电压性能进一步提高 根据本公司的试验条件 小型 纤细形状 除了 DIN 导轨安装, 还可进行螺钉安装 获取 UL CSA EN 标准 TÜV 认证 请参见 共通注意事项 种类 关于标准认证机型的最新信息,

More information

AVR单片机指令系统.PDF

AVR单片机指令系统.PDF AVR 4 1 (1) 89 :AT90S1200, ; (2) 90 ( ):Attiny11/12/15/22; 90 = +89 (3) 118 ( ):AT90S2313/2323/2343/2333,/4414/4433/4434/8515/90S8534/8535 ;118 = + 90 ; (4) 121 ( )ATmega603/103; 121 = + 118 ; (5) 130

More information

PowerPoint Presentation

PowerPoint Presentation 7.2 并行接口 二. 可编程并行接口芯片 8255A 的功能及其应用 与 CPU 一侧相连的引脚 D0 PA0 ~ ~ ~ ~ ~ D7 PA7 RESET PC7 WR RD PC4 PC3 PC0 A0 PB0 A1 PB7 CS PA 口 PC 口上半部 PC 口下半部 PB 口 A 组 B 组 与 I/O 设备相连的引脚 7.2 并行接口二. 可编程并行接口芯片 8255A 的功能及其应用

More information

电子技术基础 ( 第 版 ) 3. 图解单相桥式整流电路 ( 图 4-1-3) 电路名称电路原理图波形图 整流电路的工作原理 1. 单相半波整流电路 u 1 u u sin t a t 1 u 0 A B VD I A VD R B

电子技术基础 ( 第 版 ) 3. 图解单相桥式整流电路 ( 图 4-1-3) 电路名称电路原理图波形图 整流电路的工作原理 1. 单相半波整流电路 u 1 u u sin t a t 1 u 0 A B VD I A VD R B 直流稳压电源 第 4 章 4.1 整流电路及其应用 学习目标 1. 熟悉单相整流电路的组成, 了解整流电路的工作原理. 掌握单相整流电路的输出电压和电流的计算方法, 并能通过示波器观察整流电路输出电压的波形 3. 能从实际电路中识读整流电路, 通过估算, 能合理选用整流元器件 4.1.1 认识整流电路 1. 图解单相半波整流电路 ( 图 4-1-1) 电路名称电路原理图波形图 4-1-1. 图解单相全波整流电路

More information

2 PIC PIC 1 / CPU PIC MCU PIC RC

2 PIC PIC 1 / CPU PIC MCU PIC RC 2 PIC PIC 1 /... 2-2 2... 2-3 3... 2-4 4... 2-4 5... 2-4 6 CPU... 2-5 7 PIC MCU... 2-6 8 PIC16... 2-6 9... 2-7 10... 2-7 11 RC... 2-7 12... 2-8 13... 2-8 14 NOP... 2-9 15 PMD... 2-9 16... 2-10 17 WDTWDT...

More information

<4D F736F F D203034CAB5D1E9CBC D20B5C4494F20BDD3BFDACAB5D1E92E646F63>

<4D F736F F D203034CAB5D1E9CBC D20B5C4494F20BDD3BFDACAB5D1E92E646F63> 实验四 ARM 的 I/O 接口实验 一 实验目的 1. 了解 S3C44B0X 的通用 I/O 接口 2. 掌握 I/0 功能的复用并熟练的配置, 进行编程实验二 实验设备 1. EL-ARM-830 教学实验箱,PentiumII 以上的 PC 机, 仿真器电缆 2. PC 操作系统 WIN98 或 WIN2000 或 WINXP,ARM SDT2.5 或 ADS1.2 集成开发环境, 仿真器驱动程序

More information

2 Keil µ vision 2.1 1) Keil µ vision2 V2.34 µ vision3 2) Sino_Keil.exe Keil c:\keil\ 3) JET51 USB PC C:\Keil\ USB PC 4) S-L

2 Keil µ vision 2.1 1) Keil µ vision2 V2.34 µ vision3 2) Sino_Keil.exe   Keil c:\keil\ 3) JET51 USB PC C:\Keil\ USB PC 4) S-L 1 SH88F516 8051 64K FLASH 1024 EEPROM SH88F516 JET51 S-Lab Keil µ vision ISP51 Keil µ vision ISP51 ISP51 PC RS232 MCU SH88F516 SH88F516 1.1 SH88F516 1.1 SH88F516 SH88Fxx: QFP44, DIP40 RAM Flash E2 ADC

More information

CH559指令周期.doc

CH559指令周期.doc CH55X 汇编指令周期表 CH55X 汇编指令概述 : 型号包含 : a. 指令单周期型号 :CH557 CH558 CH559; b. 指令 4 周期型号 :CH551 CH552 CH553 CH554; c. 非跳转指令的指令周期数与指令字节数相同 ; d. 跳转指令含 MOVC/RET/CALL 通常比字节数多若干个周期 ; e.movc 指令多 4 或 5 个周期 ( 下条指令地址为奇数时多

More information

CM ZT1

CM ZT1 Spansion 模拟和微控制器产品 本文档包含有关 Spansion 模拟和微控制器产品的信息 尽管本文档内有原来开发该产品规格的公司名称 富士通 或 Fujitsu, 该产品将由 Spansion 提供给现有客户和新客户 规格的延续本文档内容并不因产品供应商的改变而有任何修改 文档内容的其他更新, 均为改善文档而进行, 并已记录在文档更改摘要 日后如有需要更改文档, 其更改内容也将记录在文档更改摘要

More information

1-1 SH79F6431 A. 2( ) 9~15V ( 12V) U2 U3 3.3V SH79F B. 1(VCC/GND) SH79F6431 C. VDDIO SH79F6431 P4 P5 P0.6 P0.7 VDDIO VDDIO=5V D. 2 V 1.0

1-1 SH79F6431 A. 2( ) 9~15V ( 12V) U2 U3 3.3V SH79F B. 1(VCC/GND) SH79F6431 C. VDDIO SH79F6431 P4 P5 P0.6 P0.7 VDDIO VDDIO=5V D. 2 V 1.0 SH79F6431 1. SH79F6431 1T 8051 FLASH SH79F JET51 Keil µ vision JTAG 1.1. SH79F6431 LQFP64 1.2. (Target Board) SH79F6431 1 V 1.0 1-1 SH79F6431 A. 2( ) 9~15V ( 12V) U2 U3 3.3V SH79F6431 1 2 1 B. 1(VCC/GND)

More information

第5章:汇编语言程序设计

第5章:汇编语言程序设计 第 5 章 : 汇编语言程序设计 程 汇编语言指令格式 系统伪指令 存储器选择方式 常用子程序 1 汇编语言程序设计 PIC 指令系统 语言系统 指 CPU 编 器语言 器语言 器语言 设计 用 语言 设计 语言 汇编语言 2 汇编语言指令格式 汇编语言指令格式 ( 指令 ) label opcode operand comment 指令 用 存 指令 指令语 3 汇编语言指令格式 1 指令 用 指令

More information

* 4 6 R P r p . 1 2 3 4 7 89bk 6 5 1 2 3 4 5 6 7 8 9 0 bk r bl bm bn^ bo bl br bq bpbo bn bm [ ] [ ] [ ] bp 8 2 4 6 bq p [ ] [SET] br clckbt bs bs bt ck cl. 1 2 1 2+- 3 3 . 1 2 3 4 5 6 7 8 9 bk bl bm

More information

2005.book

2005.book ...4... 4... 7...10... 10... 10... 10... 10... 11... 11 PCC... 11 TB170... 12 /... 12...13... 13 BP150 / BP151 / BP152 / BP155... 14...15... 15... 15... 15... 15... 15... 15... 16 PS465 / PS477... 17 PS692

More information

ICD ICD ICD ICD ICD

ICD ICD ICD ICD ICD MPLAB ICD2 MPLAB ICD2 PIC MPLAB-IDE V6.0 ICD2 usb PC RS232 MPLAB IDE PC PC 2.0 5.5V LED EEDATA MPLAB ICD2 Microchip MPLAB-IDE v6.0 Windows 95/98 Windows NT Windows 2000 www.elc-mcu.com 1 ICD2...4 1.1 ICD2...4

More information

图 内部结构图 8251 的外部引脚如图 所示, 共 28 个引脚, 每个引脚信号的输入输出方式如图中的箭 头方向所示

图 内部结构图 8251 的外部引脚如图 所示, 共 28 个引脚, 每个引脚信号的输入输出方式如图中的箭 头方向所示 实验题目 : 串行接口芯片 8251 实验目的 : 1. 掌握 8251 的工作方式及应用 2. 了解有关串口通讯的知识 串行接口芯片 8251 3. 掌握使用 8251 实现双机通讯的软件编程和电路连接 实验设备 : IA-32 架构的微机系统及应用教学平台两套 实验原理 : 1. 8251 的基本性能 性能 : 8251 是可编程的串行通信接口, 可以管理信号变化范围很大的串行数据通信 有下列基本

More information

Microsoft Word - Ö¸Á.doc

Microsoft Word - Ö¸Á.doc 指令集说明 注 由于资源大小问题 其中以下几款 MCU 只有 62 条指令 其余均为 63 条指令 HT48CA0/HT48RA0A 无 RETI 指令 HT48R05A-1 无 TABRDL 指令 指令寻址方式有下面 5 种 立即寻址 此一寻址法是将立即的常数值紧跟在运算码 (opcode) 后 例如 MOV A, 33H ADD A, 33H 直接寻址 直接寻址的情況只允许在存储器之间作数据传送

More information

,768 32,767 32K JMP Jnnn (386+) LOOP CALL [Label:] JMP short/near/far address L10: jmp jmp L20: L10 L20

,768 32,767 32K JMP Jnnn (386+) LOOP CALL [Label:] JMP short/near/far address L10: jmp jmp L20: L10 L20 (Jump) (Loop) (Conditional jump) CMP CALL AND SAR/SHR TEST JMP NOT SAL/SHL Jnnn* OR RCR/ROR LOOP XOR RCL/ROL RETn * nnn, JNE JL -128 127-32,768 32,767 32K JMP Jnnn (386+) LOOP CALL [Label:] JMP short/near/far

More information

33023A.book(31026A_cn.fm)

33023A.book(31026A_cn.fm) 26 第 26 章看门狗定时器与休眠模式 目录 看门狗定时器与休眠模式 本章包括下面一些主要内容 : 26.1 简介... 26-2 26.2 控制寄存器... 26-3 26.3 看门狗定时器 (WDT) 的操作... 26-4 26.4 休眠省电模式... 26-7 26.5 初始化... 26-9 26.6 设计技巧... 26-10 26.7 相关应用笔记... 26-11 26.8 版本历史...

More information

版权声明 龙芯 免责声明 据 龙芯 2 Building No.2, Loongson Industrial Park, Zhongguancun Environmental Protection Park (Tel) (Fax)

版权声明 龙芯 免责声明 据 龙芯 2 Building No.2, Loongson Industrial Park, Zhongguancun Environmental Protection Park (Tel) (Fax) 2018 9 29 龙芯 版权声明 龙芯 免责声明 据 龙芯 2 Building No.2, Loongson Industrial Park, Zhongguancun Environmental Protection Park (Tel) 010-62546668 (Fax) 010-62600826 阅读指南 龙芯 1C101 处理器数据手册 龙芯 1C101 修订历史 序号 更新日期 版本号

More information

MDT90P01 4-Bit RISC MCU 使用及注意事项 1. MDT90P01 4-bit RISC MCU PIN MAP: SOT-26 PB0 1 6 PB3 VSS 2 5 VDD PB1 3 4 PB2/RTCC 2. IC 烧入注意事项 : A. 需制作转接座 : Writer

MDT90P01 4-Bit RISC MCU 使用及注意事项 1. MDT90P01 4-bit RISC MCU PIN MAP: SOT-26 PB0 1 6 PB3 VSS 2 5 VDD PB1 3 4 PB2/RTCC 2. IC 烧入注意事项 : A. 需制作转接座 : Writer MT90P0 4-Bit RISC MCU 使用及注意事项 MT90P0 4-bit RISC MCU PIN MAP: SOT-26 PB0 6 PB3 VSS 2 5 V PB 3 4 PB2/RTCC 2 IC 烧入注意事项 : A 需制作转接座 : Writer PIN MAP: V NC PB3 PB2 VSS PB PB0 NC ( 底 ) B 需更改 Writer Firmware WM0

More information

GW2A 系列 FPGA 产品 GW2A-18 器件 Pinout Version History 日期 版本 2016/8/ /9/ /11/ /2/ /6/ /6/ /8

GW2A 系列 FPGA 产品 GW2A-18 器件 Pinout Version History 日期 版本 2016/8/ /9/ /11/ /2/ /6/ /6/ /8 Version History 日期 版本 2016/8/4 1.00 2016/9/2 1.01 2016/11/29 1.02 2017/2/16 1.03 2017/6/9 1.04 2018/6/27 1.05 2018/8/8 1.06 新增 MG196 PBGA256S 封装信息 ; 修改 SSPI 模式的配置功能 ; 增加 QN88 封装信息 2019/3/27 1.07 增加电源供电要求

More information

Microsoft Word - Smoke detector QD4 Chn.doc

Microsoft Word - Smoke detector QD4 Chn.doc 基于 MC9S08QG4 的烟雾传感器应用设计 作者 : 師英飞思卡尔半导体公司 8/16 位应用工程師 在消防安全报警系统中, 烟雾传感器设计的主要要求为 : 低功耗, 低成本, 高可靠性 飞思卡尔半导体推出的 MC9S08QG4 的具有高集成度 高性能, 低功耗, 高性价比和优异的可靠性, 非常适合用于烟雾传感器的设计 MC9S08QG4 是采用高性能 低功耗的 HCS08 内核的飞思卡尔 8

More information

Microsoft Word - mcu-an z-10.doc

Microsoft Word - mcu-an z-10.doc 富士通微电子 ( 上海 ) 有限公司应用笔记 MCU-AN-500007-Z-10 F²MC-8FX 家族 8 位微控制器 MB95200H/210H 系列 外部中断 应用笔记 变更履历 变更履历 日期作者修正记录 2008-03-20 Levi Zhang V1.0, 第一版 本手册共 22 页 1. 本文档记载的产品信息及规格说明如有变动, 恕不预先通知 如需最新产品信息和 / 或规格说明, 联系富士通销售代表或富士通授权分销商

More information

R/W

R/W (HD44780 KS0066 ) 3 3 5 6 10 14 HD44780/KS0066 16 2 LCM 8 1 40 4 LCD HD44780/KS0066 HD44100 IC PCB 0.1 CMOS 1. 2. 3. 4. 5. RH60% 6. 1. 2. 3. PCB 3 4. 5. 6. 1. 280 C 2. 3 4s 3. 4. 5. 3 5 1. 2. IC 3. DC-DC

More information

,Microchip Technology PIC LCD, PIC16F913/914/ 916/917/946 PIC18F6390/6490/8390/8490 PIC16F65J90/85J90 Microchip LCD LCD, Microchip 的优势 LCD PIC, LCD LC

,Microchip Technology PIC LCD, PIC16F913/914/ 916/917/946 PIC18F6390/6490/8390/8490 PIC16F65J90/85J90 Microchip LCD LCD, Microchip 的优势 LCD PIC, LCD LC LCD PIC 单片机解决方案 集成 LCD 驱动器模块的 PIC 单片机 www.microchip.com/lcd ,Microchip Technology PIC LCD, PIC16F913/914/ 916/917/946 PIC18F6390/6490/8390/8490 PIC16F65J90/85J90 Microchip LCD LCD, Microchip 的优势 LCD PIC,

More information

Application Note Transient Voltage Suppressors (TVS) for 表 1 VISHAY 的 SM6T 系列的电特性 25 C 型号 击穿电压 器件标识码 V BR AT I T I T 测试电流 (ma) 关态电压 V RM 漏电流 I RM AT V

Application Note Transient Voltage Suppressors (TVS) for 表 1 VISHAY 的 SM6T 系列的电特性 25 C 型号 击穿电压 器件标识码 V BR AT I T I T 测试电流 (ma) 关态电压 V RM 漏电流 I RM AT V VISHAY GE NERAL SEMICONDUCTOR 瞬态电压抑制器 应用笔记 用于汽车电子保护的瞬态电压抑制器 (TVS) Soo Man (Sweetman) Kim, Vishay I) TVS 的重要参数 TVS 功率等级 TVS Vishay TVS 10 μs/1000 μs (Bellcore 1089) 1 TVS ESD 8 μs/20 μs 2 1 10 µs 10 µs/1000

More information

燃烧器电子控制系统 目录 2

燃烧器电子控制系统 目录 2 聚焦 REC27 燃烧器电子控制系统 燃烧器电子控制系统 目录 2 REC27 燃烧器电子控制系统 2 概述 燃烧器电子控制系统 2 2 2 2 2 A B1 B2 C D E 22 2 2 系统图示 2 2 2 2 2 2 主要特征及优点 燃烧器电子控制系统 2 2 集成控制 2 2 节能 安全运行 运行模式 远程锁定复位 可根据需求提供特殊机型 无接合间隙及机械迟滞 简单的试运行及燃烧器设定 2

More information

SM2965

SM2965 产品清单 SM2965C40, 主频 40MHz, 内带 64KB 闪存的 MCU 总体描述 SM2965 系列产品是一种内嵌 64KB 闪存和 1K 字节 RAM 的 8 位单片微控制器它是 80C52 微控制器家族的派生产品具有在系统可编程 (ISP) 功能其 PDIP 封装具有 32 个 I/O 口而 PLCC/QFP 封装则具有多达 36 个 I/O 口 64K 字节的闪存既可以当作程序空间又可以当作数据空间或者数据和程序混合空间其硬件特征和强大的指令系统使它成为一种性能价格比高的控制器片上闪存的编程可以使用商用编程器进行并行编程也可以根据其

More information

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas 目录 1 IPv6 快速转发 1-1 1.1 IPv6 快速转发配置命令 1-1 1.1.1 display ipv6 fast-forwarding aging-time 1-1 1.1.2 display ipv6 fast-forwarding cache 1-1 1.1.3 ipv6 fast-forwarding aging-time 1-3 1.1.4 ipv6 fast-forwarding

More information

TD

TD *TD-000212-05* 20- 应用实例 4 本例显示的是使用两个亚低 音扬声器和多个顶箱的双声 道 立体声 设置 除了各声道都增加了一个顶 箱外 也可以增加更多的顶 箱 本例和例 3 的情况一 致 声道 2 或 右声道 声道 1 或 左声道 要接到更多的顶箱 将最后 一个顶箱的全幅线路输出接 头处的线缆接到下一个顶箱 的全幅线路输入接头 在不 降低信号质量的情况下 最

More information

33023A.book(31005A_cn.fm)

33023A.book(31005A_cn.fm) 第 5 章 CPU 和 ALU 目录 本章包括下面一些主要内容 : 5. 简介...5-2 5.2 指令的一般格式... 5-4 5.3 中央处理单元 (CPU)... 5-4 5.4 指令时钟... 5-4 5.5 算术逻辑单元 (ALU)... 5-5 5.6 状态寄存器... 5-6 5.7 OPTION_REG 寄存器... 5-8 5.8 电源控制寄存器... 5-9 5.9 设计技巧...

More information

RESET OSCO OSCI OSC CPU WDTEN RC RESET PRESCALER PORTA (4-BITS) WATCHDOG TIMER Power on PORTB (4-BITS) PORTA [0:3] PORTB [0:3] LPD PORTC (4-BITS) LPDO

RESET OSCO OSCI OSC CPU WDTEN RC RESET PRESCALER PORTA (4-BITS) WATCHDOG TIMER Power on PORTB (4-BITS) PORTA [0:3] PORTB [0:3] LPD PORTC (4-BITS) LPDO 4K / I/O 4 SH6610C 4 OTPROM 4K X 16 SH69P25 MASK ROM 4K X 16 SH69K25 RAM 192 X 4-32 - 160 2.4V - 5.5V 5.0V 22 I/O 4 8 / PORTA-PORTF / - Timer0 - PORTB & PORTC / - 32.768kHz 4MHz - 400kHz 4MHz - RC 400kHz

More information

Andes Technology PPT Temp

Andes Technology PPT Temp 晶心科技線上技術研討會 AndesCore 便捷的全 C 嵌入式编程 晶心科技市場及技術服務部毛礼杰軟件經理 WWW.ANDESTECH.COM 大纲 系统初始化介绍 异常和中断说明 全 C 语法例子说明 总结 2 CPU 相关特性 1: 中断向量表 系统初始化 (1) 2: 系统寄存器 通常需要用 assembly( 汇编 / 组合 ) 语言来操作 AndesCore 全 C 嵌入式编程 C 扩展语法

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

Ps22Pdf

Ps22Pdf ( ) ( 150 ) 25 15 20 40 ( 25, 1, 25 ), 1. A. B. C. D. 2. A. B. C. D. 3., J = 1 H = 1 ( A B, J', J, H ) A. A = B = 1, J' =0 B. A = B = J' =1 C. A = J' =1, B =0 D. B = J' = 1, A = 0 4. AB + AB A. AB B. AB

More information

untitled

untitled 8086/8088 CIP /. 2004.8 ISBN 7-03-014239-X.... TP313 CIP 2004 086019 16 100717 http://www.sciencep.com * 2004 8 2004 8 1 5 500 787 1092 1/16 16 1/2 391 000 1 2 ii 1 2 CAI CAI 3 To the teacher To the student

More information

Microsoft Word - em78 sub program.doc

Microsoft Word - em78 sub program.doc 一 二进制数转换为 ASCⅡ 码 将一个字节的二进制数转换为两位 16 进制数的 ASCⅡ 码 main: mov a,@0x9f ; 二进制数为 0x9f mov 0x30,a ; 二进制数存入 0x30 mov a,@0x02 mov 0x10,a ;0x10 中存放转换次数 mov a,@0x31 mov 0x04,a ;0x04 中为转换后数据存放地址 mov a,0x30 B1: ; 取

More information

SPMC75F2413A_EVM_使用说明_V1.2.doc

SPMC75F2413A_EVM_使用说明_V1.2.doc SPMCFA EVM V. - Jan 0, 00 http://www.sunplusmcu.com ................ SPMCFA........... EEPROM.... I/O............ LED.... LED.... RS-........0............ EVM................ 0.....0..... SPMCFA EVM SPMCFA

More information

FM1935X智能非接触读写器芯片

FM1935X智能非接触读写器芯片 FM3316/3315 MCU 2017.06 FM3316/3315 MCU 2.21 (http://www.fmsh.com/) FM3316/3315 MCU 2.22 ... 3 1... 4 2... 5 2.1... 5 2.2... 5 2.3... 6 2.3.1... 6 2.3.2... 6 2.4... 9 2.5... 10 2.5.1 LQFP64... 10 2.5.2

More information

Microsoft Word - LMB402CBC-AppNote-V0.1.doc

Microsoft Word - LMB402CBC-AppNote-V0.1.doc LMB402CBC 液晶显示模块应用参考 深圳市拓普微科技开发有限公司 版本描述日期编者 0.1 新版本 2006-02-09 杨军 http://www.topwaysz.com 1 / 1 目录 1 概述 3 2 硬件接口 3 3 软件特性 3 3.1 控制器接口信号说明 3 3.2 模块指令系统 4 4 显示数据存储器的地址 4 5 字符发生器 CGRAM 的地址 5 6 应用举例 5 6.1

More information

FPGAs in Next Generation Wireless Networks WPChinese

FPGAs in Next Generation Wireless Networks WPChinese FPGA 2010 3 Lattice Semiconductor 5555 Northeast Moore Ct. Hillsboro, Oregon 97124 USA Telephone: (503) 268-8000 www.latticesemi.com 1 FPGAs in Next Generation Wireless Networks GSM GSM-EDGE 384kbps CDMA2000

More information

SMART 7P 0 HR7P OTPMCU A/D I/O OTP ROM RAM HR7P HR7P HR7PPMB MSOP0 7+input HR7PPSC HR7PPSD SOP SOP6 +input input HR7PERB SSOP0 7

SMART 7P 0 HR7P OTPMCU A/D I/O OTP ROM RAM HR7P HR7P HR7PPMB MSOP0 7+input HR7PPSC HR7PPSD SOP SOP6 +input input HR7PERB SSOP0 7 上海东软载波微电子有限公司 SMART www.essemi.com SMART 7P 0 HR7P OTPMCU A/D I/O OTP ROM RAM HR7P HR7P HR7PPMB MSOP0 7+input 06 6 6 HR7PPSC HR7PPSD SOP SOP6 +input 06 6 +input 06 6 6 6 HR7PERB SSOP0 7+input 06 6 6 HR7PESC

More information

目 录 1. 简介 概览 CM 仿真器特性 CM 仿真器外观 入门指南 CM 仿真器虚拟端口功能 安装 CM 仿真器 USB CDC 驱动软件 测试 CM 仿真器虚拟端

目 录 1. 简介 概览 CM 仿真器特性 CM 仿真器外观 入门指南 CM 仿真器虚拟端口功能 安装 CM 仿真器 USB CDC 驱动软件 测试 CM 仿真器虚拟端 Cortex-M 仿真器用户手册 适用产品 本仿真器支持芯片型号 : 系列 华大半导体 (HDSC) Cortex-M 系列 MCU 芯片 型号 - 目 录 1. 简介... 3 1.1 概览... 3 1.1.1 CM 仿真器特性... 3 1.1.2 CM 仿真器外观... 4 1.2 入门指南... 5 2. CM 仿真器虚拟端口功能... 6 2.1 安装 CM 仿真器 USB CDC 驱动软件...

More information

Microsoft Word - SAM-BA.doc

Microsoft Word - SAM-BA.doc ATMEL SAM-BA and SAM-PROG 用户手册 译者 :www.mcuzone.com 版本 :VER1.0 日期 :2005-08 SAM-BA and SAM-PROG: Atmel's Flasher Tools 术语 : SAM-BA GUI(SAM-BA 图形用户界面 ) 和 SAM-PROG 为 PC 端应用程序 SAM-BA BOOT 为固化于微控制器端的应用程序 SAM-BA

More information

FM1935X智能非接触读写器芯片

FM1935X智能非接触读写器芯片 FM33A0xx MCU 2017. 05 2.0 1 (http://www.fmsh.com/) 2.0 2 ... 3 1... 4 1.1... 4 1.2... 4 1.3... 5 1.3.1... 5 1.3.2... 5 1.4... 8 1.4.1 LQFP100... 8 1.4.2 LQFP80... 9 1.4.3... 9 2... 15 2.1 LQFP100... 15

More information

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP:  ******************* * 关于 Java 测试试题 ****** ******************* * 关于 Java 测试试题 ******************* 問 1 运行下面的程序, 选出一个正确的运行结果 public class Sample { public static void main(string[] args) { int[] test = { 1, 2, 3, 4, 5 ; for(int i = 1 ; i System.out.print(test[i]);

More information

(Load Project) (Save Project) (OffLine Mode) (Help) Intel Hex Motor

(Load Project) (Save Project) (OffLine Mode) (Help) Intel Hex Motor 1 4.1.1.1 (Load) 14 1.1 1 4.1.1.2 (Save) 14 1.1.1 1 4.1.2 (Buffer) 16 1.1.2 1 4.1.3 (Device) 16 1.1.3 1 4.1.3.1 (Select Device) 16 2 4.1.3.2 (Device Info) 16 2.1 2 4.1.3.3 (Adapter) 17 2.1.1 CD-ROM 2 4.1.4

More information

12232A LED LED LED EL EL CCFL EL CCF

12232A LED LED LED EL EL CCFL EL CCF 12232A 0 50-20 +70-30 +85 LED LED LED EL EL CCFL EL CCF 122 x 32 1/32Duty 1/5Bias 6:00 STN( ), EL LED EL/100VAC 400HZ LED/4.2VDC 1 / VDD-VSS 0 6.5 V Ta=25 LCD VDD-V0 0 12.0 V V1 0 VDD V VDD-VSS - 4.75

More information

第10章:CCP捕捉/比较/脉宽调制

第10章:CCP捕捉/比较/脉宽调制 第 10 章 :CCP 捕捉 / 比较 / 脉宽调制 CCP 模块功能 捕捉功能模式 比较功能模式 脉宽调制功能 1 CCP 模块功能 PIC 2 捕捉 比较 脉宽调制模块 CCP1 CCP2(Capture/Compare/PWM) 16 CCPR1 CCPR2 模块 功能 功能 TMR1 TMR2 2 CCP 模块功能 CCP 模块 3 模式 : 捕捉 式 比较 式 脉宽调制 式 捕捉功能 捕捉

More information

F515_CS_Book.book

F515_CS_Book.book /USB , ( ) / L R 1 > > > 2, / 3 L 1 > > > 2 + - 3, 4 L 1 了解显示屏上显示的图标 Wap 信箱收到一条 Wap push 信息 ( ) GSM 手机已连接到 GSM 网络 指示条越多, 接收质量越好 2 ...........................4.............................. 4 Micro SD (

More information

目录 1 H3C R4900 G2 服务器可选部件与操作系统兼容性列表 控制卡 GPU 卡 网卡 FC HBA 卡 TPM/TCM 模块 NVMe SSD PCle 加速卡 1-31 i

目录 1 H3C R4900 G2 服务器可选部件与操作系统兼容性列表 控制卡 GPU 卡 网卡 FC HBA 卡 TPM/TCM 模块 NVMe SSD PCle 加速卡 1-31 i 目录 1 H3C R4900 G2 服务器可选部件与操作系统兼容性列表 1-1 1.1 控制卡 1-1 1.2 GPU 卡 1-5 1.3 网卡 1-8 1.4 FC HBA 卡 1-21 1.5 TPM/TCM 模块 1-29 1.6 NVMe SSD PCle 加速卡 1-31 i 1 H3C R4900 G2 服务器可选部件与操作系统兼容性列表 本手册为产品通用资料 对于定制化产品, 请用户以产品实际情况为准

More information

ARM JTAG实时仿真器安装使用指南

ARM JTAG实时仿真器安装使用指南 ARM JTAG Version 1.31 2003. 11. 12 ARM JTAG ARM JTAG.3 ARM 2.1.4 2.2.4 ARM JTAG 3.1 18 3.2 18 3.2.1 Multi-ICE Server.18 3.2.2 ADS..21 ARM JTAG 4.1 Multi-ICE Server 33 4.1.1 Multi-ICE Server..... 33 4.1.2

More information

<4D F736F F F696E74202D20B5DA35D5C2CEA2B4A6C0EDC6F7B9A4D7F7D4ADC0ED2E707074>

<4D F736F F F696E74202D20B5DA35D5C2CEA2B4A6C0EDC6F7B9A4D7F7D4ADC0ED2E707074> 第 5 章 微处理器工作原理 1 5.1 8086 处理器 2 1. 管脚定义 3 8086/88 管脚描述 8086:16 位微处理器, 16 位外部数据总线 8088:16 位微处理器, 8 位外部数据总线 GND AD14 AD13 AD12 AD11 AD10 AD9 AD8 AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0 NMI INTR CLK GND 1 2 3 4 5

More information

1. 介绍 义隆 8 位单片机指令介绍 Application Notes 义隆 8 位单片机指令介绍 EM78/EM88 系列是基于 RISC 的精简指令微控制器, 每条指令是 13 位 15 位, 除 LCALL LJMP MOV R2,A ADD R2,A 改变 PC 指针的指令是 2 个指令

1. 介绍 义隆 8 位单片机指令介绍 Application Notes 义隆 8 位单片机指令介绍 EM78/EM88 系列是基于 RISC 的精简指令微控制器, 每条指令是 13 位 15 位, 除 LCALL LJMP MOV R2,A ADD R2,A 改变 PC 指针的指令是 2 个指令 1. 介绍 Application Notes EM78/EM88 系列是基于 RISC 的精简指令微控制器, 每条指令是 13 位 15 位, 除 LCALL LJMP MOV R2,A ADD R2,A 改变 PC 指针的指令是 2 个指令 * 周期, 其余为单指令周期 ( 部分第一代芯片 JMP CALL RET RETL RETI JBS JBC JZ JZA DJZ DJZA 指令为 2

More information

GENERAL-PURPOSE I/OS (GPIO)

GENERAL-PURPOSE I/OS (GPIO) Same as STM32L 通用输入输出端口 GPIO 1 2 培训内容 GPIO 引脚分布和结构框图 I/O 引脚的多路复用选择和映射 (STM32F2 新增 ) I/O 引脚的 8 种配置模式 输入 : 浮空 上 / 下拉 模拟输入 输出 : 可配置上 / 下拉的推挽输出 开漏输出 I/O 引脚的特色功能 引脚配置锁定 引脚上的位操作 I/O 补偿单元 (STM32F2 新增 ) 特殊 I/O

More information

128K Flash EPROM 的程序?\(Bank=64K\) 切?

128K Flash EPROM 的程序?\(Bank=64K\) 切? 应用说明 华邦 8 位单片机 (8051 内核 ) 应用说明 华邦 8 位单片机 (8051 内核 ) ANSC-UC08-0007 目录 - 1. 应用说明 :...4 1.1...4 1.2 相关寄存器介绍...4 1.2.1 串行口控制寄存器 (SCON)... 4 1.2.2 串行数据缓冲寄存器 (SBUF)... 5 1.2.3 串行口控制 1 (SCON1)... 5 1.2.4 串行数据接收缓冲

More information

USB解决方案.ppt

USB解决方案.ppt USB USB? RS232 USB USB HID U modem ADSL cable modem IrDA Silabs USB CP210x USB UART USB RS-232 USB MCU 15 USB 12 FLASH MCU 3 USB MCU USB MCU C8051F32x 10 ADC 1.5%, Vref CPU 25MIPS 8051 16KB Flash -AMUX

More information

Microsoft Word - mcu-an z-11.doc

Microsoft Word - mcu-an z-11.doc 富士通微电子 ( 上海 ) 有限公司应用笔记 MCU-AN-500007-Z-11 F²MC-8FX 家族 8 位微控制器 MB95200H/210H 系列 外部中断 应用笔记 外部中断 V1.1 变更履历 变更履历 日期作者修正记录 2008-03-20 Levi Zhang V1.0, 第一版 2008-07-18 Levi.Zhang V1.1, 在第 6 章更多信息中添加 URL; 更新了一些样本程式

More information

Microsoft Word - ~ doc

Microsoft Word - ~ doc EEPROM 功能使用方法 1 适用产品 : 1.1 SM39R16A2/ SM39R12A2/ SM39R08A2 1.2 SM39R4051/ SM39R2051 1.3 SM39R04G1/ SM39R02G1 2 EEPROM 功能概述 : 2.1 使用 code flash 仿真为 Internal EEPROM, 在程序执行时, 可将 code flash 作为 data flash 储存数据使用

More information

L15 MIPS Assembly

L15 MIPS Assembly Lecture 19: MIPS Assembly Language 程序的机器级表示主要内容 MIPS 指令格式 R- 类型 / I- 类型 / J- 类型 MIPS 寄存器 长度 / 个数 / 功能分配 MIPS 操作数 寄存器操作数 / 存储器操作数 / 立即数 / 文本 / 位 MIPS 指令寻址方式 立即数寻址 / 寄存器寻址 / 相对寻址 / 伪直接寻址 / 偏移寻址 MIPS 指令类型

More information

<4D F736F F D20C9EEDBDACAD0B6ABB3CFD0C5B5E7D7D3BFC6BCBCD3D0CFDEB9ABCBBEBDE9C9DCBCB0BFE2B4E6>

<4D F736F F D20C9EEDBDACAD0B6ABB3CFD0C5B5E7D7D3BFC6BCBCD3D0CFDEB9ABCBBEBDE9C9DCBCB0BFE2B4E6> 台湾合泰 HOLTEK 型号品牌封装说明 HT7022A-1#-SOT89 HOLTEK SOT89 2.2V N 沟开漏电压监测器 HT7022A-1-TO92 HOLTEK TO92 2.2V N 沟开漏电压监测器 HT7024A-1#-SOT89 HOLTEK SOT89 2.4V N 沟开漏电压监测器 HT7024A-1-TO92 HOLTEK TO92 2.4V N 沟开漏电压监测器 HT7027A-1#-SOT89

More information

LETD型LED灯炮规格的更改

LETD型LED灯炮规格的更改 2018 十二月 1/10 页 软件错误问题软件错误 1 Automation Organizer(WindLDR) 软件之修复 针对版本 : WindLDR 版本 8.2.0 至版本 8.9.1 (Automation Organizer 版本 3.20 至 版本 3.12.1) 注 : 包括由官网下载的版本 当使用以上版本软件, 软件错误 1 将会出现在以下型号 : FC6A CPU 模块 -

More information

OB1

OB1 SIMATIC 克索稳定杆淬火机 20150813\ 2018-06-14 09:29: 30 OB1 - < 离线 > Cycle Execution 名称 : 系列 : 作者 : 版本 : 0.1 块版本 : 2 时间标志代码 : 2018-02-10 14:06:32 接口 : 1996-02-15 16:51:12 长度 ( 块 / 逻辑 / 数据 ): 11154 10520 00030

More information

1 TPIS TPIS 2 2

1 TPIS TPIS 2 2 1 1 TPIS TPIS 2 2 1. 2. 3. 4. 3 3 4 5 4 TPIS TPIS 6 5 350 Mark Coil F3/F6 350 M 150 M 25 M 7.12M 8 M F3 F6 F4 F7 F8 8M AA 7 350 28V 5V IC HCPL2731 0.5mA 6 8 (TPIS) TPIS 9 7 IC AT89C2051 AT89C2051 CMOS8

More information

基于 ARM Cortex-M0 的 ES32F033x 系列 MCU 内核 ARM 32 位 Cortex-M0 CPU 最高频率可达 48MHz 存储 最大 256K Byte FLASH 存储器 最大 32K Byte SRAM 数据存储电源 复位 芯片工作电压范围 : 2.2V VDD 5.

基于 ARM Cortex-M0 的 ES32F033x 系列 MCU 内核 ARM 32 位 Cortex-M0 CPU 最高频率可达 48MHz 存储 最大 256K Byte FLASH 存储器 最大 32K Byte SRAM 数据存储电源 复位 芯片工作电压范围 : 2.2V VDD 5. 32 位 MCU ES32F0334 产品简介 产品简介 数据手册 参考手册 上海东软载波微电子有限公司 2018-11-20 V1.0 1/18 基于 ARM Cortex-M0 的 ES32F033x 系列 MCU 内核 ARM 32 位 Cortex-M0 CPU 最高频率可达 48MHz 存储 最大 256K Byte FLASH 存储器 最大 32K Byte SRAM 数据存储电源 复位

More information

<4D F736F F D D433635CFB5C1D0B5A5C6ACBBFAD4ADC0EDBCB0BFAAB7A25F56312E322E646F63>

<4D F736F F D D433635CFB5C1D0B5A5C6ACBBFAD4ADC0EDBCB0BFAAB7A25F56312E322E646F63> 凌阳 8 位通用单片机 SPMC65 系列单片机原理及开发 VERSION1.2 2006-1-12 凌阳单片机推广中心 http://www.sunplusmcu.com 前 言 通用单片机, 其实泛指微控器, 对于芯片提供厂商, 又指应用于通用领域的单片机产品 ; 广泛应用于家电产品 工业控制产品 仪器仪表设备 智能控制器等当中, 渗透在人们的日常生活 生产活动当中 按照通用单片机的数据总线位数划分,

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

HT46R47 f SYS =4MHz 3.3~5.5V f SYS =8MHz 4.5~5.5V 13 位双向输入 / 输出口 1 个与输入 / 输出共用引脚的外部中断输入 8 位带溢出中断的可编程定时 / 计数器 具有 7 级预分频器 石英晶体或 RC 振荡器 位的程序存储器 P

HT46R47 f SYS =4MHz 3.3~5.5V f SYS =8MHz 4.5~5.5V 13 位双向输入 / 输出口 1 个与输入 / 输出共用引脚的外部中断输入 8 位带溢出中断的可编程定时 / 计数器 具有 7 级预分频器 石英晶体或 RC 振荡器 位的程序存储器 P HT46R/47R/48R/49R 系列 选型指南 HT46R22 f SYS =4MHz 3.3~5.5V f SYS =8MHz 4.5~5.5V 19 位双向输入 / 输出口 1 个与输入 / 输出口线共用的外部输入 16 位具有 7 级预分频带溢出中断的可编程定时 / 计数器 内置石英晶体或 RC 振荡器 2048 14 位的程序存储器 PROM 64 8 位的数据存储器 RAM 支持发声的

More information

目 录

目 录 1 Quick51...1 1.1 SmartSOPC Quick51...1 1.2 Quick51...1 1.3 Quick51...2 2 Keil C51 Quick51...4 2.1 Keil C51...4 2.2 Keil C51...4 2.3 1 Keil C51...4 2.4 Flash Magic...9 2.5 ISP...9 2.6...10 2.7 Keil C51...12

More information

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas 目录 1 IPv6 快速转发 1-1 1.1 IPv6 快速转发配置命令 1-1 1.1.1 display ipv6 fast-forwarding aging-time 1-1 1.1.2 display ipv6 fast-forwarding cache 1-1 1.1.3 ipv6 fast-forwarding aging-time 1-3 1.1.4 ipv6 fast-forwarding

More information

Applications

Applications 概述 FM1905 是 24 点 内存映象和多功能的 LCD 驱动器,FM1905 的软件配置特性使它适用于多种 LCD 应用场合, 包括 LCD 模块和显示子系统 用于连接主控制器和 FM1905 的管脚只有 3 条,FM1905 还有一个节电命令用于降 低系统功耗 特点 工作电压 3.0 ~5.0V 内嵌 256KHz RC 振荡器 可外接 32KHz 晶片或 256KHz 频率源输入 可选 1/2

More information

PCM-3386用户手册.doc

PCM-3386用户手册.doc PCM-3386 BBPC-4x86 10/100M PC/104 (Lanry technology Co. Ltd. Zhuhai) 38 1012836 (Address: Room 1012,Linhai Building,No. 38,west of Shihua Road,Zhuhai City,Guangdong Province,China) (post code)519015 (phone)0756-3366659

More information

USER’S MANUAL SP500 SERIES

USER’S MANUAL SP500 SERIES 1.... 1 2.... 2 2-1... 2 2-2... 3 2-3... 3 2-4... 3 3.... 4 4.... 6 4-1... 6 4-2... 7 4-3... 8 4-4... 9 4-5... 9 4-6... 10 4-7... 11 5.... 12 5-1... 12 5-2... 15 5-3... 18 5-4... 19 6.... 20 6-1... 20

More information

16位A/D转换器

16位A/D转换器 16 位 A/D 转换器 anyh 是双竞公司新推出的 16 位 A/D 转换器, 具有两个全差分输入通道, 可用于测量低频模拟信号 这种器件带有增益可编程放大器, 可通过软件编程来直接测量传感器输出的各种微小信号 具有分辨率高 动态范围广 自校准等特点, 因而非常适合于工业控制 仪表测量等领域 16 位 A/D 转换器 1. 概述 是双竞公司新推出的 16 位 A/D 转换器, 具有两个全差分输入通道,

More information

<4D6963726F736F667420576F7264202D20C7B6C8EBCABDCFB5CDB3C9E8BCC6CAA6B0B8C0FDB5BCD1A75FD1F9D5C22E646F63>

<4D6963726F736F667420576F7264202D20C7B6C8EBCABDCFB5CDB3C9E8BCC6CAA6B0B8C0FDB5BCD1A75FD1F9D5C22E646F63> 因 为 路 过 你 的 路, 因 为 苦 过 你 的 苦, 所 以 快 乐 着 你 的 快 乐, 追 逐 着 你 的 追 逐 内 容 简 介 本 书 根 据 2005 年 下 半 年 实 施 的 全 国 计 算 机 技 术 与 软 件 专 业 技 术 资 格 ( 水 平 ) 考 试 嵌 入 式 系 统 设 计 师 级 考 试 大 纲 精 神, 在 深 入 研 究 历 年 计 算 机 技 术 与 软

More information

,,, PCB, AR M VxWorks DSP,,,,,,,,,,, (CIP) /,,.:,2005 ISBN TP36 CIP (2005) : ( 10 ) : : (010 ) : (010)

,,, PCB, AR M VxWorks DSP,,,,,,,,,,, (CIP) /,,.:,2005 ISBN TP36 CIP (2005) : ( 10 ) : : (010 ) : (010) ,,, PCB, AR M VxWorks DSP,,,,,,,,,,, (CIP) /,,.:,2005 ISBN 7-5635-1099-0...............TP36 CIP (2005)076733 : ( 10 ) :100876 : (010 )62282185 : (010)62283578 : publish@bupt.edu.cn : : : 787 mm960 mm 1/

More information

Low-Cost, µP Supervisory Circuits

Low-Cost, µP Supervisory Circuits 概述 高精度 低功耗 MAX1937 I 2 C 接口实时时钟 / 日历 是一款低功耗 CMOS 实时时钟 / 日历芯片, 它提供一个可编程的时钟输出, 一个中断输出和一个掉电检测器, 所有的地址和数据都通过 I2C 总线接口串行传递 最大总线速度为 400Kbits/s, 每次读写数据后, 内嵌的字地址寄存器会自动递增 特性 可计时基于 32.768kHz 晶体的秒, 分, 小时, 星期, 天,

More information

PIC16F F MPLAB 08 16F LED 15 LED

PIC16F F MPLAB 08 16F LED 15 LED PIC16F877 PIC16F877 03 16F877 05 06 MPLAB 08 16F877 13 LED 15 LED 17 20 24 2 PIC16F877 PIC16F877 DIP VDD VSS CLOCK CPU :,AND,OR,XOR ROM: CPU ROM RAM: CPU,CPU I/O:CPU, CPU,, 16F877 RAM 512 128 Bank Bank

More information

管脚配置 底板插口配置 芯片大小 (mil) 2-2 -

管脚配置 底板插口配置 芯片大小 (mil) 2-2 - HOLTEK HT1621 LCD 驱动器 特性 * 工作电压 2.4 5.2V * 内嵌 256KHz RC 振荡器 * 可外接 32KHz 晶片或 256KHz 频率源输入 * 可选 1/2 或 1/3 偏压和 1/2 1/3 或 1/4 的占空比 * 片内时基频率源 * 蜂鸣器可选择两种频率 * 节电命令可用于减少功耗 * 内嵌时基发生器和看门狗定时器 WDT * 时基或看门狗定时器溢出输出

More information