亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7....

399
亿恒 C164CI 16 位单片机 陆延丰 王海林 张 春 编著 清华大学出版社

Transcript of 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7....

Page 1: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

亿恒 C164CI 16位单片机陆延丰 王海林 张 春 编著

清 华 大 学 出 版 社

Page 2: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

(京 )新登字 158号

内 容 简 介

C164CI 单片机是亿恒 C166 族 16 位单片机中很具代表性的一员。

本书详细介绍了 C164CI的体系结构、指令系统、各种工作模式、内置周边电路以及它们的使用方

法 ,并说明了 C语言和汇编语言混合编程的要点 ,给出了一些应用实例。此外 ,还简要介绍了 SK-164 练

习器。

本书阐述清楚 ,内容详尽 ,适合具有一定单片机基础知识的读者 ,可作为大专院校相关课程的教学

参考用书 ,也可作为单片机应用开发人员的培训教材和参考资料。

书 名 : 亿恒 C164CI 16位单片机

作 者 : 陆延丰 王海林 张 春 编著

出版者 : 清华大学出版社(北京清华大学学研大厦 ,邮编 100084 )

ht tp :/ / www .tup .tsinghua .edu .cn

印刷者 : 北京国马印刷厂

发行者 : 新华书店总店北京发行所

开 本 : 787×1092 1/ 16 印张 : 26. 25 字数 : 603 千字

版 次 : 2002 年 6 月第 1 版 2002 年 6 月第 1 次印刷

书 号 : ISBN 7-302-05405-3/ T P·3182

印 数 : 0001~4000

定 价 : 40 .00元

Page 3: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

亿恒科技 (前身为西门子半导体部 )总部位于德国慕尼黑。1999 年 4 月 ,为加快决策

速度 ,提高公司整体灵活性及竞争能力 ,公司从西门子集团正式脱离 , 2000 年 3 月在德国

法兰克福和美国纽约证券交易所上市。

亿恒科技主要产品有智能芯片卡 ,汽车集成电路 ,有线通信领域中的 ISDN、VDSL、

SDSL 及编码译码器 ,无线通信领域中的涉频产品 ,混合信号领域中的模拟集成电路 ,

DRAM 类产品等 ,为有线和无线通信市场以及安全领域、工业自动化等的各种应用提供

系统的解决方案。亿恒在美国、亚太等地区设有多处研发中心 ,员工约 29000 人 , 2000 年

财政年度实现销售额 72.8 亿欧元。

新加坡的亿恒科技是亚太地区进行市场营销、物流管理和研究发展 (微电子设计和包

装技术 )的中心。在中国 ,我们投资了 1 个独资工厂和 4 个销售机构 ,拥有一批行业内处

领导地位的合作伙伴 ,如联想、康佳、大唐、中兴等 ,同时与复旦大学和清华大学有多个合

作开发项目。

作为半导体行业全球领先的公司 ,面对中国良好的经济发展形势 ,总部对公司在中国

的发展重新作了规划 ,把中国作为发展的重点。我们正着手同一些国内行业领先的企业

进行从解决方案、技术到产品的全方位合作。

进入了生机勃勃的新世纪 ,亿恒将致力于与中国企业和大学的进一步合作 ,为中国的

微电子产业发展作出贡献。本书介绍亿恒 16 位单片机的性能特点、工作原理和使用要

点。相信本书的出版将有助于用户对亿恒单片机产品的了解 ,使用户更喜欢亿恒的产品。

罗建华亿恒亚太总裁与执行董事

Page 4: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

随着新世纪的到来 ,以多媒体电脑、互联网、移动电话、数字影音产品为代表的各类数

字化产品获得了迅猛的发展 ,而其核心部件 ,如微处理器、单片机和数字信号处理器件的

进步和发展更为引人注目。

亿恒科技 (前西门子半导体部 )已发展成长为一个独立实体。其产品数量在世界排名

前 10 名以内。亿恒的各类单片机在世界上也相当知名。本书详细介绍了亿恒 16 位单片

机 C166 族的一个典型成员 C164CI的性能特点、工作原理和使用方法。由此不仅可对亿

恒 C166 族单片机有一个概括的了解 , 而且还为单片机用户提供了设计和制作各类应用

产品所需的必备知识。

全书共 1 0 章。第 1 章概要介绍亿恒 16 位单片机 ;第 2 章描述 C164CI单片机的

体系结构 ;第 3 章说明指令系统和汇编语言 ;第 4 章说明系统的运行管理 ;第 5 章至

第 8 章介绍片上周边电路的功能和使用方法 , 包括定时器、捕获/ 比较器、串行 I/ O

口、A/ D 转换器和 CAN 总线接口等 ;第 9 章描述 C 语言程序 ;第 1 0 章介绍 SK-16 4

练习器。

本书由清华大学教师和研究人员合作编写。第 1 , 2 和 4 章由陆延丰编写 ,第 3 章由

史媛媛、陆延丰合写 ,第 5~8 章和第 10 章由王海林编写 ,第 9 章由张春编写。全书由陆

延丰组织统稿 ,高文焕审阅。

本书适合具有一定单片机基础知识的读者 ,可作为大专院校学生学习单片机的教学

参考用书 ,也可作为单片机应用开发人员的培训教材和参考资料。

本书编写过程中得到亿恒科技亚太区 Edwin Tan 先生、潘先弟先生 , 以及亿恒科

技德国总部 Pierre G . Mayer 先生的大力支持和帮助 , 编者在此对他们表示深切的

谢意。

本书是详细介绍 C164CI 单片机性能和使用方法的书籍。在编写过程中 ,作者力求

Page 5: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

做到概念正确 ,条理分明 ,便于应用。但由于我们使用时间短 ,编写时间又紧 ,学识水平有

限 ,缺点和错漏之处在所难免 ,敬请读者指正。

有关亿恒单片机的更详细和完整的资料 ,读者可以从以下网页上获取 :

http:// www .infineon .com

编 者

2001 年 11 月于清华大学

亿恒 C164CI 16 位单片机

Page 6: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

第 1章 亿恒 16位单片机 1

1 .1 概况 1 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

1 .2 C164CI单片机简介 4 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

1 .2 .1 主要性能指标 4 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

1 .2 .2 引脚定义 5 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

1 .2 .3 组成方框图 9 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

1 .3 C164CI单片机特点 10 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

1 .3 .1 优化的 CP U 核 10 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

1 .3 .2 功能增强的系统资源 14 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

1 .3 .3 片内的周边电路 16 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

1 .3 .4 灵活的功率管理 21 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

1 .4 单片机开发工具 21 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

第 2章 体系结构 23

2 .1 存储器的组织 23 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

2 .1 .1 概述 23 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

2 .1 .2 内部 ROM 区 24 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

2 .1 .3 内部 RAM 和 SFR 区 25 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

2 .1 .4 片内 XRAM 29 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

2 .1 .5 外部存储空间 29 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

2 .1 .6 存储器边界的跨越 30 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

2 .2 中央处理器 31 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

2 .2 .1 概述 31 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

2 .2 .2 指令的流水线操作 32 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

Page 7: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

2 .2 .3 位处理和位保护 36 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

2 .2 .4 指令状态时间 38 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

2 .2 .5 CP U 专用寄存器 39 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

2 .3 中断和陷阱功能 52 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

2 .3 .1 概述 52 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

2 .3 .2 普通的中断处理和 PEC服务 55 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

2 .3 .3 中断的响应 64 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

2 .3 .4 外部中断 67 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

2 .3 .5 陷阱功能 70 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

2 .4 时钟生成 74 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

2 .4 .1 概述 74 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

2 .4 .2 振荡器 75 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

2 .4 .3 频率控制 76 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

2 .4 .4 振荡器监视器 79 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

2 .4 .5 时钟驱动 79 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

2 .5 并行 I / O 口 80 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

2 .5 .1 概述 80 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

2 .5 .2 P0 口 85 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

2 .5 .3 P1 口 88 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

2 .5 .4 P3 口 90 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

2 .5 .5 P4 口 93 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

2 .5 .6 P5 口 95 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

2 .5 .7 P8 口 98 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

2 .5 .8 专用功能引脚 100 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

第 3章 指令系统 103

3 .1 概述 103 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

3 .2 寻址方式 106 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

3 .2 .1 短寻址方式 106 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

3 .2 .2 长寻址方式 107 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

3 .2 .3 扩展寻址方式 108 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

3 .2 .4 间接寻址方式 109 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

3 .2 .5 分支目的地址的寻址 110 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

3 .3 指令系统 111 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

3 .3 .1 数据传送指令 111 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

3 .3 .2 算术运算指令 115 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

3 .3 .3 逻辑操作指令 120 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

亿恒 C164CI 16 位单片机

Page 8: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

3 .3 .4 移位指令 124 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

3 .3 .5 位操作指令 126 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

3 .3 .6 比较指令 129 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

3 .3 .7 转移指令 131 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

3 .3 .8 系统控制指令 137 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

3 .4 汇编语言程序 142 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

3 .4 .1 汇编语言 142 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

3 .4 .2 伪指令 147 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

3 .4 .3 汇编控制命令 148 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

3 .4 .4 编程指南 151 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

3 .4 .5 初始化例程 161 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

第 4章 系统管理 167

4 .1 外部总线 167 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

4 .1 .1 概述 167 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

4 .1 .2 外部总线模式 168 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

4 .1 .3 总线的时序特性 174 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

4 .1 .4 外部总线的控制 178 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

4 .1 .5 EBC 的空闲状态 182 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

4 .1 .6 XBUS接口 183 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

4 .2 系统复位 184 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

4 .2 .1 概述 184 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

4 .2 .2 复位后的状态 186 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

4 .2 .3 初始化设置 189 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

4 .2 .4 系统的启动配置 191 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

4 .2 .5 系统配置的更改 195 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

4 .3 电源管理 197 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

4 .3 .1 概述 197 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

4 .3 .2 省电模式 198 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

4 .3 .3 慢速工作 202 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

4 .3 .4 灵活的接口管理 205 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

4 .3 .5 可编程的频率输出信号 209 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

4 .4 自举装载 211 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

第 5章 定时器及捕获/比较器 217

5 .1 通用定时器单元 217 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

5 .1 .1 定时器模块 GPT1 218 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

目 录

Page 9: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

5 .1 .2 GPT1 的核心定时器 T3 218 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

5 .1 .3 GPT1 的辅助定时器 T2 和 T4 224 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

5 .1 .4 程序举例 230 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

5 .2 监视定时器 231 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

5 .3 实时时钟 235 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

5 .4 捕获/ 比较单元 CAPCOM2 238 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

5 .4 .1 概述 238 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

5 .4 .2 CAPCOM 定时器 T7/ T8 240 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

5 .4 .3 捕获/ 比较寄存器 243 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

5 .4 .4 程序举例 251 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

5 .5 捕获/ 比较单元 CAPCOM6 253 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

5 .5 .1 概述 253 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

5 .5 .2 工作情况 256 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

5 .5 .3 组合多通道模式 260 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

5 .5 .4 工作寄存器 264 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

5 .5 .5 中断结构和陷阱功能 270 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

第 6章 串行 I/ O口 274

6 .1 异步/ 同步串行接口 274 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

6 .1 .1 概述 274 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

6 .1 .2 异步通信工作方式 276 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

6 .1 .3 同步通信工作方式 279 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

6 .1 .4 硬件错误检测能力 280 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

6 .1 .5 ASC0 波特率生成器 281 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

6 .1 .6 ASC0 中断控制 282 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

6 .1 .7 程序举例 284 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

6 .2 高速同步串行接口 286 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

6 .2 .1 概述 286 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

6 .2 .2 工作情况 290 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

6 .2 .3 波特率生成器 294 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

6 .2 .4 错误检测 295 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

6 .2 .5 SSC中断控制 296 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

第 7章 A/ D转换器 298

7 .1 概述 298 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

7 .2 模式选择和操作 299 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

7 .3 转换时序控制 305 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

亿恒 C164CI 16 位单片机

Page 10: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

7 .4 A / D转换中断的控制 306 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

7 .5 程序实例 306 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

第 8章 CAN接口 309

8 .1 概述 309 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

8 .2 工作情况 313 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

8 .3 报文 318 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

8 .4 CAN 模块的控制 324 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

8 .5 CAN 应用接口 327 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

第 9章 C语言程序 329

9 .1 概述 329 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

9 .2 C166 编译器 330 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

9 .2 .1 环境设置 331 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

9 .2 .2 C 编译器命令 331 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

9 .2 .3 错误信息 331 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

9 .2 .4 输出文件 332 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

9 .2 .5 编译控制参数 332 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

9 .3 C 语言的扩展 334 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

9 .3 .1 关键字 334 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

9 .3 .2 存储模型 334 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

9 .3 .3 存储类型 335 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

9 .3 .4 数据类型 339 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

9 .3 .5 中断函数 344 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

9 .3 .6 寄存器屏蔽 346 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

9 .3 .7 实时任务 348 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

9 .4 C 和汇编混合编程 348 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

9 .4 .1 参数传递 348 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

9 .4 .2 函数的返回值 349 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

9 .4 .3 汇编函数中的寄存器使用 350 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

9 .4 .4 数据保存格式 351 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

9 .4 .5 访问绝对地址内存 353 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

9 .5 DES加密算法程序 354 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

9 .6 CVSD语音编解码程序 364 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

9 .7 I2C 总线读写程序 368 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

目 录

Page 11: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

第 10章 SK-164练习器 376

10 .1 概述 376 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

10 .2 快速入门 378 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

10 .2 .1 评估板的启动 378 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

10 .2 .2 评估板的连接 381 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

10 .2 .3 评估板上跳线的设置 385 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

10 .2 .4 存储模块 389 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

10 .2 .5 闪速存储器 392 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

10 .2 .6 CAN接口 392 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

10 .2 .7 发光二极管 LED 393 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

附录 1 C166族单片机指令一览表 394

附录 2 专用寄存器速查表 402

亿恒 C164CI 16 位单片机

Page 12: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

亿恒 16位单片机

1 .1 概 况

产品数字化是新世纪技术进步的一大特点。当前数字化产品正以前所未有的速度进

入国民经济的各个部门和人们的日常生活。作为数字化产品核心部件的 32 位、16 位单

片机 ( MCU)和数字信号处理芯片 (DSP)是 2000 年增长最快的半导体产品。

亿恒科技的半导体产品在世界上占有重要的位置 ,其单片机 (即微控制器 )也是相当

著名的 ,有 8 位、16 位和 32 位各种系列。

亿恒 C500 族 8 位单片机是在 8051 系列单片机的基础上发展起来的 ,兼容 8052 单

片机的性能 ,特别增强了电磁兼容性 ( EMC) ,属于 8 位机的高端产品。

亿恒所有 16 位单片机具有共同的高性能的 CP U 内核 ,构成 C166 族。其 CPU 使用

4 级流水线和面向寄存器操作 ,具有快速的中断响应和上下文切换能力 ,这些特性使其能

适合高速实时的应用。其大容量的片内 RAM (4KB) 和片内 ROM(128KB) , 16MB地址

空间 ,使其能使用高级语言和实时多任务操作系统进行设计。

图 1-1 给出了 C166 族单片机的拓展图。

目前 , 16 位单片机产品已从最初的 8xC166 扩展为三大类 ,能适合各种外设的不同使

用要求。新近推出的通用型 C164CI 单片机 , 减少了引脚数 , 增强了外围功能 ,特别适合

马达驱动控制方面的应用。为了降低成本 ,由 C165 , C163 及新推出的 C161 系列单片机

构成了一类低成本的单片机 ,可用于各种信息家电产品。而集成有更多高性能的周边电

路的 C167 各个系列 ,则构成了亿恒 16 位单片机的高端 ,适用于各种复杂的控制场合 ,满

足特殊的要求 ,如要求片内双 CAN 的结构。

表 1-1 是 C166 族单片机一览表。

图 1-2 给出了 C166 族单片机的应用范围。

32 位单片机使用 Tricore 内核 , 这是一种超标量 RISC 的 CP U ,兼有 DSP 的性能。

它把 MCU , MPU ( RISC) 和 DSP 三者集成为单一的内核 ,采用统一的指令集 ,因而大大

增加了集成度 ,提高了代码效率 ,加快了处理速度 ,从而拓宽了单片机在汽车电子、工业控

制和电信网络方面的应用范围。

Page 13: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

2

图 1-1 亿恒 C166 族单片机的拓展图

汽车电子 引擎 传动控制 ABS 气囊 悬挂

工业控制 机器人 PLC 伺服驱动 马达控制 计算机控制

家用电子 DVD/ CD-ROM TV/ 显示器 VCR/ 视频监视器 机顶盒 游戏机

电信网络 局域网 调制解调器 分组交换机 移动通信

数据设备 硬盘驱动器 磁带机 打印机 扫描仪 复印机 FAX

图 1-2 C166 族单片机的应用范围

亿恒 C164CI 16 位单片机

Page 14: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

3 第 1 章 亿恒 16 位单片机

Page 15: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

4

1 .2 C164CI单片机简介

1 .2 .1 主要性能指标

C164CI 单片机是 C166 族中一种新的价位较低的单片机。它是高性能单片机

C167CR 的简化版。虽然减了一些周边功能 ,但加强了捕获/ 比较单元的功能 ,因此具有

较好的性能价格比。

其主要性能指标如下 :

(1 ) 具有 4 级流水线的高性能的 16 位 CPU。

� 指令周期 80ns( 25MHz的 CPU 时钟 )。

� 16×16 位乘法执行时间 400 ns , 32/ 16 位除法执行时间 800ns。

� 增强的位操作功能。

� 支持高级语言和操作系统的附加指令。

� 具有多个可改变的寄存器组。

� 单个周期的上下文切换。

� 1024B 的专用寄存器区。

� 16MB 总的线性地址空间 ,用于代码和数据的储存。

(2 ) 32 个中断源 16 个优先级的中断系统 ,采样率达到 40 ns。

(3 ) 8 通道经由周边事件控制器 (PEC)用中断驱动的单周期数据传递。

(4 ) 系统时钟可由输入时钟及其分频生成 ,或通过片内锁相环 PLL 生成。

(5 ) 片内的存储器模块。

� 2KB 的片内 RAM (IRAM)。

� 2KB 的片内扩展 RAM (XRAM)。

� 64KB的片内 ROM ( C164CI)或片内 OTP( C164CI-8EM)。

(6 ) 最大为 4MB的外部存储空间 ,存放代码和数据。

� 可编程的用于不同寻址范围的外部总线。

� 复用的或分离的外部地址/ 数据总线 ,数据总线为 8 位或 16 位。

� 4 个可选的片选信号CS0~CS3。

(7 ) 灵活管理功率的空闲、休眠和掉电模式。

(8 ) 片内的周边功能模块。

� 8 通道 10 位 A/ D转换器 ,转换时间 7 .8μs。

� 多功能通用定时器单元 , 3 个 16 位定时器。

� 2 个串行接口 (同步/ 异步通道和高速同步通道 )。

� 8 通道 16 位的通用捕获/ 比较单元 ( CAPCOM2)。

� 产生灵活 PWM 信号的捕获/ 比较单元 ( CAPCOM6)。

(3/ 6 捕获/ 比较通道和 1 个比较通道 )。

亿恒 C164CI 16 位单片机

Page 16: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

5

� 片内的有 15 个报文的完整 CAN 接口 ( V2 .0B) ,全 CAN/ 基本 CAN。

� 片内的实时时钟。

(9 ) 最多有 59 个一般的 I/ O口线。

(10) 可编程的监视定时器和振荡器监视器。

(11) 安装在片内的自举引导程序。

1 .2 .2 引脚定义

C164CI 单片机具有 80 个引脚塑料封装 P-MQF P,适于表面贴装 (见图 1-3 ) ,其逻辑

符号如图 1-4 所示。表 1-2 给出了各个引脚的功能。

图 1-3 P-MQFP 的引脚结构(顶视图)

第 1 章 亿恒 16 位单片机

Page 17: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

6

图 1-4 逻辑符号图

表 1-2 引脚功能表

引脚名 引脚号 I/ O 类型 功 能

P5 .0~ P5 .776~79 ,

2~5I

P5 口是 8 位输入口 ,具有施密特触发器特性。P5 口的引脚

也用作 A/ D转换器的模拟输入端 , P5 .x 相当于 ANx (模拟输入通道 x)

下列 P5 口的引脚也用作定时器的输入端 :

P5 .4 T2EUD GP T1 定时器 T2 外接加/ 减计数控制输入端

P5 .5 T4EUD GP T1 定时器 T4 外接加/ 减计数控制输入端 P5 .6 T2IN GPT1 定时器 T2 计数/ 门控/ 重装载/ 捕获输

入端

P5 .7 T4IN GPT1 定时器 T4 计数/ 门控/ 重装载/ 捕获输

入端

P3 .4

P3 .6

P3 .8~P3 .13

P3 .15

8

9

10~15

16

8

9

10

11

12

13

14

15

16

I/ O

I/ O

I/ O

I/ O

I

I

I/ O

I/ O

O

I/ O

O

O

I/ O

O

O

P3 口是 9 位双向输入/ 输出口 ,可以通过传送方向位按位编

程为输入或输出。对构成输入端的引脚 ,其输出驱动器处在

高阻状态。P3 口的输出可设置为推挽输出或漏极开路输出

P3 口的输入门限可选 ( T TL 或特殊的 )

P3 口的各个引脚也可用于替换功能 :

P3 .4 T3EUD GP T1 定时器 T3 外接加/ 减计数控制输入端

P3 .6 T3IN GP T1 定时器 T3计数/ 门控输入端

P3 .8 MRST SSC 主接收/ 从发送的输入/ 输出端

P3 .9 M TSR SSC 主发送/ 从接收的输出/ 输入端

P3 .10 TxD0 ASC0时钟/ 数据输出端 (异步/ 同步)

P3 .11 RxD0 ASC0数据输入端 (异步 )或 I/ O 口 (同步 )

P3 .12 BH E外部存储器高位字节使能信号

WRH外部存储器高位字节写选通信号

P3 .13 SCLK SSC 主时钟输出端/ 从时钟输入端

P3 .15 CLOCK 系统时钟输出 ( CPU 时钟)

FOU T 可编程频率输出

亿恒 C164CI 16 位单片机

Page 18: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

7

续表

引脚名 引脚号 I/ O 类型 功 能

P4 .0~P4 .3

P4 .5~P4 .6

17~19

22

23~24

17

22

23

24

I/ O

I/ O

O

O

O

O

O

I

O

O

P4 口是 6 位双向输入/ 输出口 ,可以通过传送方向位按位编

程为输入或输出。对构成输入端的引脚 ,其输出驱动器处在

高阻状态。P4 口的输出可设置为推挽输出或漏极开路输出

P4 口的输入门限可选 ( T TL 或特殊的 )

P4 口各个引脚的替换功能为 :

P4 .0 A16 段地址线最低位

CS3片选 3 输出端

P4 .3 A19 段地址线

CS0片选 0 输出端

P4 .5 A20 段地址线

CAN1_RxD CAN1接收数据输入端

P4 .6 A21 段地址线最高位

CAN1_TxD CAN1发送数据输出端

RD 25 O 外部存储器读选通信号。RD对每次外部取指或数据读有效

WR/ WRL 26 O

外部存储器写选通信号。在WR模式下 ,该引脚对每个外部

数据写有效 ;在WRL模式下 ,该引脚对 16 位总线的低字节数

据写有效 ,对 8 位总线的每个字节数据写有效。参见寄存器

SYSCON 中用于模式选择的 WRCFG 位

ALE 27 O 地址锁存使能输出端。可用来锁存加到外部存储器的地址

或复用总线模式时地址的锁存

Vpp E A 28 I

外部存储器访问使能端。该引脚为低电平时 ,复位后使

C164CI 从外部存储器开始执行指令 ;为高电平时 ,则从内部

ROM 取指执行

注 :对 C164CI 的 OTP 版本 ,该引脚也用于加编程电压 Vpp

P0 口 :

P0L .0~

P0L .7

P0 H .0~

P0 H .7

29~36

37~39 ,

42~46

I/ O

P0 口含有两个 8 位双向输入/ 输出口 , P0L 和 P0 H。可以通

过传送方向位按位编程为输入或输出。对构成输入端的引

脚 ,其输出驱动器处在高阻状态

使用外部总线时 , P0口用作地址总线和数据总线

分离的多总线模式 :

数据位数 8 位 16 位

P0L .0~P0L .7 D0~D7 D0~D7

P0 H .0~P0 H .7 I/ O D8~D15

复用总线模式 :

数据位数 8 位 16 位

P0L .0~P0L .7 AD0~AD7 AD0~AD7

P0 H .0~P0 H .7 A8~A15 AD8~AD15

第 1 章 亿恒 16 位单片机

Page 19: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

8

续表

引脚名 引脚号 I/ O 类型 功 能

P1 口 :

P1L .0~

P1L .7

P1 H .0~

P1 H .7

47~52

57~58

59 ,

62~68

47

48

49

50

51

52

57

58

59

62

63

64

65

68

I/ O

I/ O

O

I/ O

O

I/ O

O

O

I

I

I

I

I

I/ O

I/ O

P1 口含有两个 8 位双向输入/ 输出口 , P1L 和 P1 H。可以通

过传送方向位按位编程为输入或输出。对构成输入端的引

脚 ,其输出驱动器处在高阻状态。在分离的多总线模式中 ,用

作 16位地址总线

P1 口的各个引脚也可用于替换功能 :

P1L .0 CC60 CAPCOM6 通道 0 的输入/ 输出端

P1L .1 COUT60 CAPCOM6 通道 0 的输出端

P1L .2 CC61 CAPCOM6 通道 1 的输入/ 输出端

P1L .3 COUT61 CAPCOM6 通道 1 的输出端

P1L .4 CC62 CAPCOM6 通道 2 的输入/ 输出端

P1L .5 COUT62 CAPCOM6 通道 2 的输出端

P1L .6 COUT63 CAPCOM6 10位比较通道的输入端

P1L .7 CTRAP CAPCOM6 异常处理的输入端

CTRAP是有内部上拉电阻的输入脚。该引脚为低电平时 ,

CAPCOM6 单元的比较输出切换到由软件规定的逻辑电平

P1 H .0 CC6POS0 CAPCOM6 位置 0 的输入端

EX0IN 快速外部中断 0 输入端

P1 H .1 CC6POS1 CAPCOM6 位置 1 的输入端

EX1IN 快速外部中断 1 输入端

P1 H .2 CC6POS2 CAPCOM6 位置 2 的输入端

EX2IN 快速外部中断 2 输入端

P1 H .3 EX3IN 快速外部中断 3 输入端

T7IN CAPCOM2 定时器 T7 的计数输入端

P1 H .4 CC24IO CAPCOM2 CC24 捕获输入/ 比较输出端

P1 H .7 CC27IO CAPCOM2 CC27 捕获输入/ 比较输出端

XTAL1

XTAL2

55

54

I

O

XTAL1:振荡器的放大器输入端和内部时钟生成器输入端

XTAL2:振荡器的放大电路的输出端

使用外部振荡器时 ,从 XTAL1 输入 , XT AL2 悬空。振荡输

入的高/ 低电平持续时间和上升/ 下降时间必须符合交流特性

的规定

RSTIN 69 I/ O

复位输入 ,具有施密特触发器特性。振荡器工作时 ,使该引

脚持续一段时间低电平 ,即可使 C164CI 复位。内部有一个上

拉电阻 ,只要接一个电容到 V ss 端 ,即可实现上电复位

在双向复位模式下 (用对寄存器 SYSCON 的位 BDRSTEN

置“1”使能 ) ,RSTIN口线在软件复位和 WDT 复位产生的内部

复位序列期间被拉到低 ①

RSTOU T 70 O

内部复位指示输出。无论是硬件复位、软件复位或是 WDT

复位 ,该引脚被置为低。RSTOUT一直保持为低 ,直到执行了

EINIT指令为止 (初始化结束 )

亿恒 C164CI 16 位单片机

Page 20: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

9

续表

引脚名 引脚号 I/ O 类型 功 能

NMI 71 I

不可屏蔽中断输入端。在该引脚上一个高到低的跳变使

CPU 进入NMI异常处理程序。当 PWRDN (掉电 )指令执行

时 , NMI引脚必须为低 ,以强制 CPU 进入掉电模式。如果NMI

引脚为高 ,则在执行 PWRDN 指令时 ,这部分将继续以正常模

式工作

不使用该引脚时 ,应使用外部电路将其置为高

P8 .0~P8 .3

72~ 75

72

73

74

75

I/ O

I/ O

I

I/ O

O

I/ O

I

I/ O

O

P8 口是 4 位双向输入/ 输出口。可以通过传送方向位按位

编程为输入或输出。对构成输入端的引脚 ,其输出驱动器

处在高阻状态。P8 口的输出可设置为推挽输出或漏极开路

输出

P8 口的输入门限可选 ( T TL 或特殊的 )

P8 口的各个引脚也可用于替换功能 ① :

P8 .0 CC16IO CAPCOM2 CC16捕获输入/ 比较输出

CAN1_RxD CAN1 接收数据输入端

P8 .1 CC17IO CAPCOM2 CC17捕获输入/ 比较输出

CAN1_TxD CAN1 发送数据输入端

P8 .2 CC18IO CAPCOM2 CC18捕获输入/ 比较输出

CAN1_RxD CAN1 接收数据输入端

P8 .3 CC19IO CAPCOM2 CC19捕获输入/ 比较输出

CAN1_TxD CAN1 发送数据输入端

VA REF 1 - A/ D转换器的参考电压

VAGND 80 - A/ D转换器的参考地

VDD

7 ,21 ,40

53 ,61

-

数字部分的电源电压 :

+ 5V (正常工作和空闲模式时 ) ;≥2 .5 V(掉电模式时)

VSS

6 , 20 ,41 ,

56 ,60

-

数字地

① CA N 接口线是分配到 P4 口和 P8 口 ,由软件控制。几种分配方法可以在 CA N 模块中选择。

1 .2 .3 组成方框图

C16 4CI单片机集成有一个强有力的 CP U 和一组周边功能电路 , CP U 和周边电

路用一组先进的宽带内部总线有效地连接在一起。XBUS 是 C16 4CI 中使用的 4 种

总线中的一种 ,是外部总线接口在内部的体现。它为从标准的 C1 64CI 增加一些专

用周边功能得出各种衍生产品提供了一种标准化的方法。图 1-5 为 C1 64CI的组成

方框图。

第 1 章 亿恒 16 位单片机

Page 21: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

10

图 1-5 C164CI组成方框图

1 .3 C164CI单片机特点

C164CI 单片机的体系结构综合了 RISC 和 CISC 计算机两种结构的优点 ,并作了最

佳的折衷。C164CI 有 ROM 型 ( C164CI)和 OTP 型 ( C164CI-8EM)两种。C164CI不仅为

用户的当前应用提供了一种良好选择 ,也能适合未来更复杂的工程要求。

本节概要介绍 C164CI 单片机各部分的功能特点。

1 .3 .1 优化的 CPU核

CP U核的主要组成部分是指令的 4 级流水线机构 , 16 位算术逻辑运算单元 ALU 和

专用寄存器 SFR。还附加有一个单独的硬件乘除单元 ,位屏蔽发生器和一个桶形移位寄

存器 (见图 1-6)。

对 CPU 核已作了很多优化改进 ,使其性能更高 ,工作更灵活。CP U 功能的改进反映

在下列几个方面 :

(1 ) 高速的指令传送和执行 ;

(2 ) 功能强大的 8 位和 16 位算术逻辑单元 ;

(3 ) 扩展的位处理和周边电路控制 ;

(4 ) 高性能的分支、调用和循环处理 ;

(5 ) 优化的统一的指令格式 ;

(6 ) 可编程的多级中断系统。

1 .高速的指令传送和执行

用硬件来保证大多数 C164CI 指令的执行只需要一个机器周期 ,即两个 CPU 时钟周

期。例如 ,移位和循环移位指令总是在一个机器周期内完成 ,而与所移的位数无关。

亿恒 C164CI 16 位单片机

Page 22: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

11

图 1-6 CPU 的基本组成

一般说来 ,分支和乘除指令所需要的时间会多于一个机器周期 ,但对这些指令也作了

优化。例如 ,分支指令在进行分支转移时只需增加一个机器周期 ,而对大多数以循环方式

工作的分支 ,由于使用了“跳转高速缓存器”( Jump cache) ,就不需要再增加机器周期了。

乘法和除法指令所需的执行时间最长。32 位除以 16 位的除法需要 20 个 CPU 时钟

周期 ,但 16 位和 16 位乘法只要用 10 个 CPU 时钟周期。

由于指令采用流水线操作 ,允许 CP U 核以并行方式处理多个顺序指令的不同部分 ,

从而使指令的平均执行时间大大减小 ,性能大为提高。作了最佳折衷后 , CP U 使用 4 步

流水线操作 :

(1 ) 取指 ,根据当前 IP 值 ,从内部 ROM、内部 RAM或外部存储器取指令 ;

(2 ) 译码 ,对前面取出的指令进行译码 ,同时取出所要的操作数 ;

(3 ) 执行 ,对前面取出的操作数执行指令规定的操作 ;

(4 ) 写回 ,把执行结果写入指定的位置。

指令译码主要用把操作码加到可编程逻辑阵列 ( PLA) 来实现 ,不使用微码。流水线

操作的每一步接受来自 PLA 译码后存放在控制寄存器中的分步控制信号。流水线操作

的停顿主要是由于对外部存储器存取时的等待状态引起 ,它还使控制寄存器中的信号延

迟输出。多周期指令是通过指令注入和简单的内部有限状态机实现的。

2 . 8位和 16位算术逻辑单元

在 16 位算术逻辑单元 ( ALU)中执行全部标准的算术逻辑操作。另外 , 对字节的操

作 ,根据 ALU 的位 6 和位 7 运算给出的信号 ,设置条件标志。对高精度算法 ,提供有进

位信号 ( CARRY-IN)。对大多数内部执行模块进行了优化 ,以适合 8 位和 16 位数的两

第 1 章 亿恒 16 位单片机

Page 23: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

12

种计算。一旦流水线被填满 ,每个机器周期就会完成一个指令 ,但乘法和除法指令除外。

对乘法和除法配备了一个先进的 Booth 算法 ,允许每个机器周期做 4 位的乘和 2 位

的除。对两个连在一起的 16 位寄存器 MDL 和 MDH 进行这种操作。16 位与 16 位的乘

法和 32 位除以 16 位的除法分别需要 4 个和 9 个机器周期 ,再加一个周期进行操作数和

计算结果的设置和修改。

即使在执行那些较长的乘法和除法指令时 , 也可产生中断 ,以得到非常快的中断响

应。还有对存储器中字节进行符号位扩展的指令 ,这是在对字节进行字操作时需使用的。

内部总线的结构允许与周边电路进行字和字节的传送 ,视周边电路的功能要求而定。

在算术、逻辑、移位或传送操作后 ,寄存器 PSW 中的一组标志会自动按结果作出相

应的修改。这些标志用于实现条件分支 ,也可用于有符号或无符号的算术运算。这些标

志在 CPU 进入中断或异常处理程序时可以自动进行保存。所有分支的目的地址也是在

中央 ALU 中计算得到的。

有一个 16 位桶形移位寄存器用来实现单个周期的多位移位。也可用来实现循环移

位和算术移位。

3 .扩展的位处理和周边电路控制

对位处理专门提供了许多指令 ,这些指令可用来对周边电路进行有效的控制和测试 ,

增强数据操作功能。这些指令能直接对两个可位寻址的位进行操作 ,不像其他的单片机

那样 ,需先把其中的一个位送到暂存的标志位中。

对字节和字的逻辑操作使用同样的指令。用户可以用一个指令对周边电路的控制位

进行比较和修改。多位移位指令可以避免只移一位指令所引起的长指令串 ,并在一个机

器周期中完成移位操作。

4 .高性能的分支、调用和循环处理

在控制应用中 ,分支处理占有很高的比例 ,因此对分支处理进行了优化 ,结果是作分

支时只需增加一个附加的周期。这是通过在指令译码时预先计算目的地址实现的。为了

减少循环处理耗费的时间 ,采用了三种改进措施 :

(1 ) 在第一重循环后 ,再执行循环工作时只需要单个周期。这样 ,在进入循环后直到

退出循环 ,整个循环只损失一个周期。执行循环不需要使用专门的指令 ,在执行分支指令

时会自动检测是否为循环。

(2 ) 允许对表格末端作检测 ,这样可避免在循环中使用两个比较指令。其方法是在

指定表格的末端放一个最负的数 ,如果未找到此值或被比较值 ,就作循环分支。只要满足

任何一个条件就终止循环 ,然后再去测试是哪个条件引起的终止。

(3 ) 提供有比较加 1 或比较减 1 指令 ,使用户可以与任何值进行比较。这比其他单

片机使用的减 1 为 0 跳指令更为灵活。这使循环的计数值可取为整个工作范围内的任何

一个值。这对进行表格搜索是特别有用的。

系统的状态会自动地保存在内部系统堆栈中 ,在进入或退出中断及异常处理程序时

不需使用指令来保护状态。调用指令会把 IP 值自动压入系统堆栈 ,只需要和分支指令一

亿恒 C164CI 16 位单片机

Page 24: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

13

样的执行时间。

此外 ,还有支持间接分支和间接调用的指令 ,它可用来实现宏汇编和高级语言中有多

个分支的 CASE 语句。

5 .优化的统一的指令格式

为了得到流水线设计的最佳性能 ,一个指令集的设计应包含有精简指令集的概念。

应用这些概念可对指令进行快速译码 ,减少使用会导致流水线停顿的操作数。但这些概

念又不应妨碍单片机用户使用复杂指令。下面是设计指令集时要达到的目标 :

(1 ) 提供强有力的指令来实现通常功能的操作 ,它们是经常使用的指令。可以绕过

对暂时寄存器的操作 ,如对累加器和进位标志等的送数或取数能以并行方式执行任务。

(2 ) 对各种指令把操作数放在相同的位置 ,以避开复杂的编码设计。还要尽量少用

那些不常用的寻址方式。这样不仅可以减少指令的译码时间 ,还可以简化汇编器和编译

器的开发工作。

(3 ) 对最常使用的指令使用单字的指令格式 ,所有其他指令使用两个字的指令格式。

使所有的指令都以字为单位 ,从而简化了硬件结构。这样做还具有增加分支指令相对转

移范围的优点。

CP U硬件所提供的高性能是通过使用功能强大的 C164CI 指令集进行编程实现的。

此指令集包含有下列各种指令 :

� 数据传送指令。

� 算术运算指令。

� 逻辑操作指令。

� 移位和循环移位指令。

� 位操作指令。

� 比较和循环控制指令。

� 跳转、调用和返回指令。

� 系统控制指令。

� 杂类指令。

可用的操作数类型是位、字节和字。字节到字的扩展得到专门的指令支持。

有多种直接寻址、间接寻址和立即寻址方式来指定所要的操作数。

6 .可编程的多优先级中断系统

在处理大量的中断源时 ,采用了下列改进措施 :

(1 ) 周边事件控制器 ( PEC)。这个控制器能用来帮助 CP U 处理很多中断请求 ,它避

免了因进入或退出中断程序和异常处理程序时所消耗的时间。它使用单个周期的中断驱

动操作实现段 0 内任何两个单元间数据字节或字的传送 ,并可选取 PEC源指针或目的指

针中的一个作加 1 操作。

这个功能和 DMA 相似 ,从当前 CP U 工作中只“窃取”一个周期去作 PEC 服务。

(2 ) 多优先级的中断控制器。这个控制器允许把所有的中断指定到任意一个优先

第 1 章 亿恒 16 位单片机

Page 25: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

14

级。中断也可以编成组 ,使用户能防止同一优先级任务间的相互中断。对每个可用的中

断源 ,各有一个独立的控制寄存器 ,它包含一个中断请求标志 ,一个中断允许标志和表示

中断优先级的位域。当一个中断被 CPU 接受时 , 只有高优先级的中断才能将它打断。

对于标准的中断处理 ,每个可能的中断源配有一个存放其向量地址的单元。

(3 ) 多个寄存器组。这一特性允许用户在内部 RAM 的任一位置指定最多由 16 个

通用寄存器构成一个寄存器组。变更任务时 ,若需要在不同的寄存器组之间切换 ,只要执

行一个机器周期的指令即可实现。

(4 ) 允许中断的多周期指令。允许对多周期的乘法和除法指令进行中断 ,从而使中

断的延迟减少。

中断响应时间为 5~10 个 CPU 时钟周期 (在执行内部程序时 ) ,所以 C164CI 可对不

确定事件快速作出反应。每个 CPU 时钟周期均对快速变化的外部中断信号进行采样 ,

从而能识别非常短的外部脉冲信号。

C164CI 还具有在程序运行出现意外和错误时进行识别和处理的机制 ,称为“硬件陷

阱”。硬件陷阱引起一个立即的不可屏蔽的系统响应 ,它类似于一个标准的中断服务 (分

支到一个专用向量表指定的单元 )。各种硬件陷阱分别用陷阱标志寄存器 ( TFR )中的一

个位表示。除非有一个优先级更高的陷阱中断服务正在进行 ,硬件陷阱将中断当前正在

执行的程序。硬件陷阱服务程序不能被标准的或 PEC 中断打断。

软件中断用“ TRA P”指令实现 ,“T RAP”指令带有各自的陷阱中断号。

1 .3 .2 功能增强的系统资源

C164CI 单片机在 CPU 核周围设计配备了许多强有力的系统资源。CPU 和这些资

源组合使 C166 族的各个成员具有高的性能。

1 .周边事件控制器 ( PEC)和中断控制机构

周边事件控制器用于对中断请求作出响应。进行单个字或字节数据的传送 ,只需用

一个指令周期 ,不必对机器的状态进行存储和恢复。各种中断源的优先级由中断控制器

在任一机器周期进行设置。如果选择了 PEC 服务 ,就开始 PEC 规定的传送。如果要求

进行 CPU 中断服务 ,就会对存在寄存器 PSW 中当前 CP U 的优先级进行测试 ,判断是否

有优先级高的中断正在服务。如果提出申请的中断优先级更高 ,中断就得到响应 ,机器的

当前状态就保存到内部系统堆栈中 , CPU 分支转移到由周边功能所指定的向量地址继

续运行。

PEC包含一组专用寄存器 ,它们存储 8 个数据传送通道的计数值和控制位。此外 ,

PEC有一个专用的 RAM区 ,用来存放源地址和目的地址。对 PEC 的控制和对其他周边

电路的控制相似 ,通过 SFR 进行 ,这些 SFR 包含有各个通道所需的配置。

有一个单独的 PEC 传送计数器 ,在每次 PEC 服务后自动减 1 ,连续传送模式除外。

当计数值为 0 时 ,不进行 PEC规定的数据传送 ,而是产生一个标准的中断。PEC 服务非

常适合用于把寄存器内容送到一个存储器表格中 ,或反过来操作。C164CI 有 8 个 PEC

亿恒 C164CI 16 位单片机

Page 26: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

15

通道 ,均能提供这种快速的由中断驱动的数据传送。

2 .存储器区

C164CI 的存储空间采用冯·涅曼体系结构 ,这意味着代码存储器、数据存储器、寄存

器和 I/ O口统一编址 ,组成一个 16MB的线性存储空间。整个空间可以按字节或按字进

行访问。片内存储器的特定区域可使用直接位寻址方式。

16 位宽的 2KB内部 RAM 可用于通用寄存器 ( GPR )、用户数据区 (变量 )和系统堆

栈 ,可以对它们进行高速访问。内部 RAM 也可用于存放指令代码。

对剩下的用户数据 RAM 也进行了优化 ,采用一个独特的译码方案 ,可在内部 RAM

区中灵活地设置用户寄存器组。

CP U在内部 RAM 区的某个具体位置划出一个最多为 16 个字或字节大小的通用寄

存器组。由一个上下文指针寄存器 ( CP)规定 CP U 在当前时刻访问的激活寄存器组的基

地址。寄存器组的个数只受到可用的内部 RAM 空间限制。为了便于参数的传送 ,一个

寄存器组可与另一个寄存器组交叠。

有一个 1024 个字的堆栈用来暂时保存数据 , 系统堆栈也放在内部 RAM 区 , 它是

CP U通过堆栈指针寄存器 ( SP ) 进行存取的。两个独立的专用寄存器 ( STKOV 和

ST KUN)用来在每次访问堆栈时对堆栈指针作隐含的比较 ,检测堆栈的上溢和下溢。

在内部存储器的译码器中有对所选存储空间的硬件检测 ,允许用户直接或间接指定

任何地址 ,无需使用暂存器或专门的指令即可获得所要的数据。

有一个 16 位宽的 2KB 片上 XRAM , 可用于快速访问用户数据 (变量 )、用户堆栈和

代码。片上 XRAM 是按 XBUS周边电路实现的 ,软件按外部 RAM 考虑 ,因此它不能存

放寄存器组 ,也不能按位寻址访问。对 XRAM 的 16 位访问有最高的速度。

为专用寄存器保留有 1024 个字节的存储空间 ,标准的专用寄存器区 ( SFR )为 512 个

字节 ,扩展的专用寄存器区 ( ESFR )使用另外的 512 个字节。ESFR 是以字为处理单位的

寄存器 ,它用于对片内各个不同功能单元的控制和监测。未使用的 ESFR 单元保留给将

来增强功能后的其他成员使用。

代码和常数表格的存储有内部 ROM 或 OTP存储器两种选择。存储区通过 32 位总

线与 CPU 相连 ,因此 ,整个双字指令可以在一个机器周期中提取。ROM 是在工厂中掩

模的 ,而 OTP 可以在应用时进行编程。

使用片内程序存储器是所有可用方式中程序执行最快的一种。

3 .外部总线接口

当需要使用比片内存储器更多的存储器时 , 可通过外部总线接口进行扩展 ,最多为

4MB 的 RAM/ ROM。集成的外部总线控制器 ( EBC)允许以一种非常灵活的方法访问外

部存储器和周边电路。对 5 种地址区域、总线模式 (复用总线、分离的多总线 )、数据总线

宽度 (8 位或 16 位 )、总线周期长短 (等待周期 ,信号的延迟 )都可独立选择 ,这样就允许直

接对多种类型存储器和周边电路进行最有效的访问。如果单片机不是运行在单片模式 ,

EBC可以使用下列外部访问模式中的一种对外部存储器进行访问 :

第 1 章 亿恒 16 位单片机

Page 27: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

16

� 16/ 18/ 20/ 22 位地址 , 16 位数据 ,分离的多总线模式。

� 16/ 18/ 20/ 22 位地址 , 8 位数据 ,分离的多总线模式。

� 16/ 18/ 20/ 22 位地址 , 16 位数据 ,复用总线模式。

� 16/ 18/ 20/ 22 位地址 , 8 位数据 ,复用总线模式。

对分离的多总线模式 , P1 口用于地址 , P0 口用于数据的输入/ 输出。而对复用总线

模式 , P0 口既用于地址 ,也用于数据的输入/ 输出 , P4 口用作高位地址线 ( A16⋯ ,如果选

择的话 )和片选线 ( CS0⋯ ,如果选择的话 )。

外部地址总线接口的时序 (如等待周期、ALE持续时间和读/ 写的延迟 )是可编程的 ,

允许用户在很宽的范围内按照存储器的类型和外设的性能进行调整。

对于小于 64KB 的应用 ,可选用不分段的存储模型 ,所有单元均用 16 位地址确定。

和使用分段存储器时情况不同 ,此时不需要从 P4 口输出高位地址 ( Axx⋯A16)。

片内 XBU S是外部总线的内部体现 ,它允许使用和访问外部单元一样的方式对集成

在片内的专用周边电路和模块进行访问。片内 CAN 模块就是这类周边电路的一个

例子。

1 .3 .3 片内的周边电路

C166 族单片机把片内周边电路与 CPU 核明显地分开。这种结构使大量操作可以并

行执行 ,并且在对族的成员增加或删除一些周边电路时无需对核进行修改。每个周边功

能块独立地对数据进行处理 ,并通过公共总线交换信息。周边电路是通过对专用寄存器写

入相应的数据进行控制的。这些专用寄存器既可位于标准专用寄存器区内 ( 00FE00H~

00FFFF H) ,也可位于扩展专用寄存器区 ESFR 中 (00F000H~ 00F1FF H )。这些内置的

周边电路 ,或是用作 CP U 与外部设备的接口 ,或是提供在片的功能 , 这些功能在其他类

似的单片机中是需外加的。

C164CI 片内的周边电路一般有 :

� 6 个 I/ O 口 ,总计有 59 个引脚。

� 两个串行接口 (异步/ 同步串行口 ASC0 和高速同步串行口 SSC)。

� CAN模块。

� 通用定时器单元 ( GPT1 )。

� 监视定时器。

� 两个捕获/ 比较单元 ( CAPCOM2 和 CAPCOM6)。

� 10 位模数转换器。

� 实时时钟 ( R TC )。

每个周边电路包含有一组专用寄存器 ,它们控制周边电路的功能 ,暂存中间结果的数

据。每个周边电路伴有一组状态标志 , 其时钟信号可独立选择 , 取自 CPU 时钟的 2n

分频。

片内周边电路一般有两种接口 ,一个是与 CP U 的接口 , 另一个是与外部设备的接

口。CPU 和周边电路间通讯是通过专用寄存器 SFR 和中断实现的。SFR 起周边电路的

亿恒 C164CI 16 位单片机

Page 28: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

17

控制/ 状态寄存器和数据寄存器的作用。中断请求是在发生特定事件时由周边电路产生

的。这些事件是周边电路工作时发生的 ,诸如操作完成 ,出错等等。

与外部设备连接时 ,选用并行口的特定引脚作为周边电路的输入或输出。这时 ,端口

的引脚在作输出用时 ,由周边电路进行控制 ;在作输入用时 ,由与周边电路连接的外部设

备进行控制。这些功能称为端口引脚的“替换功能”, 与一般用途时 I/ O 引脚的功能

不同。

CP U和周边电路内部的动作节拍以 CP U 时钟 ( fCP U )为基准。CP U 时钟信号由石英

晶体产生的片内振荡信号或外部时钟信号生成。加到周边电路的时钟信号和送到 CP U

的时钟信号是相互独立的。在空闲模式中 , CP U 的时钟停止 ,而周边电路仍继续工作。

与周边电路有关的 SFR 每个状态周期由 CP U 访问一次。当用软件去写 SFR 时 ,若 SFR

同时处在可由周边电路修改的状态 ,则软件的写操作优先。关于周边电路更详细的时间

关系参见各周边电路有关章节。

1 .并行口

C164CI 提供 59 根口线 ,它们组成 5 个输入/ 输出口 ( P0 , P1 , P3 , P4 , P8 )和一个输入

口 ( P5)。所有口线都是可按位寻址的 ,输入/ 输出也是按位独立编程的 ,通过传送方向寄

存器设成输入或输出。I/ O 口是真正的双向口 , 当配置成输入时 ,该口切换到高阻抗状

态。其中两个 I/ O口的输出驱动可以按引脚设置成推挽输出或漏极开路输出方式。在

内部复位时 ,所有 I/ O 口设置成输入。

所有端口的引脚都可编程为输入或输出 , P0 口在访问外部存储器时用作地址线或数

据线 ;而 P4 口输出附加的段地址 A21/ A19/ A17~A16 ,以及片选信号CS3~CS0 ,在访

问大于 64KB的存储器时 ,用它们给出区段信息 ; P1 口为 CA PCOM 单元提供输入和输出

信号 ; P3 口可用于定时器和串行口 ,或用作总线控制信号BH E和系统时钟输出 ( CLK-

OU T ) ; P5 口用作定时器控制信号和 A/ D 转换器的模拟输入 ; P8 口为 CAPCOM2 单元

提供输入和输出。所有口线在不作替换功能使用时 ,可以作一般的 I/ O 口使用。

2 .串行口

C164CI 与其他单片机、微处理器、终端或外部周边电路的串行通信有两种接口 , 异

步/ 同步串行口 ( ASC0)和高速同步串行口 (SSC)。

ASC0 是与西门子 8 位单片机向上兼容的串行口 ,它支持全双工的异步通信 ,最高波

特率为 625 千波特 ,并支持半双工的同步通信 ,在 CP U 时钟为 20M Hz 时 ,波特率为 2.5

兆波特。

一个专用的波特率发生器可以设置全部标准的波特率 ,无需相应地改变振荡器的频

率。对发送、接收和出错提供了 4 个独立的中断向量。在异步模式中 ,每帧收发数据可以

为 8 位或 9 位 ,前面有一个起始位 ,后面接一个或两个停止位。用于多机通信时 ,在数据

字节中包含一个辨别地址的机构 (8 位数据加唤醒位模式 )。

在同步模式中 , ASC0 随移位时钟同步地发送和接收字节。ASC0 总是从最低位开始

发送。为了进行测试 ,可以选择循环发送。

第 1 章 亿恒 16 位单片机

Page 29: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

18

有多种可选的硬件错误检测方式 ,以增加数据传送的可靠性。在发送数据时可自动

产生一个奇偶校验位。在接收数据时自动进行校验检查。帧错误检测用来检查帧数据中

有否丢失停止位。还可产生一个溢出错误 ,它表示一个新的字节接收完成时 ,上一个字节

数据尚未被读出。

SSC 支持全双工的同步通信 ,对 20MHz的 CP U 时钟 ,波特率为 5 兆波特。可以构

成与带串行接口外设的通信接口。一个专用的波特率发生器可给出所有标准的波特率。

对发送、接收和出错维护提供 3 个独立的中断向量。

SSC 发送和接收的字符长度为 2~16 位 ,发送和接收与由 SSC 产生的移位时钟同步

工作。当工作在从模式时 ,则与外部时钟同步。SSC移位可以从最低位 ( LSB)开始 ,也可

从最高位 ( MSB) 开始。允许选取时钟的极性 ,即时钟移位和锁存的边沿。具有多种可选

的硬件错误检测方式 ,增加了数据传送的可靠性。发送和接收错误用来监视数据缓冲器

的工作 ,相位和波特率错误用来检测不正确的串行数据。

3 .片内 CAN模块

集成在片上的 CAN 模块自动对 CAN 帧的发送和接收进行全自动的管理 , 符合

CAN V2 .0 B 规定的要求 ,即工作在全 CAN 模式。CAN 模块能发送和接收具有 11 位标

识符的标准帧或扩展到 29 位标识符的扩展帧。

此模块能提供最多 15 个消息体的全 CAN 功能。消息体 15 可以配置为基本 CAN

功能。两种模式都提供独立的屏蔽进行接收滤波 ,允许对全 CAN 模式中若干标识符进

行接收 ,也允许对基本 CAN 模式中若干标识符不作接收。所有消息体可以独立地由其

他消息体更改 ,最大消息长度为 8 个字节。

位的时序由 XCLX驱动产生 ,数据率可以通过编程改变 ,最大为 1 兆波特。CAN 模

块通过 2 个引脚连接到总线收发器。

4 .通用定时器单元 (GPT)

GPT1 是一个非常灵活的多功能定时器/ 计数器单元 ,它可以用于各种与时间有关的

任务 ,诸如定时、计数、脉冲宽度和占空比的测量、脉冲生成和脉冲信号相乘等。

每个定时器可以独立地按各自的模式工作 ,也可以与另一个以相同模式工作的定时

器串接起来工作。

每个定时器可以独立地选择 4 种工作模式中的一个工作。这 4 种模式是定时方式、

门控定时器方式、计数方式和增量接口方式。

在定时方式中 ,定时器的输入时钟为内部 CP U 时钟通过一个可编程预分频器后的

输出脉冲。而在计数方式中 ,定时器的计数时钟与外部事件有关 ,通过 TxIN 引脚输入。

在门控定时器方式中 ,支持脉冲宽度和占空比的测量 ,这时定时器的工作由外部输入

引脚 TxIN 的电平控制。

在增量接口方式中 ,定时器 3 可分别通过输入引脚 T3IN 和 T3EUD 接到增量式状

态传感器信号 A 和 B,加减方向和计数信号由这两个输入信号内部驱动 ,所以定时器 3 的

内容与传感器的状态有关。第 3 个状态传感器的信号 TOP0 可以连接到中断输入端。

亿恒 C164CI 16 位单片机

Page 30: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

19

每个定时器的加/ 减计数可由软件编程 ,亦可以由外部信号 ( T xEUD)动态改换 ,以便

对状态进行跟踪。

定时器 3 核内有一个输出双稳态 ( T3OTL) ,每次定时器溢出时改变其状态。这个锁

存器的状态可以在内部串接到一个辅助定时器 ,从而得到一个 32/ 33 位的定时/ 计数器 ,

能以高分辨率进行长时间周期的测量。

重加载和捕获功能可以选择 ,或对定时器重加载 ,或用外加信号来捕获一个定时器的

内容 ,也可选取双稳态 T3OTL 的跳变沿来捕获定时器的内容。

在 GPT1 定时器模块中 ,最高的分辨率是 8 个 CP U 时钟周期。

5 .监视定时器 (watchdog)

监视定时器是失效保护机构之一 ,用于对控制器出现长时间工作不正常时进行保护。

监视定时器在芯片复位后总是处在使能状态 ,只能在执行 EINI T (初始化结束 )指令之前

这段时间内对它禁止。因此 ,芯片开始工作后始终处于监视状态。软件应设计成在它溢

出之前对监视定时器重新设置一次。如果由于硬件或软件失效、软件失控 ,将导致监视定

时器溢出 ,产生一个内部硬件复位 ,并把RSTOU T引脚拉到低 ,使外部硬件电路复位。

监视定时器是一个 16 位定时器 ,计数脉冲可在 CPU 时钟的 2 , 4 , 128 和 256 分频中

选取。监视定时器寄存器的高位字节可以设置 ,用预置在 WDT REL 中的值重装载 ,从而

改变监视时间间隔。每作一次软件服务 , 即对监视定时器的高位字节重新装载。在

25M Hz时 ,监视的时间间隔为 21μs~671ms。复位后 ,缺省的监视时间间隔为 5 .2ms。

6 .捕获/比较单元 (CAPCOM)

CAPCOM单元的典型用途是处理高速 I/ O任务 ,如脉冲和波形生成、脉冲宽度调制

( PWM)、数模转换 (D/ A)、软件定时以及记录有关的外部事件。

一些具有重加载寄存器的专用定时器用来对捕获/ 比较单元提供独立的时间基准。

定时器的输入时钟是可编程的 ,是对内部 CPU 时钟预分频后得到的若干个值。对于

CAPCOM2,也可由 GPT1 模块中定时器 T3 的溢出脉冲驱动。这就为定时周期和分辨

率提供了一个很宽的变化范围 , 并为特殊的应用要求提供了精细的调整。此外 , CAP-

COM 单元的外部输入可以用于对捕获/ 比较寄存器编制一个外部事件进程表。

CAPCOM2 可产生和控制 8 个通道的时间序列 ,其最高分辨率是 8 个 CP U 时钟周

期。捕获/ 比较寄存器阵列包含 8 对捕获/ 比较寄存器 ,每一对都可分配给 CAPCOM2 定

时器 T7 或 T8 ,用于捕获或比较功能的编程。每个寄存器配备一个引脚 ,用作捕获功能

的触发输入 ,或事件比较结果的输出。

当捕获/ 比较寄存器选取捕获模式时 ,将对加到此寄存器对应引脚的外部事件作出响

应 ,把相应定时器的当前内容锁存到捕获/ 比较寄存器。还会产生对这个捕获/ 比较寄存

器指定的中断请求。加到此引脚的外部信号的上升沿、下降沿或上升/ 下降沿都可选作事

件的触发。使用 5 种比较模式中一种对所有选取寄存器的内容连续地与指定的定时器内

容进行比较。当定时器值与捕获/ 比较寄存器值匹配时 ,按选定的比较模式进行预先规定

的操作。

第 1 章 亿恒 16 位单片机

Page 31: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

20

CAPCOM6 单元提供 3 个捕获/ 比较通道和 1 个附加的比较通道。3 个比较通道各

控制两根输出线 ,可以通过编程使它们产生非交叠的脉冲图形。附加的比较通道可以产

生一个独立的输出信号 ,或对其他 3 个通道的输出信号进行调制。

还可产生通用多通道 PWM信号。或是通过内部定时器进行控制 ,或是从外部 (如用

霍尔传感器件 )进行控制。

各个输出端的有效电平可以独立选择。

陷阱功能允许在响应一个外部信号时输出指定的电平。

7 . A/ D转换器

为了对模拟信号进行测量 ,片内集成有一个 10 位 A/ D转换器 ,它具有 8 个多路选择

输入和采样保持电路 ,采用逐次逼近法实现转换。采样时间 (对电容充电时间 )和转换时

间是可编程的 ,可以根据外部电路调整。

转换结果寄存器 ( ADDAT )有溢出错误的检测/ 保护 ,当下一个转换完成 ,而上一个

转换结果尚未从转换结果寄存器读出时 ,产生中断信号 ;或者使下一个转换在这种情况下

挂起来直到前一个结果被读出。

未用作模拟输入通道的输入端可作为一般的输入口。

C164CI 的 A/ D转换器支持 4 种工作模式 :

(1 ) 标准的单通道转换模式 ,对指定通道的模拟输入作一次采样 ,并将其转换成数字

信号。

(2 ) 单通道连续转换模式 ,对指定通道的模拟输入作重复的采样和转换 ,无需软件的

干预。

(3 ) 自动扫描模式 ,对预先指定的若干个通道的模拟输入依次进行采样和转换。

(4 ) 连续自动扫描模式 ,对预先指定的若干个通道进行重复的采样和转换。另外在

运行序列中可插入一个指定的通道 ,而不打乱此序列。这种工作方式称为通道插入模式。

周边事件控制器 ( PEC)可自动地把转换结果存入存储器 ,形成一个表格 ,供以后的计

算用。对每个数据的传送 ,不需要作进入和退出中断子程序的操作。

8 .实时时钟

C164CI 包含一个实时时钟 ( RT C) ,它可作下列各种用途 :

(1 ) 用作系统时钟 , 确定当前的时间和日期。即使在空闲模式和掉电模式时也可

选用。

(2 ) 建立中断的循环时间 ,例如独立于 CPU 频率的系统时间的读秒 ,无需加载的通

用定时器 ,或用于有规律的从空闲模式中唤醒。

(3 ) 48 位定时器 ,用于长时间段的测量。最大可用的时间间隔为 100 年。

R TC 模块由 3 个分开的部件串接组成 ,一个为固定的 8∶1 分频器 ,一个为 16 位可

重加载定时器 T14 ,以及一个 32 位的 RT C定时器 (通过 R TCH 和 R TCL进行访问 )。这

两个定时器都工作在加计数。

亿恒 C164CI 16 位单片机

Page 32: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

21

1 .3 .4 灵活的功率管理

在众所周知的功率节省模式 (空闲模式和掉电模式 )基础上 , C164CI增加了下面一些

功率管理特性。这些特性可以组合使用 ,减小单片机的功率损耗 ,从而使系统功耗达到

最小。

� 灵活的时钟控制。

� 灵活的周边功能管理 ,对周边电路可以单独或成组使能/ 禁止。

� 用 RT C定时器周期性地从空闲模式唤醒。

上述这些特性为系统提供了实现高效的待机状态的方法 ,达到节省功率 (即待机时

间 )和周边电路工作 (即系统功能 )之间的平衡。

1 .灵活的时钟控制

对时钟生成系统作了改进 ,可由用户控制灵活地生成各种时钟 ,提供给 C164CI 中需

要时钟信号的模块。这对功率敏感的模式 (如待机工作 )是特别重要的。

对振荡器的功率进行了优化 ,使 C164CI 中产生时钟信号所消耗的总功率减小。

对时钟系统进行有效的控制 ,使生成所需时钟信号的功率消耗减少。

为了降低功率 ,使器件工作在较低的频率 ,可以对振荡器产生的时钟进行 1~32 分频

选择。

2 .灵活的周边功能的管理

灵活的周边管理可使各个周边电路单独地使能和禁止。在各种状态 (例如几种系统

工作状态 ,待机状态等 )下 ,仅使那些要用的周边电路保持运行 ,其他的全部关闭。允许禁

止整组周边电路工作 ,包括所需要的输入时钟信号在内。其他的周边电路仍可维持工作 ,

例如保持通信通道工作 ,对不在禁止组内的周边电路的寄存器仍可进行访问。

3 .周期性唤醒空闲模式

周期性的从空闲模式或休眠模式唤醒能兼顾功率的大幅下降 (结合适当的功率管理 )

和系统高可用性。外部信号和事件以低的速率周期性地激活 CP U 和选定的周边电路 ,

使它们在短时工作后返回节省功率模式。这样就大大减少了系统的平均功率消耗。

1 .4 单片机开发工具

单片机的开发和应用需要开发工具的支持。全世界有上百个厂商能提供亿恒单片机

的开发工具 ,包括 KEIL , TASKING 等著名工具提供商。这就使 C166 族的每一种产品

都能及时得到多种开发工具的支持 ,从而缩短了系统的开发时间 ,加快了产品进入市场的

速度。

第 1 章 亿恒 16 位单片机

Page 33: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

22

C164CI 单片机的开发工具主要有 :

(1 ) C 编译器、宏汇编、程序库和连接器 ,以及代码格式转换器。

(2 ) 反汇编和高级语言调试器 ( debugger )。

(3 ) 软件模拟器 ( simulator )。

(4 ) 在线仿真器 ( in-circuit emula tor)。

(5 ) 集成开发软件 DAVE 数字工程师。

(6 ) 编程器。

(7 ) Sta rte r Kit 练习器。

(8 ) 带监控程序的评估板。

(9 ) 操作系统和网络驱动软件 ( CAN , PROFIBUS)。

本书介绍的 Star ter Kit 练习器是供初次接触 C164CI 单片机的用户学习用的。练习

器由评估板 KitCON-164 和一组开发软件组成。评估板上配备有 C164CI-8EM 单片机 ,

以及 64KB 的 SRAM 和 256KB 的闪速存储器。还有一个与 PC 机通信的 RS-232 串行接

口和一个 CAN 接口。开发软件包括调试器、监控程序和对闪速存储器编程软件 ,以及全

CAN接口评测软件。该练习器也可用于对 C164CI-8EM 片内的 OTP 进行编程。

亿恒 C164CI 16 位单片机

Page 34: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

体 系 结 构

2 .1 存储器的组织

2 .1 .1 概述

C164CI 的存储空间是按冯·涅曼体系结构组织的。代码和数据的访问使用同一个

线性地址空间。全部物理的存储器区包括内部掩模 ROM/ Flash/ OTP、内部 RAM 区、内

部的专用寄存器区 (SFR 和 ESFR ) ,及使用 XBUS的周边电路和外部存储器区 ,这些全都

映射到一个公共的地址空间。

C164CI 有一个总的 16MB 的可寻址存储空间。这个地址空间分成 256 段 , 每段

64KB。每个段再细分为 4 个数据页 ,每页 16KB(见图 2-1 )。

图 2-1 存储区和地址空间

Page 35: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

24

大多数内部存储器区是映射到段 0 , 这个段称为“系统段”。段 0 顶部的 4KB

(00F000H~00F FFF H )为内部 RAM 区和专用寄存器区 ( SFR 和 ESFR )。段 0 底部的

32KB(000000H~007FF F H )分配给片内 ROM/ Flash/ OTP 存储器 ,称为内部 ROM 区。

内部 ROM 区可以重新映射到段 1 的 ( 010000 H~017F FF H )区域 ,这时段 0 低地址的那

一半用于对外部存储器的访问。内部 ROM 也可以全部禁止 ,而使用外部 ROM。

代码和数据可以储存在内部存储区的除 SFR 区外的任何部分。SFR 区用于存放控

制信息和状态指示 ,但不能用来存放指令。

注意 :对无 ROM 的器件进行内部 ROM 区的访问会产生不可预期的结果。

图 2-2 字、字节和位在存储区内的存放位置

字节可以存在奇地址或偶地址 , 字存在

以偶地址起始的连续两个存储器单元中 ,低

位字节存到偶地址 , 高位字节存到奇地址。

双字 (只适用于代码 )以两个接连字方式存

放在存储器中。单个的位总是存放在一个

字地址的指定位中。位 0 是偶字节地址的最

低位。位 15 是奇字节地址的最高位。图 2-2

示出了字、字节和位在存储区内的存放位置。

一部分专用寄存器也支持位寻址 ,用作通用寄

存器的内部 RAM也可以进行位寻址。

注意 :组成双字的字节必须处在同一个

物理空间内 (内部 ,外部 , ROM , RAM) ,并且

在同一段存储器的同一页内。

2 .1 .2 内部 ROM区

C164CI 的片内掩模 ROM/ Flash/ OTP存储器可以有不同大小的地址区 ,其大小与型

号有关 ,以 32KB 为单位进行组织。片内最低的 32KB 存储器是内部 ROM 区。内部

ROM 区是通过寄存器 SYSCON 的位 ROMEN 整体使能或禁止的。位 ROMEN 是在复

位时按照EA引脚的电平设置的 ,也可以通过软件改变。如果处在使能状态 ,内部 ROM

区就占据段 0 或段 1 低地址部分的 32KB,映射到段 0 还是段 1 ,由寄存器 SYSCON的位

ROMS1 控制。

注意 :内部 ROM 区的大小与芯片实际所含的 ROM 的大小无关 ,即对于 ROM 小于

32KB或无 ROM 的器件 ,如果 ROM 使能的话 ,同样要占据这 32KB 的地址。而具有更

大 ROM 的器件 ,只把其一部分映射到该地址区。

ROM 比 32KB大的器件 ,把 ROM 区从段 1 的中部向上扩展 ,即从地址 018000 H 开

始向高地址延伸。

内部 ROM/ Flash ,既可用于代码 (指令 ) ,也可用于数据 (常数、表格等 )的存储。

代码的提取总是从偶字节地址开始。在内部 ROM 中可存储的最高位置 ,对单字指

令是 XXXXFEH ,对双字指令是 XXXXFCH。因为它不支持从内部 ROM 到外部 ROM

的跨区连续执行 ,所以在内部 ROM 区的最高位置必须放一条无条件分支转移指令 ,否则

亿恒 C164CI 16 位单片机

Page 36: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

25

会造成错误。

任何一个字和字节的读操作 ,使用间接寻址或长 16 位的寻址方式。对于内部 ROM

的操作数 ,不存在短寻址方式。任何一个字的访问从偶字节地址开始 , 在内部 ROM 区

中 ,字数据存储的最高位置是 XXXXFE H。对于 PEC 数据传送 ,内部 ROM 区可通过

PEC源指针和目的指针进行访问 ,与寄存器 DP P的内容无关。

内部 ROM 区不能进行单个位的存储 ,因此没有位寻址。

注意 :文中“X”的值与可用的 ROM/ Flash 存储器及映射情况有关。

内部 ROM 区可以通过软件控制来使能或禁止 ,以及映射到段 0 或段 1。参见 3 .4 .4

“编程指南”一节。

2 .1 .3 内部 RAM和 SFR区

RAM/ SFR 区位于数据页 3 内。C164CI有 2KB 的内部 RAM ( IRAM ) ,对应的地址

范围是 00F600 H~00FDFF H ,以 16 个字节为单位进行组织 ,专用寄存器有两个 512 字节

块 (见图 2-3)。

图 2-3 内部 RAM 区和 SFR区

第 2 章 体 系 结 构

Page 37: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

26

内部 RAM 用于 :

� 系统堆栈 (大小由编程决定 )。

� 通用寄存器组 ( GPR)。

� 用作周边事件控制器 ( PEC)的源指针和目的指针。

� 变量和其他数据的存储。

� 指令代码的存储。

对代码访问总是从偶字节地址开始的。在内部 RAM 区存储代码时 ,可用的最高地

址对单字指令为 00FDFEH ,对双字指令为 00FDFCH。因为不能跨越 RAM 区与 SFR 区

的边界连续执行 ,在这些位置必须放一条无条件转移指令。

如果选取的寄存器 DP P指向数据页 3 ,内部 RAM 区中的字和字节数据可以通过间

接寻址和长 16 位寻址方式访问。对任何字数据的访问是在偶字节地址进行的 ,在内部

RAM中可用的字数据存储的最高地址为 00FDFE H。当进行 PEC 数据传送时 , 内部

RAM可以通过 PEC 源指针和目的指针进行访问 ,与寄存器 DPP的内容无关。

内部 RAM 的高 256 个字节 ( 00FD00H~00FDFF H )和当前的通用寄存器组可以对

单个的位进行存储 ,它们是可位寻址的。

1 .系统堆栈

系统堆栈可以定义在内部 RAM 区 ,系统堆栈的大小是由寄存器 SYSCOM 中位域

ST KSZ的内容控制的 ,见表 2-1。

表 2-1 系统堆栈大小的设定

< STKSZ > 堆栈大小/ 字 内部 RAM 的地址/ 字

000B 256 00FBFEH~00FA00 H (复位时缺省值)

001B 128 00FBFEH~00FB00 H

010B 64 00FBFEH~00FB80 H

011B 32 00FBFEH~00FBC0 H

100B 512 00FBFEH~00F800 H

101B 无 保留。不使用这种组合

110B 无 保留。不使用这种组合

111B 1024 00FDFEH~00F600 H (注 :无循环堆栈)

所有系统堆栈的操作使用堆栈指针对内部 RAM 进行访问。堆栈从上向下生长 ,对

应的 RAM 地址由高到低。系统堆栈只支持字的访问。堆栈上溢寄存器 ( STKOV )和堆

栈下溢寄存器 (STKUN )用来控制所选取的堆栈区的上下边界。这两个堆栈边界寄存器

不仅用来保护数据不被被坏 ,而且允许与支持当系统堆栈溢出和填满时实现一个循环堆

栈 (选项 111 除外 )。

实现循环堆栈的技术见 3 .4 .4“编程指南”一节。

亿恒 C164CI 16 位单片机

Page 38: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

27

2 .通用寄存器

通用寄存器 ( GPR)使用内部 RAM 中地址连续的 16 个字。上下文指针寄存器 ( CP)

确定了当前激活的寄存器组的基地址。寄存器组可以由 16 个字的 GPR 组成 ( R0 ,

R1 ,⋯ , R15 ) ,也可由 16 个字节的 GPR 组成 ( RL0 , R H0 ,⋯ , R L7 , R H7 )。这 16 个字节

的 GPR 映射为前 8 个字 (见表 2-2)。

表 2-2 通用寄存器到 RAM的映射

内部 RAM 的地址 字 节 地 址 字 地 址

< CP > + 1EH 无 R15

< CP > + 1CH 无 R14

< CP > + 1 AH 无 R13

< CP > + 18 H 无 R12

< CP > + 16 H 无 R11

< CP > + 14 H 无 R10

< CP > + 12 H 无 R9

< CP > + 10 H 无 R8

< CP > + 0EH RH 7 RL7 R7

< CP > + 0CH RH 6 RL6 R6

< CP > + 0 AH RH 5 RL5 R5

< CP > + 08 H RH 4 RL4 R4

< CP > + 06 H RH 3 RL3 R3

< CP > + 04 H RH 2 RL2 R2

< CP > + 02 H RH 1 RL1 R1

< CP > + 00 H RH 0 RL0 R0

与系统堆栈相反 ,寄存器组是从低地址向高地址生长的 ,最多占用 32 个字节。G PR

是通过 2 位、4 位和 8 位短寻址方式访问的 ,使用上下文指针寄存器作基址 (与当前 DPP

寄存器的内容无关 )。此外 ,当前激活的寄存器组的每一位都可以按位访问。

C164CI 支持寄存器组的快速切换。同一时间在内部 RAM 中可以存在多个寄存器

组 ,只有由上下文指针寄存器选定的寄存器组是激活的。因此 ,只要简单地修改一下寄存

器 CP的内容 ,就可选择一个新的激活的寄存器组。一个特殊的上下文切换指令 ( SCXT )

用来实现寄存器组的切换 ,并自动保存前一个上下文指针的内容。可实现的寄存器组的

个数只受到可用的内部 RAM 的限制。

第 2 章 体 系 结 构

Page 39: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

28

3 . PEC源指针和目的指针

内部 RAM 中的 16 个字 (地址为 00FCE0 H~00FCF F H )用作 8 个 PEC 通道数据传

送的源地址和目的地址的指针。每个通道有一对指针 ,存放 2 个字 ,低地址的是源指针

(DSTPX) ,高地址的是目的指针 (DSTPX) ,其中 X为 0~7(见图 2-4 )。

图 2-4 PEC指针的位置

进行 PEC 数据传送时 ,对该 PEC 通道的源指针和目的指针的访问 ,与当前寄存器

DPP内容无关 ,并且对这些指针所指单元的访问 ,也与当前寄存器 DPP 内容无关。如果

PEC通道未使用 ,相应的指针所在单元可以用作字或字节的数据存储。

有关对 PEC 数据传送时源指针和目的指针的使用 , 参见 2 .3“中断和陷阱功能”

一节。

4 .专用寄存器

C164CI 的 CPU 功能、总线接口、I/ O 口和片内周边电路是通过一些专用寄存器

(SFR )进行控制的。这些 SFR 位于两个大小为 512 个字节的区域内。第一个寄存器块

为 SFR 区 ,位于内部 RAM 区上方 512 个字节 ( 00FF FF H~00FE00 H ) ;第二个寄存器块

为 ESFR 区 ,位于内部 RAM 区下方的 512 个字节 ( 00F1FF H~00F000H )。

对专用寄存器的访问可以通过间接寻址和 16 位长寻址方式进行。当使用一个 8 位

偏移量和隐含基址寻址时 ,允许对 SFR 整个字或其低位字节进行操作。但不能对其高位

字节进行操作。

注意 :当写一个字节到 SFR 时 ,其对应的高位字节将清零。

SFR 区和 ESFR 区的上半部分 (高地址的 256 个字节 )是可位寻址的。所以各个控

制/ 状态位可以直接用位寻址方式进行修改和检查。

在使用 8 位地址或直接位地址访问 ESFR 区的寄存器时 ,先要执行扩展寄存器指令 ,

把短寻址机制从标准的 SFR 区切换到扩展的 SFR 区。对 16 位长寻址和间接寻址则无

需这样做。GPR 的 R15~R0 是双重的 ,它们可以通过 2 位、4 位和 8 位短寻址在两个寄

存器块内进行访问 ,不需要切换。

访问 ESFR 的例子参见 3 .3 .4“编程指南”一节。

亿恒 C164CI 16 位单片机

Page 40: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

29

2 .1 .4 片内 XRAM

C164CI 可以提供 2KB 的片内扩展 RAM ,标记为 XRAM。它位于数据页 3 ,对应的

地址范围是 00E000 H~00E7F F H。XRAM 接到内部 XBUS,对它的访问类似于对外部

总线的访问 ,但不执行外部总线的周期。XRAM 通过寄存器 SYSCON 的位 XPEN 进行

全局使能和禁止。复位后 ,位 XPEN清零 ,禁止访问 XRAM ,对它的访问映射到外部存储

器。可以在初始化时对 XPEN 置位 ,允许访问 XRAM。它可用于存储指令代码和数据

(变量、用户堆栈、表格等 )。

指令提取总是从偶字节地址开始。XRAM 存储代码的最高地址是 00E7FEH ,对双

字指令是 00E7FCH。在这些位置必须存放一个无条件转移指令 ,因为不能有从 XRAM

到外部存储器的跨越 ,这会引起错误。

可以通过间接寻址和 16 位长寻址方式进行任一字和字节数据的访问。对 XRAM 不

存在短寻址方式。字数据的访问是从偶字节地址开始 , 字数据存储的最高地址是

00 E7FE H。作 PEC数据传送时 ,对 XRAM 的访问与 DPP 寄存器的内容无关 ,而是通过

源指针和目的指针进行。

注意 :因为 XRAM 类似外部存储器 ,因此它不能用作系统堆栈或寄存器组。XRAM

也不提供对单个位的存储 ,因此不能进行位寻址。

对 XRAM 的访问使用下列形式的总线周期 (参见 4 .1“外部总线”一节 ) :

� 通常的 ALE。

� 无等待状态周期。

� 无三态等待时间。

� 无读/ 写延迟时间。

� 16 位分离的多总线周期。

尽管 XRAM 的使用类似外部存储器 ,但它不占用寄存器 BU SCON/ ADDSEL ,而是

通过附加的专用寄存器 XBCON/ XADRS选择的。这些寄存器是掩模编程的 ,用户不能

访问。这些寄存器的地址 00E000H~00E7FE H 保留给访问 XRAM 使用。

2 .1 .5 外部存储空间

C164CI 可以使用 16MB的地址空间。内部存储器区只是这个地址空间的一小部分 ,

所有不能用作片内存储器 ( ROM 或是 RAM)、寄存器的地址按外部存储器处理。外部存

储器通过 C164CI 的外部总线接口进行访问。

存储器区大小有 4 种 :

� 不分段模式 , 64KB,使用 P0 口或 P1 口作地址 A15~A0。

� 2 位分段模式 , 256KB, 使用 P0 口或 P1 口作地址 A15~A0, 使用 P4 口作地址

A17~A16。

� 4 位分段模式 , 1MB, 使用 P0 口或 P1 口作地址 A15~A0, 使用 P4 口作地址

第 2 章 体 系 结 构

Page 41: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

30

A19~A16。

� 6 位分段模式 , 4MB, 使用 P0 口或 P1 口作地址 A15~A0, 使用 P4 口作地址

A21~A16。

每个区可以通过地址总线直接寻址 ,同时使用片选信号选择不同的存储器区。

C164CI 有 4 种不同的总线类型 :

� 16 位复用总线 , P0 口用作地址和数据总线 (复位时缺省方式 )。

� 8 位复用总线 , P0 口用作地址总线 , P0L 口还用作数据总线。

� 16 位分离的多总线 , P1 口用作地址总线 , P0 口用作数据总线。

� 8 位分离的多总线 , P1 口用作地址总线 , P0L 口用作数据总线。

存储器模式和总线类型在复位时由EA引脚和 P0 口引脚选择。关于外部总线的配置

和控制详见 4 .1“外部总线”一节。

外部存储器的字和字节数据可通过间接寻址和 16 位长寻址方式 ,使用 4 个 DPP 寄

存器中的一个进行访问。对外部存储器的操作数不存在短寻址方式 ,任何字数据的访问

从偶字节地址开始。

进行 PEC 数据传送时 ,在段 0 中的外部存储器可以通过 PEC 源指针和目的指针进

行访问 ,与寄存器 DPP的内容无关。

外部存储器不提供对单个位的存储 ,因此没有位寻址。

2 .1 .6 存储器边界的跨越

C164CI 的地址空间由不同的块 (段、页 )组成 ,并分成若干个逻辑存储器区。在代码

或数据跨越这些块或区的边界时 ,需要特别加以注意 ,以保证控制器能执行所要的操作。

存储区是指不同种类存储器所占的那部分地址空间。它们包括内部 RAM/ SFR 区、

内部 ROM 区、扩展的周边电路 (如果集成在片内的话 )和外部存储器。

访问属于不同存储区的连续存放的数据单元是可行的。然而当执行代码时 ,不同存

储区必须用分支指令作显式的切换。不支持跨越边界的连续取指 ,那样会引起错误。

注意 :在段 0 内会发生从外部存储区到内部 RAM/ SFR 区的改变。

段是以 64KB 为单位的连续块。在取指时 ,它们是参照码段指针 CSP 进行访问的 ,

数据存取时直接使用段号 ,代替标准的 DPP机制。

在取指时 ,码段不会自动改变 ,必须作显式的切换。可以用 JMPS, CALLS和 RE TS

指令来实现。

在大的顺次执行的程序中 ,需确认一个段的存放代码的最高位置为无条件分支指令 ,

把程序转到下面有关的段 ,要避免出现离开当前段进行预取指的情况。

数据页是由每块为 16KB 的连续数据块构成 ,对各数据页的数据访问是参照数据页

指针 DP P3~DPP0 ,并直接用数据页号实现的 ,代替标准的 DPP 机制。各个数据页寄存

器可以选取 1024 个数据页中的一个。当前用于访问的寄存器 DPP 是通过 16 位数据地

址的高两位选取的。因此 ,跨越 16KB 边界的连续的数据地址 ,将使用不同的数据页指

针 ,从而在存储器中具体的物理位置不是必须连续的。

亿恒 C164CI 16 位单片机

Page 42: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

31

2 .2 中央处理器

2 .2 .1 概述

CP U 的基本功能是提取指令和译码 ,为算术逻辑单元 ( ALU)提供操作数 ,对 ALU

中的操作数进行运算 ,并存储前面的计算结果。CP U 作为 C164CI 的主要驱动器 ,还与周

边电路的工作有关。CP U的方框图如图 2-5 所示。

图 2-5 CPU 的方框图

C164CI 中使用了 4 阶流水线操作 ,最多可并行处理 4 条指令。因此 , CPU 从内部

ROM 取指时 ,多数指令的执行只需花费 1 个机器周期 (即 2 个 CP U 时钟周期 )。机器周

期是执行指令所需的最小时间。

本节将说明在一般情况下流水线对顺序指令和分支指令是如何处理的 ,以及在特殊

情况下用了哪些硬件设备来加快跳转指令的执行速度。

内部存储器的访问通常由 CP U 本身实现 ,而外设或外部存储器的访问是通过一个

特殊的位于片内的外部总线控制器 ( EBC)实现的。只要代码或数据的地址指向外部地址

空间 , EBC 就会被 CPU 自动激活。CPU 可在对外部存储器存取的同时继续运行。但若

所需的外部数据不能立即得到 ,或在 CP U 结束上一个外部存储器存取操作前 ,申请了一

个新的存取操作 , CP U 会由 EBC控制处在保持状态 ,直到请求被满足时为止。

第 2 章 体 系 结 构

Page 43: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

32

C164CI 的片内周边电路单独使用一个时钟生成电路 , 基本上独立于 CP U 工作。

CP U和这些周边电路之间的数据和控制信息的交换通过专用寄存器 (SFR )进行。无论

何时 ,当周边电路需要 CP U 服务时 ,片内中断控制器就会对所有挂起来的周边电路中断

请求进行比较 ,并取出它们中优先级最高的一个。如果这个请求的优先级高于目前的

CP U操作的优先级 ,就会发生中断。

中断处理主要有以下两种类型 :

(1 ) 标准中断处理 在按中断向量表作跳转分支前 ,强制 CPU 在堆栈中保存当前流

程的状态和返回地址。

(2 ) PEC 中断处理 只从目前的 CP U 操作中抽取一个机器周期 ,通过片内的周边

事件控制器 ( PEC)实现一个简单数据的传送。

程序执行时 ,检测到的系统错误 (所谓的硬件陷阱 )或外部的不可屏蔽中断也作为高

优先级中断进行处理。

和其他片内周边电路相比 ,监视定时器和 CP U 之间的关系更紧密。如果监视定时器

已使能 ,它会要求 CP U 在由程序设定的一个时间间隔内服务一次 ,否则会使芯片复位。

因此 ,监视定时器能够防止 CP U 因执行错误的代码而出现完全失控的情况。复位后 ,监

视定时器自动开始计数。如有需要 ,可用软件关闭。

除了通常的工作状态外 , CP U 还有下列几种特殊状态 :

(1 ) 复位状态 任何类型的复位 (由硬件、软件或监视定时器引起 )都将迫使 CPU 进

入预定的工作状态。

(2 ) 空闲状态 加到 CP U 本身的时钟信号关闭 ,而片内周边电路的时钟继续运行。

(3 ) 掉电状态 所有片上的时钟全部关闭 ( R TC 时钟可选择 ) ,所有的输入无效。

(4 ) 休眠状态 所有片上的时钟全部关闭 ( R TC 时钟可选择 ) ,外部中断输入使能。

通过中断 (如对空闲状态 )或复位 (如对掉电状态 ) , 可使 CPU 重新进入工作状态。

运用特定的 C164CI 系统控制指令 ,可使 CP U 进入空闲、掉电、休眠和复位状态。

专用于实现 CPU 核各种功能的一组专用寄存器如下 (说明见 2 .2 .5 节 ) :

� 总的系统配置 : SYSCON ( RP0 H)

� CP U状态指示和控制 : PSW

� 代码访问控制 : IP , CSP

� 数据页面控制 : DPP0 , DPP1 , DPP2 , DP P3

� GPR 访问控制 : CP

� 系统堆栈访问控制 : SP , STKUN , STKOV

� 乘法除法支持 : MDL , MDH , MDC

� ALU 常量支持 : ZEROS, ONES

2 .2 .2 指令的流水线操作

C164CI 指令的流水线操作将指令处理分为 4 个阶段 , 每个阶段具有各自独立的

任务。

亿恒 C164CI 16 位单片机

Page 44: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

33

(1 ) 取指阶段 从内部 ROM 区、内部 RAM 区或外部存储器提取由指令指针 ( IP)和

代码段指针 ( CSP)确定的指令。

(2 ) 译码阶段 对指令译码 ,如有需要 ,将计算操作数地址和提取相应的操作数。对

所有隐含的访问系统堆栈的指令 ,堆栈指针将进行递增或递减操作。对分支指令 ,指令指

针和代码段指针将用分支的目的地址更新。

(3 ) 执行阶段 对先前取到 ALU 中的操作数进行操作。此外 , PSW 中的状态标志

会按指令执行情况进行更新。所有对 SFR 存储区的直接的写操作和用作间接地址指针

时对 GPR 的自动递增、自动递减操作也在这个阶段执行。

(4 ) 写回阶段 所有的外部操作数和保留在内部 RAM 空间中的操作数被写回。

C164CI 有一个特殊之处 ,即所谓“注入”指令。这些注入指令是由机器内部产生的 ,

为那些在一个机器周期内无法完成的指令提供执行时间。它们是在流水线的译码阶段自

动插入的。然后它们就像所有标准指令一样通过后面的阶段。程序中断也是通过注入指

令实现的。虽然这些内部的注入指令实际上看不到 ,但在这里引入它们就比较容易说明

流水线的工作情况。

1 .顺序指令的处理

不论各个操作阶段是否真的需要执行 ,每一个简单的指令都要通过流水线的全部 4

个阶段。由于通过每一个阶段至少需要一个机器周期 ,每一个孤立的指令都至少要过 4

个机器周期才能结束。但是流水线结构允许对 4 个操作并行处理。因此 ,复位后一旦流

水线被填满 ,绝大多数指令的执行看起来只需一个机器周期 (见图 2-6 )。

图 2-6 顺序指令的流水操作

在一定时间内指令执行的平均数是指令流水线操作的一个指标。在下文中 ,指令执

行时间指的都是基于流水线的指令并行处理后的平均执行时间。

2 .标准分支指令处理

指令的流水线操作使顺序处理的程序得到加速。当碰到分支的时候 ,预先提取的指

令一般不是接下来必须译码的那条指令。因此 ,至少需要一个附加的机器周期来提取分

支指令的目的地址。这个额外的机器周期是以注入指令方式提供的 (见图 2-7)。

如果不做条件分支 ,情况就和顺序程序流程一样 ,因此也不需要附加的时间。此时 ,

分支指令代码后面的指令会在条件分支指令译码后的第一个机器周期内进入译码阶段。

第 2 章 体 系 结 构

Page 45: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

34

图 2-7 标准分支指令的流水线操作

3 .高速缓存跳转指令的处理

C164CI 带有一个跳转高速缓存 ,用以优化在一个循环中重复进行的条件转移。只要

是执行关于高速缓存的跳转 ,就能省去提取分支指令的目的地址的附加时间。因此 ,这种

缓存跳转指令在大多数情况下只需要一个机器周期。

这一性能用下列机制实现 :高速缓存跳转指令只在第一次通过流水线的译码阶段 ,且

满足跳转条件时 ,跳转的目的地址会像通常那样提取 ,并且产生一个机器周期的延时。和

标准分支指令不同的是 ,高速缓存跳转指令 ( JMPA , JMPR, JB, JBC, JNB, JNBS)的目的

地址在提取后还将存到高速缓存中。

在往后重复执行这个跳转指令时 ,跳转的目的地址将不再是从程序存储区提取 ,而是

从高速缓存直接注入到流水线的译码阶段 (见图 2-8)。

图 2-8 高速缓存跳转指令的流水线操作

4 .特殊的流水线操作

由于最多可能有 4 个不同的指令同时执行 , C164CI用一个附加的硬件来考虑各个指

令在流水线的不同阶段中可能出现的互相依赖关系。这个附加的硬件 (用于“预估”后面

的操作数的读写 )按时间优化的方法 ,解决大多数可能的冲突 (例如乘法对总线的占用 ) ,

使用户在大多数情况下不用去关注流水线。但也存在一些个别的情况 ,程序员应注意到

C164CI 是用流水线操作的 ,这时由流水线冲突所引起的延时要使用其他指令进行优化

解决。

(1 ) 数据页指针的修改

通过寄存器 DPP n( n = 0~3)来计算操作数具体地址的指令 ,一般不能使用刚修改得

到的新的 DP P值。因此 ,在修改 DP P值的指令后 ,至少需要插入一条指令 , 才可用那些

隐含使用 DP P值的长寻址或间接寻址指令。例如 :

亿恒 C164CI 16 位单片机

Page 46: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

35

In : MOV DPP0 , # 4 ;通过 DPP0选择数据页 4

In+ 1 : . . . ;这里不可以放使用 DPP0 的指令

In+ 2 : MOV DPP0 :0000 H , R1 ;将 R1 的内容移至地址 010000 H 单元

; (在数据页 4中 )假定该段已被激活

(2 ) 上下文指针的修改

通过寄存器 CP计算 GPR 操作数具体地址的指令 ,通常不能使用刚更新的 CP 值。

因此 ,为了保证新的 CP值确实能用 ,至少需要在 CP修改指令和接着的 GPR 指令之间插

入一条指令。

(3 ) 直接的堆栈指针的修改

RET , RETI , R ETS, RE TP 和 POP 指令都不能使用紧接它前面那条指令中对寄存

器 SP 修改的新的值。所以 ,为了能正确地用寄存器 SP中这个新值进行堆栈的存取 ,在

直接的寄存器 SP 写入指令和其后的任何间接调用 SP 的指令之间 ,至少要插入一条

指令。

In : MOV SP , # 0FA40 H ;通过 DPP0选择数据页 4

In+ 1 : . . . ;这里不能用从系统堆栈取操作数的指令

In+ 2 : POP R0 ;从新的堆栈顶取出一个字存放到 R0

注意 :与堆栈写入指令 ( P US H , CALL , SCXT )的冲突可由 CPU 逻辑内部解决。

(4 ) 外部存储器访问序列

当在外部总线上观察访问外部存储区的执行时序时 (如使用逻辑分析器 ) ,要注意下

面这种情况 ,不同的流水线阶段能够同时向外部总线控制器 ( EBC )发出一个请求。由于

预先规定了访问外部存储区的优先级 ,由 CPU 处理的指令序列可能和由 EBC 所执行的

对外部存储区存取的序列不同。访问外部存储区的优先级为 :

� 第一级 ,写数据。

� 第二级 ,提取代码。

� 第三级 ,读数据。

(5 ) 对中断的控制

对 PSW 的软件修改 (隐含的和直接的 )是在相关指令的执行阶段完成的。为了保持

快速的中断响应 ,在判断当前的中断优先级时不考虑这些变化 ,即在执行禁止中断的 IEN

或 ILVL 指令或其后的另一个指令时 ,中断请求仍会被接受。因此 ,对时间有严格要求的

指令序列不能紧挨着一个禁止中断指令后开始。例如 :

INT_OFF : CLR IEN ;禁止全部中断

In - 1 ;对时间无严格要求的指令

CRIT_1ST :In ;不可中断有严格时间要求序列的开始

CRIT_LAST : In + x ;不可中断有严格时间要求序列的结束

INT_ON : BSET IEN ;恢复全部中断

注意 :对中断系统的使能也要有上述的一个指令周期的延时 ,即只有跟在使能指令后

第 2 章 体 系 结 构

Page 47: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

36

的那个指令执行后 ,才会接受中断请求。

(6 ) 端口引脚的初始化

对端口引脚进行输入或输出的修改 ,只有在修改指令之后隔一条指令才有效。像位

操作指令 ( BSET , BCLR )这种使用内部的读-修改-写序列访问整个端口的指令和改变端

口方向的指令 ,其后不应跟有存取同一个端口的指令。例如 :

PORT_INIT_WRONG:

BSE T DP3 .13 ;将 P3 .13口的方向改为输出

BSE T P3 .9 ; P3 .13 口仍是输入

;执行这条读-修改-写指令时 ,是读引脚 P3 .13

PORT_INIT_RIGH T :

BSE T DP3 .13 ;将 P3 .13口方向改为输出

NOP ;任何不存取端口 3 的指令

BSE T P3 .9 ; P3 .13 口现在已变为输出

;执行这条读-修改-写指令时 ,

;是读 P3 .13口的输出锁存器

(7 ) 改变系统配置

在用寄存器 SYSCON 改变系统配置 (如内部 ROM 区的映射、区段设置、堆栈大小 )

的指令后 ,紧接着的指令不能使用新的资源 (如 ROM 或堆栈 ) ,必须插入一个不使用这些

资源的指令。对新的 ROM 区代码的存取 ,只有通过绝对分支转移指令转移到此区域后

才可实行。

注意 :改变 ROM 映射的指令一定要从内部 RAM区或外部存储区执行。

(8 ) 总线控制/ 地址选择 ( BU SCON/ ADDRSEL)

在改变外部地址区属性指令之后 ,不可以是对此新区域内的操作数存取的指令 ,必须

插入一个不对这一地址区存取的指令。对新地址区的代码存取只有通过绝对分支指令转

移到此区域后才能实现。

注意 :改变外部总线属性的指令不可从相应的外部存储区执行。

(9 ) 时序

指令的流水线操作大大缩短了平均指令执行时间 (大多数情况为从 4 个机器周期减

小到 1 个机器周期 )。但是 ,也有一些个别情况 ,如一个特殊的流水线操作会导致对一条

指令的处理时间延长半个或一个机器周期。虽然增加的时间只占全部程序执行时间的很

小一部分 ,但避免这种流水操作所引起的时间延时 ,在对时间有严格要求的程序模块中仍

是需考虑的。

除了一般的执行时间的说明外 ,在后面几节中还会介绍流水线引起的时序特点 ,对如

何优化一些对时间要求严格的程序给出一些提示。

2 .2 .3 位处理和位保护

C164CI 提供了几种进行位操作的机制 ,或是对内部 RAM 中软件标志进行操作 ;或

亿恒 C164CI 16 位单片机

Page 48: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

37

是通过相应的 SFR 中的控制位 ,对片内的周边电路进行管理 ;或是通过端口引脚 ,实现输

入输出功能。指令 BSET , BCL R, BAND , BOR , BXOR, BMOV 和 BMOVN ,对特定位进

行直接的设置或清除。指令 BFLDL 和 BFLDH ,允许在同一时间对指定字节的若干位同

时进行操作 ,最多为 8 位。指令 JBC 和 JNBC,在发生跳转时对指定位间接清零或置位。

指令 JB 和 JNB(与标志有关的条件跳转指令 ) ,查看特定位以决定是否进行跳转。

注意 :对未定义的位进行位操作时 ,读到的位值总是“0”,而对这些位的写入操作将不

起作用。

所有对单个位或一组位进行操作的指令 ,内部都是使用读-修改-写的序列对包含指

定位的整个字进行存取。

进行位操作时需考虑下列几点 :

(1 ) 只有位于内部 RAM 区和 SFR 区的位 ,能按位修改。对外部存储区不能使用位

操作指令。SFR 区、ESFR 区和内部 RAM 区的最高 256 个字节是可位寻址的 ,即对在这

些区域内的寄存器可直接使用位操作指令 ,对其他的 SFR 必须按字节或字存取。

注意 :所有的 GPR 是可位寻址的 ,与通过上下文指针 CP 对寄存器组所作的地址分

配无关。即使分配在不能作位操作的 RAM 区的 GPR 也具有这个特性。

(2 ) 读-修改-写序列对于受到硬件影响的位或许是临界的。在这种情况下 ,在读-修

改-写的操作过程中 ,硬件可以改变特定位的值 ,写回时由硬件产生的新的位值将被覆盖。

解决方法或是采用硬件保护 ,或是通过特殊的编程来实现。

受保护的位 (见表 2-3)在读-修改-写序列期间是不变的 ,如在读-修改-写的过程中硬

件所设的中断请求标志。硬件保护逻辑保证只有指定更改的位才受到写回操作的影响。

表 2-3 受保护的位

寄 存 器 位 名 备 注

T2IC , T3IC , T4IC T2IR , T3IR , T4IR GP T1 定时器中断请求标志

T3CON T3OT L GP T1 定时器输出触发锁存器

T7IC , T8IC T7IR , T8IR CAPCOM2 定时器中断请求标志

S0TIC , S0TBIC S0TIR , S0TBIR ASC0 发送(缓冲器)中断请求标志

S0RIC , S0EIC S0RIR , S0EIR ASC0 接收/ 出错中断请求标志

S0CON S0REN ASC0 接收使能标志

SSCTIC , SSCRIC SSCTIR , SSCRIR SSC 发送/ 接收中断请求标志

SSCEIC SSCEIR SSC 出错中断请求标志

SSCCON SSCBSY SSC 忙标志

SSCCON SSCBE , SSCPE SSC 出错标志

SSCCON SSCRE ,SSCT E SSC 出错标志

ADCIC , ADEIC ADCIR, ADEIR ADC转换结束/ 溢出中断请求标志

ADCON ADST , ADCRQ ADC启动/ 注入请求标志

CC27IC~CC24IC CC27IR~CC24IR CAPCOM2 中断请求标志

第 2 章 体 系 结 构

Page 49: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

38

续表

寄 存 器 位 名 备 注

CC19IC~CC16IC CC19IR~CC16IR CAPCOM2 中断请求标志

TFR TFR .15 ,14 ,13 A 类陷阱标志

TFR TFR .7 ,3 , 2 ,1 ,0 B类陷阱标志

P1 H P1 H .7~P1 H .4 用于 CAPCOM2 的 P1 口的有关位

P8 P8 .3~P8 .0 用于 CAPCOM2 的所有 P8 口的位

ISNC RTCIR 中断节点共享请求标志

XP0IC , XP3IC XP0IR ,XP3IR CAN 和 PLL/ RTC中断请求标志

注意 :如果由硬件产生的位操作和对位修改的软件发生冲突 ,软件修改享有优先权 ,

并决定相关位的最终值。

2 .2 .4 指令状态时间

一条指令执行的时间长短 ,基本上取决于指令是从何处提取的 ,操作数是从何处读出

的 ,以及又写到何处。C164CI的最快处理模式是执行从内部代码存储区提取的程序。这

时多数指令的处理只需一个机器周期 ,这也是正常情况下的最短执行时间。指令执行时

间的变化以“状态”为单位 , 1 个状态时间为 1 个 CP U 时钟周期。

外部存储区的存取由片上外部总线控制器 ( EBC)执行 ,它和 CP U 并行工作。

本节概括地对执行时间作一说明。对不同指令的执行时间和特殊情况的详细描述可

在“C166 族指令集手册”中查到。

表 2-4 列出了处理来自内部代码存储区、内部 RAM 区或外部存储区的指令所需的

最短执行时间。这些执行时间适合于大多数 C164CI 指令 ,某些分支指令、乘法、除法和

一个特殊的传送指令除外。内部 ROM 程序执行时 ,除了某些特殊的分支情况 ,执行时间

并不取决于指令长度。表中的数值以 CPU 的时钟周期为单位 , 并假定没有等待状态。

两个 CPU 的时钟周期组成一个机器周期。

表 2-4 指令的最短执行时间

提 取 指 令 字操作数访问

存储区 字指令 双字指令 读 写

内部代码存储器 2 2 2 ―

内部 RAM ( IRAM ) 6 8 0/ 1 0

16 位分离的多总线 2 4 2 2

16 位复用总线 3 6 3 3

8 位分离的多总线 4 8 4 4

8 位复用总线 6 12 6 6

亿恒 C164CI 16 位单片机

Page 50: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

39

程序从内部 RAM 执行 ,具有代码可加载和可修改方面的灵活性 ,但要考虑对执行时

间的影响。

程序从外部存储区执行时 ,指令执行时间与所选择的总线模式和总线周期 (等待状

态 )关系很大。下面列出可能会延长指令执行时间的操作数和指令的访问 :

� 读内部代码存储区的操作数 (对字节和字操作数的读出相同 )。

� 通过间接寻址方式读内部 RAM 的操作数。

� 在写入后立刻读内部 SFR 操作数。

� 读外部操作数。

� 写外部操作数。

� 跳转到内部 ROM 区未对齐的双字指令。

� 在 PSW 写入后立刻测试分支条件。

2 .2 .5 CPU 专用寄存器

CP U核需要一组专用寄存器 ( SFR)来维护系统状态信息 ,如为 ALU 提供可用寄存

器寻址的常量、系统和总线的配置 , ALU 的乘法和除法操作 ,代码存储区的分段 ,数据存

储区的分页 ,以及对通用寄存器和系统堆栈的访问。

对 CPU 核的 SFR 的访问机制和其他 SFR 的访问机制相同。由于所有的 SFR 都可

以简单地由能对 SFR 存储空间进行寻址的指令控制 ,因此 ,不需单独设立一组特殊的系

统指令。

但是需要注意的是 ,为了保证处理器的操作正确 , CP U 核的某些 SFR 对用户的访问

有限制。如指令指针 IP 和代码段指针 CSP 不能直接访问 ,只能通过分支指令间接修改。

寄存器 PSW, SP和 MDC,既可由程序员直接修改 ,也可在普通指令执行中由 CP U

间接修改。通过软件对 SFR 发出的一个直接写请求 ,会取代硬件在该时刻对同一个寄存

器作出的修改。

注意 :任何对 SFR 中单个字节的写操作 , 将对此特定 SFR 中的另一个字节清“0”。

未使用的 (保留的 ) SFR 位不能被修改 ,读出的值总为“0”。

1 .系统配置寄存器 SYSCON

这是一个可进行位操作的寄存器 ,提供总的系统配置和控制功能。寄存器 SYSCON

的复位值取决于 P0 口引脚在复位过程中的状态。

第 2 章 体 系 结 构

Page 51: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

40

位 功 能

VISIBLE

可见模式控制位

0 : 对 XBUS 周边电路的访问在内部进行

1 : 对 XBUS 周边电路的访问在外部引脚上可见

XPEN

XBUS 周边电路使能位

0 : 禁止对片内 XBUS周边电路访问 ,其功能被禁止

1 : 对片内 XBUS 周边电路使能 ,并允许访问

BDRST EN

双向复位使能位

0 : 引脚RSTIN仅为输入引脚

1 : 引脚RSTIN在内部复位序列期间被拉到低电平

OWDDIS

振荡器监视器禁止位

0 : 片内振荡器监视器激活

1 : 片内振荡器监视器禁止 ,且 CPU 时钟由振荡器提供

CSCFG

片选配置控制位

0 : CS锁定模式。内部锁定CS信号 ,并同步送到已使能的端口引脚

1 : CS失锁模式。CS信号直接由地址产生 ,并送到端口引脚

WRCFG

写配置控制位 (复位时根据引脚 P0 H .0 设置 )

0 : 引脚WR和BHE保持它们通常的功能

1 : 引脚WR作为WRL ,引脚BH E作为WRH

CLKEN

系统时钟输出 ( CLKOUT )使能位

0 : CLKOU T禁止 ,引脚可作一般的输入输出使用

1 : CLKOU T使能 ,引脚用作系统时钟信号的输出

BYTDIS

引脚BHE的禁止/ 使能控制位 (根据数据总线宽度设置 )

0 : 引脚BHE使能

1 : 引脚BHE禁止 ,引脚可作一般的输入输出使用

ROMEN

内 ROM 使能位 (复位期间根据引脚EA设置 )

0 : 内部 ROM 禁止 ,用外部总线访问 ROM 区

1 : 内部 ROM 使能

SGTDIS

分段禁止/ 使能控制位

0 : 分段使能 (在进入/ 退出中断时 , CSP 和 IP 被储存和恢复 )

1 : 分段禁止 (只有 IP 被存储和恢复)

ROMS1

内部 ROM 映射位

0 : 内部 ROM 区域映射到段 0 (000000 H~007FFFH )

1 : 内部 ROM 区域映射到段 1 (010000 H~017FFFH )

STKSZ系统堆栈大小设置

此位域选择内部 RAM 中系统堆栈的大小 (32~1024 个字)

注 :在执行 EI NIT 指令后 ,寄存器 SYSCO N 不能修改。在 4 .1“外部总线”一节中 ,对位 VI SIBLE , WRCF G, BYT-

DIS, ROM EN 和 ROMS1 的作用有更详细的说明。

亿恒 C164CI 16 位单片机

Page 52: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

41

下面对其中一些位作一说明 ,其他位在后续章节中再说明。图中标有阴影的位是受

硬件影响的位。此规定适用于下文所有的专用寄存器。

(1 ) 系统时钟输出使能位 ( CLKEN)

将寄存器 SYSCON 中的位 CLKEN 置“1”,可激活系统时钟输出功能。如果被激

活 ,端口 P3 .15 用于替换功能 , 用作 CLKOUT 的输出引脚。时钟输出是一个频率等于

CP U工作频率 ( f OU T = fCP U ) ,占空比为 50%的时钟 (减速操作的情况除外 ,那时 CLK-

OU T 是 CP U 时钟信号的镜像 )。

注意 :引脚 P3 .15 的输出驱动器在 CLKOU T 功能使能时自动接通 ,与端口方向控制

位无关。复位后 ,时钟输出功能禁止 ( CLKEN =“0”)。

在仿真模式中 CLKOU T 功能自动激活。

(2 ) 分段禁止/ 使能控制位 (SGTDIS)

位 SGTDIS用来选择存储区分段或不分段模式。

在存储区不分段模式中 (SGTDIS =“1”) ,代码地址空间限制在 64KB(段 0 ) , 16 位足

以表示所有代码的地址。对隐含的堆栈操作 ( CALL 或 R ET ) ,寄存器 CSP 被完全忽略 ,

只有 IP 存入堆栈并被恢复。

在存储区分段模式中 (SGTDIS =“0”) ,假定整个地址空间对指令都是可用的。对隐

含的堆栈操作 ( CALL 或 RE T ) ,寄存器 CSP 和 IP都存入堆栈并被恢复。在复位后 ,选择

存储区分段模式。

注意 :位 SGTDIS规定寄存器 CSP 在进入中断处理程序前是否和寄存器 IP 一样压

入系统堆栈 ,并在离开中断处理程序时将它恢复。

(3 ) 系统堆栈大小定义域 ( ST KSZ)

这个位域定义了位于 C164CI 内部 RAM 区的系统堆栈的物理大小。系统堆栈可使

用内部 RAM 的 32 ~512 个字或全部区域 (参见表 2-1 )。与这种堆栈方式相比 ,所谓的

循环堆栈机制允许使用更大的虚拟堆栈。这种技术在 3 .4 .4“编程指南”一节中有更详细

的描述。

2 .处理器状态字 PSW

这个可进行位操作的寄存器反映了微处理器的当前状态 ,其中有两组位分别表示当

前的 ALU 状态和 CPU 中断的状态。寄存器 PSW 内还有一个单独的位 ( USR0 ) ,用作一

般的用户标志。

第 2 章 体 系 结 构

Page 53: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

42

位 功 能

N负标志

ALU 计算结果为负时置位

C进位标志

ALU 计算结果产生进位时置位

V溢出标志

ALU 计算结果产生溢出时置位

Z零标志

ALU 计算结果为“0”时置位

E表格终端标志

当指令的源操作数为 8000 H 或 80 H 时置位

MULIP

乘除进程标志

0 :进程中没有乘除运算

1 :乘除运算已被中断

USR0通用的用户标志

可由应用软件使用

ILVL , IEN

中断和 EBC控制域

定义对中断请求的响应

(在 2 .4“中断和陷阱功能”一节中说明 )

(1 ) ALU 状态标志 (N , C, V , Z , E , MULIP)

寄存器 PSW 中的状态标志 ( N , C, V , Z , E ) , 表示由最近执行的 ALU 操作得出的

ALU 状态。对大多数指令 ,它们是按专门的规则设定 ,这些规则由执行该指令时 ALU

操作或数据传送操作确定。在直接修改寄存器 PSW 的指令后 ,用软件直接写入寄存器

PSW 的内容会取代隐含产生的状态标志值。直接读寄存器 PSW 所得到的值代表紧接在

前的指令执行后寄存器 PSW 的状态。

注意 :复位后 ,所有 ALU 的状态位清零。

� N 标志 对大多数 ALU 操作 ,如果结果的最高位为“1”, N 标志设为“1”,否则清

“0”。整数操作中 , N 标志可认为是结果的符号位 (负数为 N =“1”,正数为 N =“0”)。负

数是相应正数的 2 的补。对字数据 ,有符号数的范围是从 - 8000H~ + 7F FF H。对字节

数据是从 - 80 H~ + 7F H。对于具有两个位操作数的布尔位运算 , N 标志代表这两个指

定位的逻辑“异或”。

� C标志 做加法后 , C 标志表示从指定字或字节数据的最高位产生的进位。做减

法或比较后 , C 标志表示借位。这表示做减法时 ,在 ALU 内执行一个补码加 ,如果从指

定字或字节数据的最高位没有进位产生 , C 标志就被设为“1”;如果在补码加中产生进位 ,

则 C 标志清“0”。

C标志在逻辑操作、乘法和除法运算时总是为“0”,因为这些运算都不能产生进位。

对移位和循环移位操作 , C 标志代表最后移出的那一位。如果移位的次数为“0”,

即实际未移位 ,则 C 标志清“0”。ALU 作规格化操作时 , C 标志也被清“0”,因为在对一

亿恒 C164CI 16 位单片机

Page 54: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

43

个操作数规格化的过程中 ,不可能有“1”移出 MSB。对只有一个操作数的布尔位运算 ,

C标志总是为“0”。对有两个操作数的布尔位运算 , C 标志表示这两个指定位的逻

辑“与”。

� V 标志 对加法、减法及求 2 的补 ,若结果超出有符号数的最大范围 (对字操作为

从 - 8000 H~ + 7FFF H ;对字节操作为从 - 80 H~ + 7F H ) , V 标志设为“1”, 否则清“0”。

注意 ,如果 V标志溢出 ,则表明整数加法、整数减法或求 2 补的结果出错。

对乘法和除法 ,若结果不能用字数据类型表示 , V 标志设为“1”,否则清“0”。注意 ,

被“0”除总是导致溢出。和除法相比 ,无论 V 标志是否为“1”,乘法的结果都是有效的。

由于 ALU 的逻辑运算不会产生不合法的结果 , V标志在这些操作中都清“0”。V 标

志也用作循环右移或右移操作中的“黏接位”。只使用 C 标志的话 ,由右移操作引起的取

整误差可占结果的 LSB 的一半。而同时使用 V 标志和 C 标志 ,就能更好地估计取整误

差 (见表 2-5)。

表 2-5 右移取整误差的估计

C标志 V 标志 取整误差

0

0

1

1

0

1

0

1

没有取整误差

0 < 取整误差 < 1/ 2 LSB

取整误差 = 1/ 2 LSB

取整误差 > 1/ 2 LSB

对只有一个操作数的布尔位运算 , V 标志总是为“0”。对有两个位操作数的布尔位

运算 , V 标志表示这两个指定位的逻辑“或”。

� Z标志 如果 ALU 操作的结果等于“0”, Z 标志通常设置为“1”,否则清“0”。对

有进位的加法和减法 , Z 标志只在 Z标志已经为“1”,且当前 ALU 计算结果等于“0”时才

设为“1”。这一机制用来支持多精度的计算。

对只有一个操作数的布尔位操作 , Z 标志代表指定位先前状态的逻辑“非”。对有两

个位操作数的布尔位运算 , Z 标志代表这两个指定位的“或非”。ALU 作规格化操作时 , Z

标志表示第二个操作数是否为“0”。

� E标志 E 标志可由执行 ALU 操作或数据传送操作的指令改变。对那些不使用

表格搜索操作的指令 , E 标志清“0”。对所有其他情况 , E 标志的设置由源操作数的值决

定 ,以表示是否到达一个搜索表格的结尾。如果一条指令的源操作数的值等于最低的负

数 (对字数据是 8000H ,对字节数据是 80H ) ,则 E标志设为“1”,否则清“0”。

� MULIP 标志 当一个 ALU 的乘法或除法操作被打断 , 进入中断处理程序时 ,

MULIP 标志设为“1”。根据 MULIP 位的状态 ,用硬件控制在中断处理结束后是否必须

继续乘法或除法操作。在中断返回指令 ( RETI )执行时 , MULIP 位被栈中的 MULIP 标

志内容覆盖。

注意 : MULIP标志是任务环境的一部分。当中断处理程序未返回到被打断的乘除

指令时 (即任务调度在独立的任务间切换时 ) , MULIP 标志必须作为任务环境的一部分

存储起来 ,并在进入新的任务前相应更新。

第 2 章 体 系 结 构

Page 55: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

44

(2 ) CP U 中断状态标志 ( IEN , ILVL)

中断使能位可以对中断进行全局的使能 ( IEN =“1”)和禁止 ( IEN =“0”)。4 位的中

断级别域 ( ILVL)指定当前 CP U工作的优先级。中断级别由硬件在进入中断服务程序时

作出修改 ,也可以通过软件修改来防止响应其他的中断。当 CPU 的中断级别为“15”时 ,

已处在最高优先级 ,这时 CP U 的工作不能再被中断 , 硬件陷阱和外部不可屏蔽中断除

外。详见 2 .4“中断和陷阱功能”一节。

复位后 ,所有中断被全局禁止 , CP U工作指定为最低的优先级 ( ILVL = 0)。

3 .存储器工作指针

(1 ) 指令指针 IP

这个寄存器确定当前所取指令的段内地址 ,码段由寄存器 CSP 选择。寄存器 IP 不

映射到 C164CI 的地址空间 ,因此它不能直接访问。但寄存器 IP 可以通过堆栈用返回指

令间接修改。

执行分支指令和在取指操作后 ,寄存器 IP由 CP U 隐含地作出改变。

位 功 能

ip 规定当前提取的指令在段内的偏移位置。IP 与当前区段 < SEGNR > 有关

(2 ) 代码段指针 CSP

这是一个不能进行位地址操作的寄存器 ,它用来选择正在运行的指令所要访问的代

码段。寄存器 CSP的低 8 位选择 256 个段 (每段 64KB)中的一个 ,高 8 位留作将来使用。

位 功 能

SEGNR区段号

指定码段 ,当前指令从该段提取。分段被禁止时 , SEGNR 无效

代码的存储地址由寄存器 IP 的 16 位内容加上寄存器 CSP 低端的几位直接扩展后

得出。如图 2-9 所示。

亿恒 C164CI 16 位单片机

Page 56: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

45

图 2-9 通过代码区段指针寻址

注 :当分段被禁止时 , IP 值直接用作 16 位地址。

在存储器分段模式下进行外部代码访问时 ,通过 P4 口引脚输出寄存器 CSP 规定的

段地址 ,段地址范围由寄存器 RP0 H 的位域 SALSEL 控制 (参见 4 .1 .4“外部总线的控

制”一节 )。对存储器不分段模式和单片模式 ,此寄存器的内容没有什么意义 ,因为所有的

代码访问都自动限制在段 0 内。

注意 :寄存器 CSP在数据操作中只能读不能写。它或者由 JMPS和 CALLS 指令直

接修改 ,或者由 RE TS和 RE TI指令通过堆栈间接修改。

当接收一个中断 ,或执行软件 T RAP 指令时 ,寄存器 CSP自动设为“0”。

(3 ) 数据页指针 DPP0 , DPP1 , DP P2 , DPP3

这是 4 个不能进行位地址操作的寄存器 ,它们用来选择运行时同时激活最多 4 个不

同的数据页。每个寄存器 DP P的低 10 位从 1024 个可能的 16KB 数据页中选择一个 ,而

高 6 位保留待用。寄存器 DP P使我们可访问以 16KB为一页的整个存储空间。

第 2 章 体 系 结 构

Page 57: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

46

位 功 能

DPPxPNDPPx 的数据分页号

指定由 DPPx 选择的数据页。分段被禁止时 ,只有 DPPx 的最低两位有效

当通过任何直接或间接的长 16 位寻址方式对存储器的数据进行访问时 (通过 EXT

扩展指令的替代存取和 PEC 数据传送除外 ) ,寄存器 DPP 就会被隐含调用。复位后 ,对

数据页指针初始化 ,使得所有直接或间接的长 16 位地址都得出同样的 18 位地址空间。

这样 ,可在段 0 内按图 2-10 所示那样去访问数据页 3~0。如果不想使用数据分页功能 ,

就不需要做进一步的工作。

图 2-10 通过数据页指针寻址

数据分页是这样实现的 :用直接或间接的长 16 位地址的高 2 位所选择的 DPP 寄存

器的内容与其低 14 位连接。所选择寄存器 DPP 的内容指向 1024 个可能的数据页中的

一个。这个数据页的基本地址和 14 位的页偏移量构成 24 位物理地址 (可选择的部分送

到地址引脚 )。

在存储器不分段模式中 ,隐含只选择寄存器 DPP的最低 2 个有效位用于产生物理地

址。因此 ,如果选择了不分段模式 ,在改变寄存器 DPP 的内容时应特别注意 ,不然会产生

预期不到的结果。

在存储器分段模式中 ,所选择的相应寄存器 DPP 的区段地址 (通过位域 SALSEL 控

制 )由 P4 口的相应的段地址引脚输出 ,用于对所有的外部数据访问。

寄存器 DP P可通过任何能修改 SFR 的指令更新。

注意 :由于内部指令流水线的缘故 ,在紧跟修改寄存器 DPP 指令后的那条指令中 ,不

能用新的 DP P值进行操作数地址的计算。

(4 ) 上下文指针 CP

这是一个不能进行位地址操作的寄存器 , 用来选择当前工作寄存器组在内部 RAM

中所处的位置 ,亦即寄存器 CP 的内容决定了最大为 16 个字的 GPR 或 16 个字节的 G PR

的当前寄存器组内的第一个通用寄存器 ( GPR)的地址 (见图 2-11)。

亿恒 C164CI 16 位单片机

Page 58: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

47

位 功 能

cp

寄存器 CP 的可更改部分

指定当前寄存器组的基地址。向寄存器 CP 的 CP .11~CP .9 写入“000”值

时 ,位 CP .11~CP .10 由硬件设为“11”,其他所有情况 ,域 cp接受写入的值

注意 :由寄存器 CP 内容加短 G PR 地址所指出的 GPR 物理地址 ,必须总是在内部

RAM区内。如果不满足这个条件 ,会产生不正确的结果。还需注意的是 :

� 不要把 CP 设置在 IRAM 的起始地址以下部分 , 即 00FA00H/ 00F600 H/

00F200 H (1/ 2/ 3KB)。

� 不要设置 CP超过 00FDFEH。

� 当 CP超过 00FDE0H 时 ,要小心使用 GPR 的高地址部分。

图 2-11 通过寄存器 CP 选择寄存器组

寄存器 CP可通过任何能修改 SFR 的指令更新。

注意 :由于内部指令流水线的缘故 ,在紧接修改寄存器 CP 指令后的那条指令中 ,不

能用新的 CP值计算 GPR 地址。上下文切换指令 ( SCXT)可只用一个机器周期将寄存器

CP的内容存入堆栈 ,并用一个新值代替。

一些寻址方式在作地址计算时会隐含使用寄存器 CP。下面提到的寻址方式参见

3.2“寻址方式”一节中说明。

第 2 章 体 系 结 构

Page 59: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

48

短 4 位 GPR 地址 (记号为 Rw 和 Rb)指定一个关于由寄存器 CP指定的存储位置 (当

前寄存器组的基地址 )的相对地址。

这个短 4 位 GPR 地址在加到寄存器 CP 的内容以前 ,或乘 2 或不乘 ,这取决于被指

定的是字的 GPR 地址 ( Rw)还是字节的 GPR 地址 ( Rb) ,见图 2-12。字节和字的 GPR 存

取都可使用这种方式。

图 2-12 短 GPR寻址隐含使用 CP

用作间接寻址指针的 GPR 总是按字访问。对某些指令 ,只有最初的 4 个 GPR 可用

作间接地址指针 ,这些 GPR 通过短 2 位 GPR 地址指出 ,相应物理地址的计算和短 4 位

GPR 地址的一样。

短 8 位寄存器地址 (记号为 reg 或 bitoff) ,对在 F0 H~FF H 范围内的短 8 位寄存器

地址 ,可把最低 4 个有效位看成短 4 位 GPR 地址 ,最高 4 个有效位被忽略 ,相应的 G PR

物理地址的计算和短 4 位 GPR 地址相同。对 GPR 中单个位的访问 ,可像上面所说的那

样计算 GPR 的字地址 ,但是位在字内的位置由增加的另 4 位指明。

4 .堆栈工作指针

(1 ) 堆栈指针 SP

这是一个不能进行位地址操作的寄存器 ,用来指出系统堆栈的栈顶 ( TOS)。SP寄存

器的值在数据压栈前减量 ,并在数据出栈后增量。因此 ,系统堆栈是从较高的存储区地址

向较低的地址区生长。由于硬件将寄存器 SP的最低有效位固定为“0”,位 15 到位 12 固

定为“1”,寄存器 SP 只能取从 F000H~F FFE H 之间的值 ,故对一个具体堆栈的访问是在

C164CI 的内部 RAM 中进行。一个虚拟的堆栈 (通常更大 )可通过软件实现。这个机制

由寄存器 STKOV和 STKUN 支持 (见下面有关说明 )。寄存器 SP 可通过任何能修改

SFR 的指令更改。

注意 :由于内部的指令流水线 , POP 或返回指令不得在修改寄存器 SP的指令后立刻

使用。

亿恒 C164CI 16 位单片机

Page 60: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

49

位 功 能

sp寄存器 SP 的可修改部分

指定内部系统的栈顶

(2 ) 堆栈上溢指针 STKOV

这是一个不能进行位地址操作的寄存器。在每次把数据压入系统堆栈的操作后 (比

如 PU SH 和 CALL 指令或中断 ) ,以及寄存器 SP 每次减少后 ,把它和寄存器 SP 比较 ,如

果寄存器 SP 的内容比寄存器 STKOV 的值小 , 就会产生堆栈上溢硬件陷阱。由于寄存

器 STKOV的最低有效位由硬件固定为“0”,且位 15 到 12 由硬件固定为“1”, STKOV 寄

存器所含的值只能从 F000 H~FFFEH。

位 功 能

stkovSTKOV 的可修改部分

指定内部系统堆栈的低地址下限

堆栈溢出陷阱 (当 SP值 < STKOV值时进入 )有两种不同的使用方法 :

� 致命错误指示 通过相应的陷阱处理程序 ,把堆栈溢出按系统错误处理。这时 ,

在堆栈底部的数据也许会被在处理堆栈溢出陷阱时压入的状态信息覆盖。

� 自动淹没系统堆栈高地址端 这是为了得到一个更大的外部用户堆栈 ,将系统堆

栈当作一个“堆栈缓存”。在这种使用情况下 ,根据选择的最大堆栈范围 ,取堆栈的最低地

址加上 12 作为寄存器 STKOV的初始值。这考虑了可能发生的最坏情况 ,即恰好在进入

中断处理程序时检测到发生了堆栈溢出。这时 ,所增加的 6 个栈字地址可用于压入中断

处理程序和硬件陷阱处理程序的 IP , PSW 和 CSP。

关于堆栈溢出陷阱处理程序和虚拟堆栈管理的详细说明 ,在 3 .4 .4“编程指南”一节

中给出。

(3 ) 堆栈下溢指针 STKUN

这是一个不能进行位地址操作的寄存器。在每次从系统堆栈弹出数据 (比如 POP 和

RET 指令 ) ,及使寄存器 SP 增加后 ,把它和寄存器 SP 比较 ,如果寄存器 SP 的内容比寄

存器 STKUN的值大 ,发生堆栈下溢硬件陷阱。

由于寄存器 STKUN 的最低有效位由硬件固定为“0”,且位 15 到位 12 由硬件固定为

“1”,寄存器 STKUN也只能取从 F000H~F FFEH 之间的值。

第 2 章 体 系 结 构

Page 61: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

50

位 功 能

stkunSTKUN 的可修改部分

指定内部系统栈的上限

堆栈下溢陷阱 (当 SP值 > STKUN 值时进入 )也有两种不同的使用方法 :

� 致命错误指示 通过相关的陷阱处理程序 ,把堆栈溢出作为系统错误处理。

� 自动回填系统堆栈低地址端 同样是为了得到一个更大的外部用户堆栈 ,将系统

堆栈用作一个“堆栈缓存”。这时把寄存器 STKUN 的值初始化为可作用堆栈底的最高

地址。

(4 ) 堆栈超界的控制

堆栈超界的控制是利用两个寄存器 STKOV和 ST KUN 实现的。在执行 ADD , SUB

指令或是 P USH , POP 操作后 (明显的或隐含的 ) ,检测堆栈指针 SP是否超出了规定的堆

栈区域。

这个控制机制在下列情况时不会被触发 (即不产生堆栈陷阱 ) :

� 堆栈指针 SP 直接由 MOV 指令修改。

� 由于堆栈边界 (STKOV, STKUN)的改变 ,造成 SP超出了新的堆栈边界。

5 .乘法/除法工作寄存器

(1 ) 乘/ 除高位字寄存器 MDH

这个寄存器是 32 位乘/ 除寄存器的一部分 ,是在进行乘法/ 除法时由 CP U 隐含使用

的。在一次乘法后 ,这个不能做位操作的寄存器代表 32 位结果的高 16 位。对长除法 ,寄

存器 MDH 在除法运算开始前 ,必须加载 32 位被除数的高 16 位 ;在除法运算后 ,寄存器

MDH 中为 16 位余数。

位 功 能

mdh 指定 32位乘和除寄存器 MD 的高 16 位

只要这个寄存器通过软件作了改变 ,乘/ 除控制寄存器 ( MDC )内的乘/ 除寄存器使用

亿恒 C164CI 16 位单片机

Page 62: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

51

标志 ( MDRIU )就设为“1”。如果一次乘法或除法在完成前被中断 ,而在中断处理程序内

又执行了一个新的乘法或除法操作 ,寄存器 MDH 必须同寄存器 MDL 和 MDC一起保存

起来 ,以免产生错误结果。

(2 ) 乘/ 除低位字寄存器 MDL

这个寄存器是 32 位乘/ 除寄存器的一部分 , 在进行乘法/ 除法时由 CPU 隐含使用。

在做乘法后 ,这个不能做位寻址的寄存器表示 32 位结果的低 16 位。对于长除法 , MDL

寄存器在除法开始前 ,必须加载 32 位被除数的低 16 位 ;在除法运算后 ,寄存器 MDL 中

为 16 位的商。

位 功 能

mdl 指定 32位乘和除寄存器 MD 的低 16 位

只要这个寄存器通过软件被改变 ,乘/ 除控制寄存器 ( MDC)内的乘/ 除寄存器使用标

志 ( MDRIU )就设为“1”。一旦 MDL 寄存器通过软件被读取 , MDRIU 标志就被清除。如

果一次乘法或除法在完成前被中断 ,而在中断处理程序内又执行了一个新的乘法或除法

操作 ,寄存器 MDL 必须同寄存器 MDH 和 MDC 一起保存起来 ,以免产生错误结果。

对使用 MDH , MDL 寄存器编写乘/ 除算法的更详细说明 ,可参见 3 .4 .4“编程指南”

一节。

(3 ) 乘/ 除控制寄存器 MDC

这是一个不能进行位地址操作的寄存器 ,在做除法时由 CPU隐含使用。它用于储存相

应的乘/ 除操作所需的控制信息。寄存器 MDC 在乘/ 除指令的每个周期用硬件修改。

位 功 能

MDRIU

乘/ 除寄存器使用中

0 : 当寄存器 MDL通过软件读取时清零

1 : 当寄存器 MDL或 MDH 通过软件写时或执行乘法或除法指令时置位

! !

内部机器状态

乘/ 除单元使用这些位控制内部运算

不要在没有储存和恢复寄存器 MDC的情况下修改这些位

第 2 章 体 系 结 构

Page 63: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

52

当乘/ 除法在完成前被中断 ,并需继续使用乘/ 除单元时 ,寄存器 MDC 必须首先和寄

存器 MDH 和 MDL 一起保存起来 (以便稍后重新开始被中断的操作 ) ,然后必须对它清

零 ,为新的计算作准备。在新的除法或乘法结束后 ,被中断的乘法或除法的状态必须被

恢复。

MDRIU 标志是寄存器 MDC 中惟一可由用户使用的部分。寄存器 MDC 的剩下部

分保留为硬件专用。无论何时都不要用不同于上面所述的方法去修改它 ,否则不能保证

被中断的乘法或除法操作正确地继续进行。

如何使用寄存器 MD编写乘/ 除算法的详细说明 ,可参见 3 .4 .4“编程指南”一节。

6 .常量寄存器

(1 ) 常量 0 寄存器 ZEROS

这个可位地址操作的寄存器的所有位都由硬件固定为“0”。这个寄存器只能读。寄

存器 ZEROS可作为寄存器寻址的各位全为“0”的常量 ,用于位操作或产生屏蔽。它可用

任何能对 SFR 寻址的指令访问。

(2 ) 常量 1 寄存器 ONES

这个可位地址操作的寄存器的所有位都由硬件固定为“1”。这个寄存器只能读。寄

存器 ONES可作为寄存器寻址各位全为“1”的常量 , 用于位操作或产生屏蔽。它可用任

何能对 SFR 寻址的指令访问。

2 .3 中断和陷阱功能

2 .3 .1 概述

C164CI 的体系结构提供了几种机制 ,对各种服务请求作出迅速、灵活的响应。这些

请求是由处理器内部或外部的各个源产生的。

这些机制包括 :

(1 ) 普通的中断处理 CPU 暂时挂起当前程序的执行 , 进入中断处理程序 , 为请求

亿恒 C164CI 16 位单片机

Page 64: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

53

中断的设备服务。当前的程序状态 ( IP , PSW 以及分段模式下的 CSP)存到内部的系统堆

栈中。优先级处理机构具有 16 个优先级 ,可以为用户在有多个中断请求要处理时指定其

先后顺序。

(2 ) 通过周边事件控制器 ( PEC )的中断处理 使用集成在 C164CI 内的周边事件控

制器 ( PEC)为中断请求设备服务 ,是比普通的用软件进行中断处理速度更快的替代方法。

PEC由一个中断请求触发后 ,通过 8 个可编程 PEC 服务通道中的一个 ,可在段 0 (数据页

0~3 )内两个地址单元之间传送单个字或字节的数据。在通过 PEC 传送数据时 , CPU 正

常的程序执行只需暂停一个指令周期。不必保存内部的程序状态信息。PEC 和普通的

中断处理使用同一个优先级处理机构。PEC传送时 ,使用最高的 2 个优先级。

(3 ) 陷阱功能 陷阱功能由指令执行中出现的特殊情况激活。陷阱也可以由外部的

不可屏蔽中断引脚NMI激活。C164CI提供了几种硬件陷阱功能来处理指令执行中出现

的意外情况或错误。硬件陷阱总是具有最高的优先级 ,并使系统立即作出反应。软件陷

阱功能由 T RA P指令调用 ,该指令产生一个软件中断 ,有一个特殊的中断向量。对所有

的各类陷阱 ,当前的程序状态都保存到系统堆栈中。

(4 ) 外部事件的中断处理 虽然 C164CI 未提供中断专用的引脚 ,但它允许接入外部

中断源 ,并提供了几种机制来响应外部事件 (包括标准的输入 ,不可屏蔽的中断和快速的

外部中断 )。除了不可屏蔽中断和复位输入外 ,这些中断功能都使用端口的替换功能。

C164CI 的中断系统的结构如下。

C164CI 有 32 个独立的中断节点 ,它们分配到 16 个中断优先级。为了支持标准的和

统一格式的软件设计技术 ,大多数中断源或 PEC请求源都配备有一个单独的中断控制寄

存器和中断向量。控制寄存器中包含一个中断请求标志、一个中断使能位和相应中断源

的优先级。每个源的请求由一个特定的事件激活 ,该事件与相应设备所选择的工作状态

有关。为了更有效地利用资源 ,也可以使多个中断源的节点合并。这种节点可由几个源

的请求激活 (例如串行接口发生的各种错误 )。区别错误类型的状态标志被嵌入到串行通

道的控制寄存器中。另外对中断节点的共享还得到中断子节点控制寄存器 ISNC 的支持

(见下面的说明 )。

C164CI 有一个向量中断系统。在此系统中 ,存储区中一些特殊的向量地址作为复

位、陷阱和中断服务功能使用。一旦产生请求 , CPU 就分支转移到与该中断源相关的地

址 ,这样就可直接辨认出引起请求的中断源。惟一的例外是 B 类硬件陷阱共用一个中断

向量 ,然而可以用陷阱标志寄存器 ( TFR )的状态标志来确定是哪一种意外情况引起了陷

阱。对于软件 T RA P指令 ,向量地址由指令的操作数指定 ,它是一个 7 位的陷阱号。

这些被保留的向量地址在 C164CI 的地址空间的低端 (段 0 )建立了一个跳转表。用

跳转表构成适当的跳转指令 ,使程序转移到中断或陷阱服务程序。这些程序可位于地址

空间的任何位置。跳转表的入口位于地址空间段 0 的最低端。每一个入口占 2 个字 ,只

有复位向量或硬件陷阱向量占 4 或 8 个字。

表 2-6 中列出了 C164CI 中所有可以请求中断或 PEC服务的源、其相应的中断向量、

它们的地址和对应的陷阱号。还列出了中断请求标志和对应的中断使能标志的助记符。

助记符的一部分用来指定相应的源 ,其后的另一部分指定其功能 ( IR 表示中断请求标志 ,

第 2 章 体 系 结 构

Page 65: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

54

IE 表示中断使能标志 )。

表 2-6 C164CI 中断向量表

中断源和 PEC服务请求 请求标志 使能标志 中断向量 向量地址 陷阱号

快速外部中断 0 CC8IR CC8IE CC8INT 000060 H 18 H/ 24D

快速外部中断 1 CC9IR CC9IE CC9INT 000064 H 19 H/ 25D

快速外部中断 2 CC10IR CC10IE CC10I NT 000068 H 1A H/ 26D

快速外部中断 3 CC11IR CC11IE CC11I NT 00006CH 1BH/ 27D

GP T1 定时器 2 T2IR T2IE T2INT 000088 H 22 H/ 34D

GP T1 定时器 3 T3IR T3IE T3INT 00008CH 23 H/ 35D

GP T1 定时器 4 T4IR T4IE T4INT 000090 H 24 H/ 36D

A/ D转换结束 ADCIR ADCIE ADCINT 0000A0 H 28 H/ 40D

A/ D溢出错误 ADEIR ADEIE ADEIN T 0000A4 H 29 H/ 41D

ASC0 发送 S0TIR S0TIE S0TINT 0000A8 H 2A H/ 42D

ASC0 发送缓冲器 S0TBIR S0TBIE S0TBI NT 00011CH 47 H/ 71D

ASC0 接收 S0RIR S0RIE S0RINT 0000ACH 2BH/ 43D

ASC0 错误 S0EIR S0EIE S0EINT 0000B0 H 2CH/ 44D

SSC 发送 SCTIR SCTIE SCTI NT 0000B4 H 2DH/ 45D

SSC 接收 SCRIR SCRIE SCRIN T 0000B8 H 2EH/ 46D

SSC 错误 SCEIR SCEIE SCEINT 0000BCH 2F H/ 47D

CAPCOM 寄存器 16 CC16IR CC16IR CC16I NT 0000C0 H 30 H/ 48D

CAPCOM 寄存器 17 CC17IR CC17IE CC17I NT 0000C4 H 31 H/ 49D

CAPCOM 寄存器 18 CC18IR CC18IE CC18I NT 0000C8 H 32 H/ 50D

CAPCOM 寄存器 19 CC19IR CC19IE CC19I NT 0000CCH 33 H/ 51D

CAPCOM 寄存器 24 CC24IR CC24IE CC24I NT 0000E0 H 38 H/ 56D

CAPCOM 寄存器 25 CC25IR CC25IE CC25I NT 0000E4 H 39 H/ 57D

CAPCOM 寄存器 26 CC26IR CC26IE CC26I NT 0000E8 H 3A H/ 58D

CAPCOM 寄存器 27 CC27IR CC27IE CC27I NT 0000ECH 3BH/ 59D

CAPCOM 定时器 7 T7IR T7IE T7INT 0000F4 H 3DH/ 61D

CAPCOM 定时器 8 T8IR T8IE T8INT 0000F8 H 3EH/ 62D

CAPCOM 6 中断 CC6IR CC6IE CC6INT 0000FCH 3F H/ 63D

CAN 接口 1 XP0IR XP0IE XP0IN T 000100 H 40 H/ 64D

PLL/ OWD, RTC XP3IR XP3IE XP3IN T 00010CH 43 H/ 67D

CAPCOM 6 定时器 12 T12IR T12IE T12IN T 000134 H 4DH/ 77D

CAPCOM 6 定时器 13 T13IR T13IE T13IN T 000138 H 4EH/ 78D

CAPCOM 6 紧急事件 CC6EIR CC6EIE CC6EI NT 00013CH 4F H/ 79D

注意 :中断向量表的入口占用 2 个字的存储位置。相关的向量地址由陷阱号乘 4 得

到 (每个入口为 4 个字节 )。

所有未被相关模块使用的或是实际衍生产品中无相应模块的中断节点 ,都可以通过

亿恒 C164CI 16 位单片机

Page 66: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

55

对 IR 标志置位的方式来产生用于软件控制的中断请求。

表 2-7 列出了硬件陷阱的向量地址和寄存器 TFR 中相应的状态标志 ,还列出了某些

情况下 ,在同一指令内检测到多个陷阱情况时 ,陷阱服务的优先级。在任何一种复位 (硬

件复位、软件复位指令 SRST 或由于监视定时器溢出引起的复位 )之后 ,程序均从复位向

量地址 000000 H 开始执行。复位情况优先级要高于其他任何系统操作 ,具有最高的优先

级 (陷阱优先级 III)。

表 2-7 硬件陷阱的向量地址

意外情况 陷阱标志 陷阱向量 陷阱地址 陷阱号 陷阱优先级

复位功 :

硬件复位

软件复位

监视定时器溢出

RESE T

RESE T

RESE T

000000 H

000000 H

000000 H

00 H

00 H

00 H

A 类硬件陷阱 :

不可屏蔽中断

堆栈上溢

堆栈下溢

NMI

STKOF

STKUF

NM ITRAP

STO TRAP

ST UT RAP

000008 H

000010 H

000018 H

02 H

04 H

06 H

B类硬件陷阱 :

未定义操作码

保护指令错误

非法字操作数访问

非法指令访问

非法外部总线访问

UNDOPC

PRTFL T

ILLOPA

ILLINA

ILLBUS

BTRAP

BTRAP

BTRAP

BTRAP

BTRAP

000028 H

000028 H

000028 H

000028 H

000028 H

0AH

0AH

0AH

0AH

0AH

保留的 [ 2CH~3CH ] [0BH~0F H ]

软件陷阱 :

TRAP 指令

任何 4 的倍数

[ 000000 H~

0001FCH ]

任何值

[00 H~7FH ]

当前 CPU 的

优先级

软件陷阱可以初始化到 000000 H~ 0001FCH 间任何一个向量地址。通过软件

T RAP指令建立的服务程序总是在当前 CP U 的优先级上执行 ,其优先级由寄存器 PSW

中的位域 ILVL 指明。这意味着通过软件 T RAP 指令建立的服务程序可被任何硬件陷

阱或更高级别的中断请求所打断。

2 .3 .2 普通的中断处理和 PEC服务

每一指令周期中 ,根据中断优先级 ,在所有 PEC 请求或中断处理的资源中选择一个。

中断和 PEC 请求的优先级是在两种级别上设定的。对每一个请求源指定一个优先级。

第二个级别 (称为“组优先级”)是对处在同一优先级的一组由不同源同时产生的请求指定

一个组内的顺序。在每个指令周期的末尾 ,一个在当前具有最高优先级的源的请求将由

中断系统确定。如果其优先级比寄存器 PSW 中的 CPU 当前优先级高 ,那么将对这个请

第 2 章 体 系 结 构

Page 67: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

56

求作出响应。

中断处理通过寄存器 PSW 的中断总使能位 IEN 和 CP U 优先级域 ILVL 进行总体

控制。此外 ,不同的中断源由各自专用的中断控制寄存器 ( xxIC )分别控制。因此 , CP U

是否接受中断请求是由各个中断控制寄存器和 PSW 共同决定的。PEC 服务是由相应的

寄存器 PECCx、源指针和目的指针控制的 ,它们规定了相关的 PEC服务通道的任务。

1 .中断控制寄存器

所有中断控制寄存器的结构都是相同的。中断控制寄存器的低 8 位包含了判断优先

级所需的相关源中断状态的全部信息 ,各个寄存器的高 8 位为保留位。所有中断控制寄

存器都可以进行位操作 ,所有的位都可以通过软件进行读写。这就使得只需用一条指令

就可对中断源进行设置或修改。当通过字操作的指令“读”中断控制寄存器时 ,它们的高

8 位 ( 15 ~ 8)将会返回“0”值 ,丢弃所写的数据。

下面给出各中断控制寄存器 xxIC 各位的安排。这里 xx 为各相应中断源的助记符。

位 功 能

GLVL

组优先级

对同时产生的同一优先级的请求规定内部顺序

3 :最高组优先级

0 :最低组优先级

ILVL

中断优先级

为仲裁请求而规定的优先级

F H : 最高优先级

0 H : 最低优先级

xxIE

中断允许位

0 : 禁止中断请求

1 : 允许中断请求

xxIR

中断请求标志

0 : 没有未处理的请求

1 : 这个源已提出一个中断请求

(1 ) 中断允许位和请求标志

中断允许位用来对某个源的中断单独使能或禁止 ,控制中断请求的产生。

中断请求标志是在某个源产生一个服务请求时由硬件设置的。进入中断服务程序或

亿恒 C164CI 16 位单片机

Page 68: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

57

PEC服务后 ,标志将自动清除。但对于 PEC 服务 ,如果所选择的 PEC 通道的控制寄存器

PECCx 中的域 COUNT 的值由 1 减到 0 ,则中断请求标志保持不变。这样 , 对一个完成

的 PEC 模块传送 ,可得到普通的 CP U 中断响应。

注意 :通过软件修改中断请求标志的效果和通过硬件设置或清除的效果是一样的。

(2 ) 中断优先级和组优先级

位域 ILVL 的 4 位用来指定服务请求的优先级 ,对同时发生的请求作出仲裁。 ILVL

的数值越大 ,则其优先级越高。因此 , 0000B 是最低的优先级 ,而 1111B最高。

当在同一优先级上有超过一个中断请求同时被激活时 ,其各自位域 GLVL 的值用作

第二级仲裁 ,来选择一个请求服务。组优先级也是随 GLVL 的数值升高而升高的。所以

00B 是最低的组优先级 ,而 11B是最高的。

注意 :对所有编程为同一优先级的已使能的中断请求源 ,必须编程为不同的组优先

级。否则会产生不正确的中断向量。

进入中断服务程序时 ,将原有的 PSW 值存入堆栈之后 ,再把仲裁中获胜的中断源的

优先级复制到 PSW 的 ILVL 域中 ,这一优先级也应超过当前 CPU 的优先级。

C164CI 的中断系统允许不同优先级的中断处理程序嵌套 ,最多 15 个 (级别 0 不能用

于仲裁 )。

优先级设定为 15 或 14(即 ILVL = 111xB)的中断请求由 PEC处理 ,若相关的寄存器

PECC 的域 COUNT 的值为“0”,则由普通的中断进行处理。优先级为 13 到 1 的中断请

求由普通中断处理。

注意 :优先级 0000B 是 CP U 的缺省优先级。因此 ,优先级为 0 的请求永远不会被受

理 ,因为它不能使 CP U 中断。但是 ,激活一个 0000B 级的中断请求 ,可以终止 C164CI 的

空闲状态 ,使 CP U 重新工作。

由 PEC 处理的中断请求 ,相关的 PEC 通道号由各自的 ILVL 的最低位和 GLVL 中

的 2 位决定 (见图 2-13 )。所以当一个源的优先级设为 15 ( ILVL = 1111B)时 , 就选择了

PEC通道 4~7;若优先级设为 14 ( ILVL = 0000B) ,则选择 PEC 通道 0~3。具体的 PEC

通道号再由组优先级域 GLVL 确定。

图 2-13 优先级和 PEC信道

同时发生的对 PEC 通道的请求 ,根据 PEC 通道号划分优先级。通道 0 的优先级最

低 ,而通道 7 的优先级最高。

注意 :申请 PEC服务的所有源必须设定到不同的 PEC 通道。否则会激活不正确的

PEC通道。

表 2-8 中给出了对中断控制寄存器进行编程时 ,所执行操作的几个例子。

第 2 章 体 系 结 构

Page 69: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

58

表 2-8 中断控制寄存器的设置

优 先 级 服 务 类 型

ILVL GLVL COUNT = 00 H COUN T≠00 H

1111 11 CPU 中断

15 级 ,组优先级 3

PEC服务

通道 7

1111 10 CPU 中断

15 级 ,组优先级 2

PEC服务

通道 6

1110 10 CPU 中断

14 级 ,组优先级 2

PEC服务

通道 2

1101 10 CPU 中断

13 级 ,组优先级 2

CPU 中断

13 级 ,组优先级 2

0001 11 CPU 中断

1 级 ,组优先级 3

CPU 中断

1级 ,组优先级 3

0001 00 CPU 中断

1 级 ,组优先级 0

CPU 中断

1级 ,组优先级 0

0000 XX 不服务 ! 不服务 !

注 :所有优先级为 1~13 的请求 ,不能启动 PE C传送。它们总是由中断服务程序处理 ,与寄存器 PE CC 无关 ,也

不检查域 CO UN T。

2 . PSW 的中断控制功能

处理器状态字 ( PSW)从功能上分为两个部分 : PSW 的低位字节主要说明 CP U 的算

术运算状态 , PSW 的高位字节控制 C164CI的中断系统和用于外部总线接口的仲裁机制。

注意 :通过修改寄存器 PSW 对中断请求使能或禁止时 ,必须考虑流水线效应。

位 功 能

N ,C , V , Z, E ,

MULIP, USR0

CPU 状态标志 (见 2 .3“中央处理器”一节)

规定 CPU 的当前状态 ( AL U ,乘法单元 )

ILVL

CPU 优先级

为 CPU 定义当前的优先级

F H : 最高优先级

0 H : 最低优先级

IEN

总中断允许位 (总的中断请求使能/ 禁止 )

0 : 中断请求禁止

1 : 中断请求使能

亿恒 C164CI 16 位单片机

Page 70: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

59

(1 ) CP U 优先级 ILVL

ILVL 定义了 CPU 当前操作的优先级。这个位域反映了正在执行的程序的优先级。

在进入一个中断服务程序时 ,这个位域将设成该中断请求的优先级 ,先前的 PSW 存入系

统堆栈。CP U的优先级决定了能受理的最小的中断优先级 ,任何和它级别相同或比它低

的中断请求都不会被接受。

可以通过软件调整当前 CPU 的优先级 ,从而控制能得到响应的中断源。

PEC传送并不真的使 CP U 中断 ,只不过是“抽取”单个周期。因此 , PEC 服务不影响

PSW 中的 ILVL域。

硬件陷阱将 CP U 的级别转换成最高级 (即 15 级 ) ,因此 ,执行意外的陷阱服务程序时

将不响应中断或 PEC 请求。

注意 : TRA P指令不改变 CP U 的级别 , 因此 ,软件调用的陷阱服务程序可被优先级

更高的中断请求打断。

(2 ) 总中断允许位 IEN

该位对 CPU 接受的 PEC操作和中断进行总的使能或禁止。如 IEN 清除为“0”,则

CP U不接受新的中断请求。这时已经进入流水线的请求将继续执行。当 IEN 设置为

“1”时 ,已经被各自的控制寄存器的中断使能位激活的所有中断源将处于使能状态。

注意 :陷阱是不可屏蔽的 ,因此不受位 IEN 的影响。

3 . PEC通道工作的控制

C164CI 周边事件控制器 ( PEC )提供 8 个 PEC 服务通道 ,它们用来在段 0 (数据页

3~0 )中的两个单元之间传送一个字节或一个字 ,这是可能实现的最快的中断响应。在很

多情况下 ,这种服务对有关的周边电路请求 (如串行通道等 )已足够了。各个通道是由专

用的 PEC 通道计数/ 控制寄存器 ( PECCx )以及数据传送的源指针 (SRCPx )和目的指针

(DSTPx)控制。

位 功 能

COUNTPEC 传送计数器

计算 PEC传送次数 ,并对通道的动作有影响 (见表 2-10 )

BW T

字节/ 字传送选择位

0 : 传送一个字

1 : 传送一个字节

I NC

增量控制域 (修改 SRCPx或 DSTPx)

00: 不修改指针

01: DST Px加 1 或 2 (由位 BWT 决定 )

10 : SRCPx 加 1 或 2 (由位 BW T 决定 )

11 : 保留 ,不使用此组合(由硬件改为 10)

第 2 章 体 系 结 构

Page 71: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

60

寄存器 PECC 控制有关 PEC 通道的工作。其地址如表 2-9 所示。

表 2-9 PECC控制寄存器的地址

寄存器 地 址 寄存器所在空间 寄存器 地 址 寄存器所在空间

PECC0 FEC0 H/ 60 H SFR PECC4 FEC8 H/ 64 H SFR

PECC1 FEC2 H/ 61 H SFR PECC5 FECAH/ 65 H SFR

PECC2 FEC4 H/ 62 H SFR PECC6 FECCH/ 66 H SFR

PECC3 FEC6 H/ 63 H SFR PECC7 FECEH/ 67 H SFR

(1 ) 字节/ 字传送选择位 BW T

该位选择在 PEC 服务周期内是传送一个字节或是一个字 ,并控制传送数据时指针的

增量幅度。

(2 ) 增量控制域 INC

该位控制在 PEC 传送后 PEC指针的增加情况。两个指针不能同时增加。如果指针

不修改 ( INC =“00”) ,相应通道将总是从同一个源向同一个目标传送数据。

注意 :保留的组合“11”由硬件改为“10”。但最好不要使用“11”组合。

(3 ) PEC 传送计数器 COUNT

计数器 COUNT 控制相应的 PEC 通道的工作情况。通道激活时 , 对应的计数器

COUN T 工作。COUN T 可用来指定 PEC 传送的次数 ,或无限次数的传送 , 或完全不作

PEC服务。

表 2-10 列出了 COUNT 域本身、中断请求标志 IR 和 PEC 通道的工作与 COUNT 原

先内容的关系。

表2-10 计数域 COUNT的作用

原先的 COUNT 修改后的 COUNT PEC服务后的 IR PEC通道的动作和注释

FFH FFH “0”传送一个字或字节

无限次传送模式 ,即 COUN T不修改

FE H~02 H FDH~01 H “0” 传送一个字或字节 , COUN T减小 1

01 H 00 H “1”传送一个字或字节

保留请求标志设置 ,触发另一个请求

00 H 00 H (“1”) 激活中断服务程序 ,而不是 PEC通道

PEC传送计数器用来指定对相应的 PEC 通道请求的服务次数 ,并在 COUNT 值达

到 00 H 时 ,激活与优先级有关的中断服务程序。每次 PEC 传送后 , COUNT 域的值减 1 ,

且请求标志清零 ,表示请求已得到服务。

无限次传送由 COUNT 域的值 FF H 选择。在这种情况下 , COUN T 的值不改变 ,相

应的 PEC 通道为任何一个请求服务 ,直到它被再次禁止。

若传送后 COUNT 的值从 01 H 减为 00 H ,则请求标志不清零 ,将由同一个源产生另

一种请求。当 COUNT 所含值已经是 00 H 时 ,相应的 PEC 通道保持空闲状态 ,用相关的

亿恒 C164CI 16 位单片机

Page 72: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

61

中断服务程序激活代替 ,这样就可对 15 或 14 级的请求是由 PEC来处理还是由中断服务

程序来处理进行选择。

注意 :只有 PEC服务的优先级高于 CPU 的优先级 ,传送才会被执行。即在 CPU 执

行 14 级的操作时 ,只有 PEC 通道 4~7 才被处理。所有已使能和编程为 PEC 服务的中

断源应使用不同的通道 ,否则对所有同时发生的请求将只执行一次传送。当 COUNT 降

到 00 H ,且 CPU 被中断时 ,将会产生不正确的中断向量。

源指针和目的指针指定数据传送的起始位置。一对指针 (SRCPx 和 DSTPx)和 PEC

的 8 个通道中的一个相联系。这些指针不在特定的 SFR 中 ,而是映射到 C164CI 的内部

RAM区 ,恰好在可位操作地址空间的下方 (见图 2-14 )。

DSTP7

SRCP7

DSTP6

SRCP6

DSTP5

SRCP5

DSTP4

SRCP4

00′FCFEH

00′FCFCH

00′FCFAH

00′FCF8 H

00′FCF6 H

00′FCF4 H

00′FCF2 H

00′FCF0 H

DST P3

SRCP3

DST P2

SRCP2

DST P1

SRCP1

DST P0

SRCP0

00′FCE EH

00′FCECH

00′FCEAH

00′FCE8H

00′FCE6H

00′FCE4H

00′FCE2H

00′FCE0H

图 2-14 PEC 指针到内部 RAM 的映射

PEC数据传送不使用数据页指针 DPP0~DPP3。PEC 源指针和目的指针用作段 0

内的 16 位段内地址 ,因此 ,数据可以在最先的 4 个数据页 0~3 中的任意两个地址之间传

送。未被激活的 PEC 通道的指针所在单元可用于一般的数据存储。只有已被请求的指

针才占据 RAM 的位置。

注意 :如果选择由一个特定 PEC通道作字数据传送 (即 BWT =“0”) ,相应的源指针

和目的指针都必须是指向偶字节边界的有效字地址。否则使用该通道时 ,将会调用非法

的字访问陷阱服务。

4 .中断和 PEC服务请求的排序

任何源产生的中断和 PEC 服务请求可以被激活、进行判断和处理 (如果选中的话 ) ,

也可以被禁止 ,这时将忽略请求 ,不进行处理。

对中断请求的使能和禁止可通过 3 种机制完成 :

(1 ) 控制位允许对每一个独立源做“开”或“关”的切换 ,从而控制请求的产生。控制

位 ( xxIE)位于相应的中断控制寄存器里。所有中断请求可由寄存器 PSW 中的位 IEN 进

行使能或禁止。这个控制位是决定是否接受任一中断源请求的“总开关”。

第 2 章 体 系 结 构

Page 73: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

62

在判定一个特定的请求时 ,其相应源的使能位和总的使能位都必须置位。

(2 ) 优先级域自动选择将得到响应的某个组的中断请求 ,不考虑所有其他的请求。把

在判定中获胜的源的优先级和 CPU 当前的优先级进行比较 ,只在其优先级比 CPU 当前的

优先级高的时候 ,才会得到服务。通过软件将 CPU 的优先级改为某特定值 ,这时将拒绝所

有优先级与此值相同或更低的请求。等级为 0的中断源将被禁止 ,永远得不到服务。

(3 ) ATOMIC指令和扩展寻址指令自动禁止其后 1~4 条指令执行期间的所有中断

请求。这可用于对信号管理等场合 ,并且在不能割断的指令序列后 ,不需要重新对中断系

统使能。

对各种中断还可划分成中断类进行管理。一个中断类包括同样重要的若干个中断

源 ,即从系统的角度来讲 , 它们具有同样的优先级。同一类的中断不能相互打断。

C164CI 有两种特性来支持这个功能 :

(1 ) 最多为 4 个成员的中断类 ,使用相同的中断优先级 ( ILVL) ,并对每个成员分配

一个专用的组优先级 ( GLVL)。这个功能由中断控制器自动生成和管理。

(2 ) 超过 4 个成员的中断类 ,可使用几个邻接的中断优先级 ( ILVL )和相应的组优先

级 (每个 ILVL 对应 4 个 GLVL)组成。该类中的每一个中断处理程序将把 CP U 的级别

设为类中的最高中断优先级 ,这时拒绝所有来自相同或更低级别的请求 ,即同类的请求不

再被接受。

表 2-11 所示的例子建立了 3 个中断类 ,每类覆盖了 2 个或 3 个中断优先级 ,与类的

成员数有关。表中×表示有此中断。一个 6 级的中断会将当前的 CP U 级别改到类 2 中

最高的中断优先级 ( ILVL = 8) ,这就禁止了所有类 2 中其他的中断源 ,但类 1 的中断请求

或 PEC 请求仍能得到服务。

表 2-11 软件控制的中断类举例

ILVL

(优先级 )

GLVL

3 2 1 0说 明

15

14最多为 8 个通道的 PEC服务

13

12 × × × ×

11 ×

中断类 1

2 个级别上的 5 个源

10

9

8 × × × ×

7 × × × ×

6 ×

中断类 2

3 个级别上的 9 个源

5 × × × ×

4 ×

中断类 3

2 个级别上的 5 个源

3

2

1

0 没有服务

亿恒 C164CI 16 位单片机

Page 74: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

63

19 个中断源 (PEC请求除外 )分到 3 个优先级类 ,而不是像硬件支持的那样分到 7 个

不同的级。

5 .中断服务的状态储存

在判定的中断请求得到真实的服务前 , 当前的工作状态会自动存储到系统堆栈中。

将 CPU 状态 ( PSW )以及中断任务执行的位置保存起来 ,从中断服务程序返回后 ,它们将

恢复。返回地址由指令指针 ( IP )指定。在分段模式下 ,返回地址要与码段指针 ( CSP)一

起指定。寄存器 SYSCON 中的位 SGTDIS用来控制返回地址如何存储。

系统堆栈首先接收 PSW, 然后是 IP (不分段时 )或 CSP 以及 IP (分段时 ) , 参见图

2-15。如果不分段 ,可使系统堆栈得到最充分的利用。

图 2-15 存在系统堆栈内的状态信息

( a ) 进入中断 的系统堆栈 ; ( b) 进入中断后的系统堆栈 (不分段 ) ;

(c ) 进入中断后的系统堆栈 (分段 )

CP U优先级域 (PSW 中的 ILVL)由将被处理的中断请求的优先级更新 ,这时 , CP U

在新的优先级别下工作。如果请求得到响应时正在执行乘法或除法 ,寄存器 PSW 中的

位 MULIP设为“1”。这种情况下 ,存在堆栈中的返回地址不再是指令流程中的下一条指

令 ,而是乘法或除法指令本身 ,因为这个指令被中断了 ,在从服务程序返回后要继续完成。

得到服务的源 ,其中断请求标志清零 , IP用请求源对应的向量加载 (在分段情况下对

CSP 清零 )。服务程序的第一个指令从相应的向量地址提取 ,由此进入服务程序。服务

程序不受数据页指针和上下文指针影响。

当中断服务程序结束时 (执行 RE TI) ,状态信息考虑到位 SGTDIS 的值 ,按相反的顺

序从系统堆栈中弹出。

上下文切换可以简化中断时状态信息的存储。

中断服务程序通常会把它用到的所有寄存器都存入堆栈 ,并在返回前恢复它们。一

个程序用到的寄存器越多 ,花在存储和恢复上的时间就越多。C164CI允许用一条指令就

切换 CPU 的整个一组寄存器 ( GPR ) ,使服务程序可以在它自己的独立的环境下执行。

指令“SCXT CP, # New_Bank”将上下文指针 ( CP)的内容压入系统堆栈 ,并对 CP 加

载立即数“New_Bank”,选取一个新的寄存器组。这时服务程序将使用它自己的寄存器。

这个寄存器组在处理程序结束时是保留的 ,即其内容在下次调用时仍有效。

在中断返回 ( R ETI)前 ,原有的 CP从系统堆栈中弹出 ,恢复原有的寄存器组。

注意 : SCXT 指令后的第一条指令不能使用 GPR。

中断程序所使用的资源最后必须存储和恢复 ,例如数据页指针 DPP 和 MUL/ DIV 单

第 2 章 体 系 结 构

Page 75: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

64

元的寄存器。

2 .3 .3 中断的响应

1 .中断响应时间

中断响应时间定义为从中断源的中断请求标志置位到由中断向量地址提取第一条指

令 ( I1)之间的时间 (见图 2-16 )。基本的 C164CI 中断响应时间为 3 个指令周期。

图 2-16 中断响应时间的流水线图

包括指令 N (中断请求标志在该指令期间被设置 )在内的所有流水线的指令 ,在进入

服务程序前都要结束。因此 ,这些指令的实际执行时间 (如等待状态 )就会影响中断响应

时间。

图中相应的中断请求标志在周期 1 中置“1”(提取指令 N )。该中断源在周期 2 内进

行的优先权比较中获胜。在周期 3 内 , TRA P指令被插入到流水线的译码阶段 ,替代指令

N + 1 ,并对源的中断请求标志清“0”。周期 4 完成插入的 T RAP 指令 (如果是分段模式 ,

保存 PSW, IP和 CSP) ,并从相应的向量地址提取第一个指令 I1。

所有在中断请求标志设置后进入流水线的指令 N + 1 , N + 2 ,将在从中断服务程序返

回后再执行。

最小的中断响应时间是 5 个状态时间。这时要求程序是在内部代码存储区执行 ,不

去读外部操作数 ,并且是在一个指令周期的最后一个状态设置中断请求标志。若中断请

求标志在一个指令周期的第一个状态设置 ,则最小的中断响应时间为 6 个状态时间。

若进入服务程序前在流水线内的各个指令 (包括指令 N )执行时间延长 ,则中断响应

时间会随之增加。这种情况有 :

(1 ) 当在一对指令 N - 2/ N - 1 或 N - 1/ N 之间发生内部保持时 ,或指令 N 为直接

写入 PSW 或 SP时 ,最小的中断响应时间将延长 1 个状态时间。

(2 ) 当指令 N 是从内部代码存储区读取一个操作数 ,或当指令 N 是一个调用指令、

返回指令、陷阱指令或 MOV Rn , [ Rm + # dat a16] 指令时 ,最小中断响应时间在执行内

部代码存储区程序时将增加 2 个状态时间。

(3 ) 如果指令 N 是读 PSW,且指令 N - 1 用到条件标志 ,则中断响应时间在执行内

部代码存储区程序时可能增加 2 个状态时间。

在执行内部代码存储区程序时 ,最差情况下中断响应时间可增加 12 个状态时间。

亿恒 C164CI 16 位单片机

Page 76: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

65

由于流水线与访问优先权有关 ,任何关于外部地址的操作都会增加中断响应时间。

因此对下面的情况必须加以考虑 :

� 从外部地址提取指令。

� 从外部地址读操作数。

� 结果写回到外部地址。

考虑到指令、源操作数和目的操作数的所处位置 ,以及可能有的多种组合 ,只有在存

取发生冲突时才导致延时。下面用几个例子说明这种延时。

(1 ) 在含有外部访问时 , 中断响应时间将会出现最差的情况是 , 当指令 N , N + 1 ,

N + 2 的执行不在外部存储区 ,指令 N - 1 和 N 要求外部操作数的读入 ,指令 N - 3 到 N

要写回一个外部操作数 ,而且中断向量是指向一个外部地址。这种情况下 ,中断响应时间

为执行 9 个字的总线访问时间 ,因为在流水线中上述所有指令的写、提取和读请求完成之

前 ,指令 I1 不能通过外部总线提取。

(2 ) 当上例的中断向量指向内部代码存储区时 ,中断响应时间为 7 个字的总线访问

时间再加 2 个状态时间 ,因为从内部代码存储区的指令 I1 的提取可早些开始。

(3 ) 当指令 N, N + 1 和 N + 2 的执行在外部存储区 ,且中断向量也指向外部地址 ,但

从指令 N - 3 到 N 的所有操作数都在内部存储区时 ,中断响应时间是执行 3 个字的总线

访问时间。

(4 ) 当上例的中断向量指向内部代码存储区时 ,中断响应时间是 1 个字的总线访问

时间加 4 个状态时间。

在通过执行 RETI 指令结束中断处理程序后 ,如果还有另一个中断被挂起 ,则不会立

即进入下一个中断服务程序 ,至少要等到被中断的程序执行 2 个指令周期以后。在多数

情况下 ,这时需要执行 2 个指令。如果 RE TI指令后的第一个指令是分支指令 (不是从高

速缓存中读取 ) ,或它从内部代码存储区读操作数 ,或在内部 RAM 之外执行 ,则典型情况

是只执行一个指令。

注意 :下文中的总线访问时间包括外部总线周期中所有可能发生的延时。

2 . PEC响应时间

PEC响应时间定义为从一个中断源的中断请求标志置位到 PEC 数据传送开始的时

间 (见图 2-17 )。基本的 C164CI PEC 响应时间为 2 个指令周期。

图中相应的请求标志在周期 1 中被置为“1”(指令 N 的提取 )。在周期 2 中 ,该源在

优先权判定中获胜。在周期 3 中 ,一个 PEC 传送“指令”插入流水线译码阶段 ,挂起指令

N + 1 ,并对源的中断请求标志清零。周期 4 结束插入的 PEC 传送 ,并恢复指令 N + 1 的

执行。

在设置中断请求标志后进入流水线的所有指令 N + 1 , N + 2 ,将在 PEC 数据传送后

执行。

注意 :当指令 N 读任何 PEC 控制寄存器 PECC7~PECC0 ,且有一个 PEC 请求赢得

当前周期的优先权 ,就重复这一周期 ,并在一个周期后开始 PEC 数据传送。

最小 PEC 响应时间是 3 个状态时间。这时要求程序从内部代码存储区执行 ,不用读

第 2 章 体 系 结 构

Page 77: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

66

图 2-17 PEC 响应时间的流水线图

外部的操作数 ,并且是在指令周期的最后一个状态设置中断请求标志。当中断请求标志

是在指令周期的第一个状态设置时 ,对该种情况的最小 PEC响应时间为 4 个状态时间。

PEC响应时间会因在数据开始传送前所有在流水线内执行的指令 (包括指令 N )的

延时而增加。下面这几种情况所发生的延时与中断时类似。

(1 ) 当在一对指令 N - 2/ N - 1 或 N - 1/ N 之间发生内部保持时 ,最小 PEC 响应时

间对每一种情况均延长 1 个状态时间。

(2 ) 当指令 N 从内部代码存储区读一个操作数 ,或指令 N 是一个调用指令、返回指

令、陷阱指令或 MOV Rn , [ Rm + # dat a16] 指令时 ,在内部代码存储区程序执行时 ,最小

PEC响应时间可能会增加 2 个状态时间。

(3 ) 如果指令 N 为读 PSW,且指令 N - 1 用到条件标志时 , PEC 响应时间可能会增

加 2 个状态时间。

程序在内部代码存储区执行时 ,中断响应时间在最差情况下可增加到 9 个状态时间。

由于流水线工作与访问的优先权有关 ,任何指向外部地址的操作都会增加 PEC 响应

时间。因此对下列情况必须加以考虑 :

� 从外部地址提取指令。

� 从外部地址读操作数。

� 结果写回到外部地址。

考虑到指令、源操作数和目的操作数所处的位置 ,以及存在有多种组合 ,只有在存取

发生冲突时才导致延时。下面用 2 个例子说明这种延时。

(1 ) 包含有外部存取时 , PEC响应时间的最差情况发生在指令 N 和 N + 1 不在外部

存储区执行 ,或指令 N - 1 和 N 需要外部操作数的读入 ,或指令 N - 3 , N - 2 和 N - 1 写

回外部操作数。这些情况下 , PEC 响应时间是执行 7 个字的总线访问时间。

( 2 ) 当指令 N 和 N + 1 不在外部存储区执行 ,但从指令 N - 3 到 N - 1 的所有操作数

都在内部存储区时 , PEC 响应时间是执行 1 个字的总线访问时间加 2 个状态时间。

一旦 PEC 的服务请求得到 CP U响应 ,下一条指令的执行就会延时 2 个状态时间 ,再

加上从内部代码存储区或外部存储区获取源操作数以及在外部程序情况下通过外部总线

写到目的操作数所需的时间。

注意 : 下文中总线访问时间包括外部总线周期内可能发生的所有延时。

亿恒 C164CI 16 位单片机

Page 78: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

67

3 .中断节点共享

如果几个模块的请求互斥 ,但不会同时发生或者是发生速率很低 ,则一个中断节点可

以由几个请求共享。在这种情况下 ,如果有多于一个请求使能 ,中断处理器将首先去确定

请求源。对低速率请求情况 ,系统有足够的时间 ,响应中断不成问题。

节点共享通过子节点中断控制寄存器 ISNC来控制。该寄存器为每个被支持的请求

源提供单独的请求标志和使能位。用来仲裁的中断优先级由节点控制寄存器 (⋯ IC )确

定。表 2-12 示出了各子节点控制位分配。

位 功 能

xxIR

源 xx的中断请求标志

0 :没有挂起的源 xx的中断请求

1 :源 xx 已提出中断请求

xxIE

源 xx的中断使能控制位

0 :源 xx 的中断请求禁止

1 :源 xx 的中断请求使能

表 2-12 子节点控制位分配

位 中 断 源 相 关 节 点

15~4 保留 保留

3/ 2 PLL / OWD XP3IC

1/ 0 RTC XP3IC

注意 :为了确保与其他衍生的应用软件兼容 ,不应去设置寄存器 ISNC中的保留位。

2 .3 .4 外部中断

虽然 C164CI 没有专用的 IN TR 输入引脚 ,但一些 I/ O口的引脚可用作中断输入 ,从

而对很多外部的异步事件作出反应。中断功能可以是与引脚的主功能相结合 ,也可以是

使用其替换功能。

中断信号可连接到 :

� EX3IN ~EX0IN 快速的外部中断输入引脚。

� CC27IO ~CC24IO CAPCOM单元的捕获输入口。

� CC19IO ~CC16IO CAPCOM单元的捕获输入/ 比较输出口。

第 2 章 体 系 结 构

Page 79: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

68

� T4IN , T2IN 定时器输入引脚。

表 2-13 中列出了可用作外部中断输入的引脚。

表 2-13 用作外部中断输入的引脚

端 口 引 脚 原 始 功 能 控 制 寄 存 器

P1 H .3~0/ EX3~0IN 快速外部中断输入脚 EXICON

P1 H .7~4/ CC27~24IO 寄存器 CAPCOM 捕捉输入端 27~24 CC27~CC24

P8 .3~0/ CC19~16IO 寄存器 CAPCOM 捕捉输入端 19~16 CC19~CC16

P5 .6/ T2IN 辅助定时器 T2 输入脚 T2CON

P5 .7/ T4IN 辅助定时器 T4 输入脚 T4CON

加在这些引脚上的上升沿、下降沿或上升/ 下降沿 , 可引起一个中断或 PEC 服务请

求。边沿的选择在与端口引脚对应的周边电路控制寄存器中进行。周边电路必须按指定

的工作模式编程 ,允许用外部信号产生中断。中断请求的优先级由各个中断源的中断控

制寄存器决定 ,该源的中断向量用于对外部中断的请求服务。

注意 :为了使用上列任何引脚作为中断输入 ,必须设定其端口方向控制寄存器 DPx

的方向控制位 DPx .y ,将它切换到输入模式。

当端口引脚 CCxIO 用作外部中断输入脚时 ,对应的捕获/ 比较寄存器的控制寄存器

CCx 的位域 CCMODx 必须选为捕获方式。当 CCMODx设为 001B 时 ,寄存器 CCxIC 中

的中断请求标志 CCxIR 将由引脚 CCxIO 的上升沿触发。如果 CCMODx 设为 010B,则

一个下降沿触发将对中断请求标志置位。如果 CCMODx = 011B,无论上升沿和下降沿 ,

都可对中断请求标志置位。在所有 3 种情况中 ,不论分配给 CA PCOM 的定时器是否运

行 ,定时器的内容将被锁存到捕获寄存器 CCx 中。当中断使能位 CCxIE 置位时 , 一个

PEC请求或 CCxINT 中断请求将产生。

当 GPT1 电路中的辅助定时器 T2 或 T4 设定为捕获方式时 ,引脚 T2IN 或 T4IN 可

用作外部中断输入脚。这种模式可通过设定控制寄存器 T2CON 或 T4CON 中断控制域

T2M 或 T4M 为“101B”来选择。外部输入信号能起作用的沿是由域 T2I 或 T4I 来决定

的。这些域设为“x01B”时 ,寄存器 T2IC 或 T4IC 中的中断请求标志 T2IR 或 T4IR 分别

由引脚 T2IN或 T4IN 的外触发上升沿设置。如果 T2I 或 T4I 设为“ x10B”时 ,将用外触

发的下降沿设置相应的请求标志。当 T2I 或 T4I 设为“ x11B”时 ,外触发的上升沿或下降

沿都能设置相应的请求标志。在这 3 种情况中 , 核心定时器 T3 的内容将在引脚 T2 或

T4 跳变时被辅助定时器 T2 或 T4 捕获。当中断使能位 T2IE 或 T4IE 置位时 ,将产生

PEC请求、T2INT 或 T4INT 的中断请求。

注意 :不可屏蔽的中断输入脚NMI和复位输入RSTIN为 CP U 提供了另外一种响应

外部输入信号的可能。NMI和RSTIN是专用的输入脚 ,可引起硬件陷阱。

1 .快速外部中断

每 8 个 CPU 时钟周期将对用于外部中断的输入脚进行一次采样 ,即对外部事件每 8

亿恒 C164CI 16 位单片机

Page 80: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

69

个状态时间扫描和检测一遍。C164CI 有 4 个中断输入是在每个 CPU 时钟周期采样一次

的 ,其上的外部事件可以比一般的中断输入更快地被捕捉到。

端口 P1H 的低 4 位引脚 ( P1H .3~P1H .0 )可以分别对这种快速中断模式及选择触

发沿的类型 (上升沿、下降沿或任何跳变 )进行编程。由外部中断控制寄存器 EXICON 控

制这 4 个引脚的特性。

位 功 能

EXIxES

外部中断 x沿选择域 ( x = 7~0)

00: 快速外部中断禁止 ,标准模式

01: 上升沿中断

10: 下降沿中断

11: 任一种沿中断 (上升沿或下降沿 )

注意 :快速外部中断输入每个 CP U 时钟周期采样一次。但是中断请求的仲裁和处

理是每 4 个 CPU 时钟周期执行一次。

表 2-14 中列出的中断控制寄存器 ( CC8IC~CC11IC)用来控制 C164CI 的快速外部中

断。快速外部中断节点和向量按 C167 的 CA PCOM 通道 CC8~CC11 命名 ,所以中断节

点取相同的名字。

注意 :对控制域的解释请参见一般的中断控制寄存器的说明。

表 2-14 快速外部中断控制寄存器的地址

寄 存 器 地 址 外 部 中 断

CC8IC FF88 H/ C4 H EX0I N

CC9IC FF8 AH/ C5 H EX1I N

CC10IC FF8CH/ C6 H EX2I N

CC11IC FF8EH/ C7 H EX3I N

2 .外部中断源控制

快速外部中断 (由寄存器 EXICON 控制 )的中断源可以来自相关的引脚 EXxIN ,也

可以来自一个替换的源。这是通过寄存器 EXISEL 选取的。

第 2 章 体 系 结 构

Page 81: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

70

替换输入源工作可用来检测被禁止接口的引脚上所发生的跳变。用此触发可重新激

活相应的接口 ,并响应检测操作。

位 功 能

EXI0SS

外部中断 0 源选择域

00: 从相关的 EXxIN 脚输入

01: 从替代引脚输入

10: 用 EXxIN 脚和替代引脚的“或”输入

11: 用 EXxIN 脚和替代引脚的“与”输入

3 .休眠模式时外部中断

休眠模式期间 ,所有周边电路的时钟信号不工作 ,也禁止对快速外部中断作标准的沿

检测。为了唤醒它开始工作 ,必须识别这些中断输入的跳变。因此 ,休眠模式期间对快速

的外中断 ( EXxIN)激活有一种特殊的沿检测 , 它不需要时钟信号 ,可在休眠模式工作。

为此配备了一个模拟的噪声滤波器 ,它用来抑制由噪声产生的 10ns 以下的尖峰。最小持

续时间为 100ns 的脉冲才能识别到 ,产生中断请求。

滤波器使外部唤醒信号延后了约 100ns 才得到识别 ,因此 ,尖峰抑制保证了噪声环境

中休眠/ 唤醒机制的工作较为安全和可靠。

图 2-18 输入噪声滤波器的工作情况

2 .3 .5 陷阱功能

陷阱中止当前的操作 ,与标准中断类似。不过 ,陷阱功能绕过中断系统的优先级判别

过程 ,用于需要系统立即响应的场合。陷阱功能是不可屏蔽的 ,并对任何级别的中断请求

都有优先权。

1 .陷阱类别

C164CI 提供了两种不同的陷阱机制。硬件陷阱由程序执行中发生的事件激活 (如非

亿恒 C164CI 16 位单片机

Page 82: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

71

法的访问或未定义的操作数 )。软件陷阱通过当前操作进程内的指令启动。

(1 ) 软件陷阱

T RAP 指令用于通过软件调用一个中断处理程序。陷阱指令的操作数域所指定的

陷阱号决定了分支转移的向量地址 ,它位于从 000000H~0001FCH 的地址范围内。

执行 T RA P指令和执行具有相同向量地址的中断的作用相似。PSW , CSP (分段模

式中 )及 IP压入内部系统堆栈 ,跳转到由向量地址所指定的位置。若分段使能 ,陷阱执行

时 ,用于陷阱处理程序的 CSP设为代码段 0。T RAP 指令不影响任何中断请求标志。由

T RAP 指令调用的中断服务程序必须用指令 RETI(从中断返回 )结束 ,以保证操作正确。

注意 : TRA P指令不修改寄存器 PSW 中的 CPU 优先级别 ,所以服务程序是在调用

它时的那个优先级上工作。因此 ,与硬件陷阱不同 ,从 T RAP 指令进入的服务程序可以

被由硬件触发的其他陷阱或更高优先级的中断中止。

(2 ) 硬件陷阱

硬件陷阱是由程序运行中的特定系统状态或错误造成的 (不能在汇编阶段被识别 )。

硬件陷阱也可以有意地进行触发 , 例如可用产生非法操作代码来模拟附加的指令。

C164CI 区分 8 种不同的硬件陷阱功能。当检测到一个硬件陷阱条件时 ,按照陷阱条件 ,

CP U分支转移到对应的陷阱向量地址。在进入陷阱处理程序前 ,由陷阱条件决定引起陷

阱的指令是执行完还是取消 (即它对系统状态无影响 )。

硬件陷阱是不可屏蔽的 ,对其他任何 CP U 操作都有优先权。如果几个硬件陷阱条

件在同一指令周期内被检测到 ,具有最高优先级的陷阱被处理 (参见表 2-7 )。

PSW , CSP(在分段模式下 )和 IP被压入内部系统堆栈 ,寄存器 PSW 中的 CP U 优先

级被设为最高级 (即 15 级 ) ,以禁止所有的中断。如果分段模式使能 , CSP 设到代码段 0 ,

陷阱服务程序必须用 RETI 指令结束。

C164CI 的 8 个硬件陷阱功能可分为两类 , A 类陷阱和 B类陷阱。

A 类陷阱包括 :

� 外部不可屏蔽中断 ( NMI)。

� 堆栈上溢。

� 堆栈下溢。

这些陷阱共享同一个陷阱优先级 ,但是向量地址不同。

B 类陷阱包括 :

� 未定义的操作数。

� 保护错误。

� 非法字操作数访问。

� 非法指令访问。

� 非法外部总线访问。

这些陷阱共享同一个陷阱优先级 ,但是向量地址不同。

2 .陷阱标志寄存器

可位操作的陷阱标志寄存器 ( TFR)使陷阱处理程序能识别出引起意外的陷阱种类。

第 2 章 体 系 结 构

Page 83: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

72

每个陷阱功能都由一个独立的请求标志指示。当硬件陷阱发生时 ,寄存器 TFR 中相应的

请求标志设为“1”。

位 功 能

ILLBUS非法外部总线访问标志

试图在无外部总线定义时进行外部访问

ILLINA非法指令访问标志

试图将分支指向奇地址

ILLOPA非法字操作数访问标志

试图对奇地址进行字操作数访问 (读或写 )

PRT FLT保护出错标志

检测到受保护的指令用了非法格式

UNDOPC未定义的操作码标志

当前译码的指令是 C164CI无效的操作码

STKUF堆栈下溢标志

当前堆栈指针值超过寄存器 STKUN 的内容

STKOF堆栈上溢标志

当前堆栈指针值小于寄存器 STKOV 的内容

NMI不可屏蔽中断标志

在引脚NMI上检测到一个负跳变 (下降沿 )

注意 :陷阱处理程序必须清除各自的陷阱标志 ,否则会在退出处理程序后申请新的陷

阱。用软件设置陷阱请求标志和用硬件设置的效果是相同。

3 .陷阱的优先级

复位功能 (硬件、软件、监视定时器 )可看成一种陷阱。复位功能具有最高的系统优先

级 (陷阱优先级Ⅲ )。

A 类陷阱具有次高的优先级 (陷阱优先级Ⅱ ) , B 类陷阱是第三级 ,所以 A 类陷阱可

以打断 B类陷阱。如果同时发生超过一个的 A类陷阱 ,在内部区分它们的优先级。NMI

陷阱具有最高的优先级 ,而堆栈下溢陷阱的优先级最低。

所有的 B 类陷阱具有相同的陷阱优先级 (陷阱优先级Ⅰ )。如果几个 B 类陷阱同时

发生 ,寄存器 TFR 中相应的标志置位 ,进入陷阱处理程序。由于所有的 B 类陷阱都有同

一个向量 ,对同时发生的 B 类陷阱的优先权处理由陷阱处理程序内的软件决定。

在 B 类陷阱处理程序执行时 ,又发生的 A 类陷阱将立即得到服务。在 A 类陷阱处理

亿恒 C164CI 16 位单片机

Page 84: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

73

程序执行中发生 B 类陷阱时 ,在 A 类陷阱处理程序用 R ETI 指令退出之前 , B 类陷阱将

不会得到服务。这种情况下 , B类陷阱的发生情况存储在寄存器 TFR 中 ,但引起陷阱的

指令的 IP 值会丢失。

例如 ,未定义操作码陷阱 ( B类 )和NMI陷阱同时发生时 , NMI和 UNDOPC 标志都置

位 ,但是只执行NMI陷阱。从NMI服务程序返回后 , IP 从堆栈中弹出 ,但因为有挂起的

UNDOPC 陷阱 , IP立刻又被压入。

4 . A类陷阱

(1 ) 外部NMI陷阱

只要在外部引脚NMI(不可屏蔽中断 )上检测到一个下降沿跳变 , 即对寄存器 TFR

中的NMI标志置位 , CP U 将进入NMI陷阱程序。压入系统堆栈中的 IP 值是被NMI陷阱

打断的正常处理指令的下一条指令的地址。

注意 : NMI引脚在每一个 CPU 时钟周期采样一次 ,检测其跳变。

(2 ) 堆栈上溢陷阱

只要堆栈指针减小到比堆栈上溢寄存器 ST KOV 中的值还小 ,即对寄存器 TFR 中断

ST KOF标志置位 , CP U 进入堆栈上溢陷阱程序。压入系统堆栈的 IP 值取决于该操作所

引起的 SP 减小。如果 SP 的减小是由 PU SH 或 CALL 指令引起 ,或进入中断/ 陷阱造成

的 ,压入的 IP 值应为下一条指令的地址 ;如果 SP 因减法指令减小 ,则压入的 IP 值表示的

地址为紧跟减法指令后隔开一个指令的地址。

为从堆栈上溢中恢复 ,必须确保栈中有足够的存取空间 , 可保存当前的系统状态

( PSW, IP,在分段模式下还有 CSP)两次 ,否则将产生系统复位。

(3 ) 堆栈下溢陷阱

只要堆栈指针增加到比堆栈下溢寄存器 STKUN 的值还大 , 即寄存器 TFR 中的

ST KU F标志置位 , CP U 进入堆栈下溢陷阱程序。压入系统堆栈的 IP 值取决于是什么操

作引起 SP 的增加。如果 SP 的增加是 POP 或返回指令引起的 ,压入的 IP值为其后的指

令的地址 ;如果 SP是由加法指令增加 ,则 IP 值代表的地址为紧跟加法指令后的隔开一

个指令的地址。

5 . B类陷阱

(1 ) 未定义操作码陷阱

如果一个正被 CPU 译码的指令不是有效的 C164CI 操作码 , 则寄存器 TFR 中的

UNDOPC标志置位 , CP U 进入未定义操作码陷阱程序。压入系统堆栈的 IP 值是引起陷

阱的指令的地址。

该陷阱可用来模拟不可执行的指令。陷阱服务程序可根据堆栈中的 IP 检测出操作

数译码无法执行的错误指令。为了恢复处理 ,栈中的 IP值必须在 RE TI指令执行前增加

未定义的指令大小 ,大小由使用者确定。

(2 ) 保护出错陷阱

在执行一个特定的被保护指令时 ,只要指令的操作码没有在指令的第二个字位置被

第 2 章 体 系 结 构

Page 85: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

74

重复两次 ,而且跟在操作码后的那个字节不是操作码的“反”,那么就对寄存器 TFR 中的

PR TFL T 标志置位 , CPU 进入保护出错陷阱程序。被保护的指令包括 DISWDT ,

EINIT , IDLE , PWRDN , SRST 和 SRVWDT。发生保护出错陷阱时 , 压入系统堆栈中的

IP值是引起陷阱的指令的地址。

(3 ) 非法字操作数访问陷阱

只要试图从奇字节地址开始读写字操作数 ,寄存器 TFR 中的 ILLOPA 标志就置位 ,

CP U进入非法字操作数访问陷阱程序。压入系统堆栈的 IP 值为引起陷阱的指令的下一

个指令地址。

(4 ) 非法指令访问陷阱

只要一个分支被指向奇字节地址 ,就会对寄存器 TFR 中的 ILLINA 标志置位 , CP U

进入非法指令访问陷阱程序。压入系统堆栈的 IP 值是分支指令的非法的奇目的地址。

(5 ) 非法外部总线访问陷阱

只要 CPU 请求外部的取指 , 数据读或数据写 ,而又未指明外部总线结构 , 就对寄存

器 TFR 中的 ILLBUS标志置位 , CPU 进入非法总线访问陷阱程序。压入系统堆栈的 IP

值是引起陷阱的指令的下一个指令地址。

2 .4 时 钟 生 成

2 .4 .1 概述

C164CI 控制器的硬件及其片内周边电路的工作由系统时钟信号 fCP U控制。

时钟生成电路如图 2-19 所示。驱动时钟分三步形成。

图 2-19 CPU 时钟生成过程

1 .振荡器

片内的皮尔斯振荡器可以外接石英晶体 ,工作在自激振荡方式 ;也可以由外部振荡器

亿恒 C164CI 16 位单片机

Page 86: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

75

驱动 ,工作在他激振荡方式。

2 .时钟频率控制

输入时钟信号通过几种处理方式得出供内部硬件使用的时钟信号。

(1 ) 当输入时钟的频率不太高时直接馈送 ,提供与输入波形一致的时钟。

(2 ) 对输入时钟 2 分频后馈送 ,给出一个方波时钟信号。

(3 ) 通过片内锁相环 ( phase locked loop ,缩写为 PLL)倍频后馈送 ,只需提供一个较

低频率的输入时钟 ,仍可保持高的性能。

(4 ) 通过降速分频器 ( slow down divider ,缩写为 SDD)馈送 ,可降低功耗。

用上述方式得出的内部时钟信号称为 CPU 时钟 ,用 fCP U表示。

3 .时钟驱动器

CP U时钟通过各个时钟驱动器分别加到 CP U 模块和两组周边电路模块。但送到实

时时钟 ( real time clock ,缩写为 RT C)的时钟是直接对振荡器时钟进行预分频得到的 ,用

一个单独的时钟驱动器馈送 ,与上述的时钟处理无关。

CP U时钟的生成过程如图 2-19 所示。注意 : 图 2-19 中 , CCD 表示 CP U 时钟驱动

器 ; PCD表示周边电路时钟驱动器 ; ICD 表示接口的时钟驱动器 ; PCDDIS 是周边电路时

钟驱动器禁止位 (SYSCON3. 7)。

2 .4 .2 振荡器

C164CI 的主振荡器是一个皮尔斯振荡器 ,它包含一个反相器和一个反馈元件。反相

器通过引脚 XTAL1 和 XT AL2 接到外部石英晶体。标准的振荡器外部电路由石英晶

体、两个电容和串联电阻 ( Rx2 )组成 (图 2-20)。串联电阻用来限制通过石英晶体的电流。

当使用晶体的三次谐波时 ,需对基波进行抑制 ,可附加一个 LC电路。测试电阻 RQ是一

个暂时插入的元件 ,用来测量振荡电路的容裕情况。

图 2-20 振荡器的外接电路

片内振荡器电路对于 1~16MHz的频率范围进行了优化。

从外部振荡器或从主处理器来的外部时钟信号由 XTAL1 输入 ,这时皮尔斯振荡器

本身不振荡 ,而是由输入信号驱动。输入频率可为 0~50MHz ,最高输入频率受 CPU 最

高工作频率限制。当输入频率超过 25~30MHz时 ,振荡器的输出端应按图 2-21 所示进

第 2 章 体 系 结 构

Page 87: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

76

行端接。对较低的频率可以开路。这种端接可以滤除高于所要振荡频率的高频分量 ,改

进振荡器的工作。

图 2-21 振荡器输出的端接

注意 :在最后的目标系统中 ,最好测定一下振荡器的容限 ,以确定振荡器工作的最佳

参数。因为外部电路的布线可能与先前的不完全相同。

2 .4 .3 频率控制

CP U时钟由振荡器时钟生成 ,振荡器时钟有两种 ,分别为基本时钟和慢速降频时钟 ,

可用软件进行选择。

基本时钟是 C164CI 的标准工作时钟 ,它可用来获得最高的性能要求。在硬件复位

后 ,通过 P0 口配置 ( CLKCFG) ,在下面 3 种基本时钟生成模式中确定一个 :

� 直接驱动 振荡器时钟直接馈送到控制器硬件。

� 预分频 对振荡器时钟进行 2 分频 ,得到占空比为 50%的方波。

� PLL 振荡器时钟的频率乘一个可配置的因子 F, F值为 1 .5~5。

慢速降频时钟是对振荡器频率进行分频得到的 , 分频比是可编程的 , 变化范围从

1~32。这种方式使 C164CI以一个较低的频率工作 (频率与降频因子有关 ) , 从而可使其

功耗大大降低。

图 2-22 给出了各种频率时钟的生成路径。

图 2-22 频率控制的路径

C164CI 的内部操作由 CPU 时钟 fCP U控制。CP U 时钟的两个边沿可以启动内部操

作 (如流水线操作 )或外部操作 (如总线周期操作 ) ,图 2-23 给出了 CP U 时钟的各种工作

情况。

亿恒 C164CI 16 位单片机

Page 88: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

77

1 .直接驱动情况

当 CLKCFG =“011”时 ,工作在直接驱动情况。C164CI 的时钟系统直接取用输入时

钟 ,即 fC PU = fOSC。允许 C164CI用一个适当的基频石英晶体进行工作。CPU 时钟各相

时间 ( TCL)的最小值必须考虑 ,因此 , CP U 最大输入时钟频率还与时钟信号的占空比

有关。

2 .预分频情况

当 CLKCFG =“001”时 ,工作在预分频情况 (见图 2-23)。对 C164CI 的输入时钟作 2

分频后 ,产生 CP U 时钟信号 ,也即 fCPU = fOSC/ 2。这时要求振荡器的振荡频率为预期工

作频率的 2 倍 ,并可保证内部时钟系统用 50%占空比脉冲工作 , 且与输入信号的波形

无关。

图 2-23 CPU 时钟的生成机构

注意 : 图 2-23 中 , TCL 表示时钟脉冲的正相或反相时间。

3 . PLL工作情况

PLL 工作的方框图如图 2-24 所示。

当通过 CLKCFG配置进入 PLL 工作方式时 , C164CI 的输入时钟加到片内锁相环电

路 ,它可使时钟频率乘上一个因子 F , F = 1 .5~5 (其值用 CLKCFG 选取 ,见表 2-15 )。此

时 CPU 工作在 50%占空比情况 , fCP U = f OSC×F。

片内锁相环电路使得 C164CI 的外部时钟可以工作在较低的频率 ,而仍能得到最高

第 2 章 体 系 结 构

Page 89: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

78

图 2-24 PLL 的方框图

的性能。锁相环还提供了一个故障保护机构 ,它对输入时钟的频率偏离进行检测 ,在外部

时钟失效时执行应急操作。

当锁相环检测到失去对输入时钟信号跟踪时 ,产生一个中断请求。此报警中断表明

锁相环频率不再被锁定 ,也即频率不稳定了。这种情况发生在输入时钟出现不稳定 ,特别

是输入时钟完全丢失时 (例如由于晶体断裂 )。此时同步机构将使 PLL 的输出频率降到

PLL 的基本频率 2~5M Hz。在丢失外部时钟时 ,这个基本频率仍可产生 ,使 CP U 执行

应急操作。

上电时 ,当 VDD达到 5V±10%后 ,经过约 1 ms 时间 , PLL 给出一个稳定的时钟信号。

若没有外部时钟信号 ,它也会以它的基本频率 2~5M Hz 运行。一旦外部时钟有效 , PLL

就开始实现同步。当稳定的外部时钟频率落在指定范围内时 ,经过约 1 ms 后 , PLL 将与

此时钟同步 ,频率为 fOSC×F ,也即 PLL被外部时钟锁定。

当 CPU 时钟选取 PLL 方式工作时 ,取输入频率的倍频进行工作 ,可选取的倍数如表

2-15 所示。

表 2-15 C164CI时钟频率的生成

P0 H7~5( CLKCFG) CPU 频率 fCPU = fOSC×F 外部时钟输入频率① / MHz 注 释

111 fXTAL×4 2 .5~6 .25 缺省配置

110 fXTAL×3 3 .33~8 .33

101 fXTAL×2 5~12 .5

100 fXTAL×5 2~5

011 fXTAL×1 1~25 直接驱动②

010 fXTAL×1 .5 6 .66~16 .6

001 fXT AL/ 2 2~50 预分频工作

000 fXTAL×2 .5 4~10

① 外部时钟输入的频率范围与 PLL 的工作情况有关 ,应使其 CP U 时钟的频率范围为 10~25M Hz。

② 最大值与外部时钟信号的占空比有关。在仿真模式中 , P0 H .7 引脚电平会被反转 ,也即仿真模式中配置“111”

将选取直接驱动方式。

PLL 不断地去和外部时钟信号同步。外部频率是 PLL 输出频率的 1/ F ,输出频率会

稍稍高于或低于所要的频率。这种抖动对较长的时间周期无需考虑 ,对短周期 ( 1~4 个

亿恒 C164CI 16 位单片机

Page 90: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

79

CP U时钟周期 )抖动应保持在 4%以下。

2 .4 .4 振荡器监视器

1 .工作情况

C164CI 有一个振荡器监视器 ( oscillator watch dog , 缩写为 OWD) ,它监视直接驱动

方式和预分频方式下加到片内振荡器输入端 XTAL1 的时钟信号。这个时钟信号可以是

由晶振本身产生的 ,也可以是外来时钟驱动产生的。PLL 提供一个基本频率的时钟信

号 ,用来监视振荡器时钟的变化。这个 PLL时钟对于 XTAL1 时钟是独立的。当振荡器

时钟未按预期进行改变时 , OWD就激活 PLL 失锁/ OWD 中断 ,用 PLL 时钟信号取代振

荡器时钟加到 CPU 上。这种情况下 , PLL 将振荡在基本频率。

在直接驱动方式下 ,直接使用 PLL基本频率 ( fC PU = 1~5MHz)。

在预分频方式下 ,对 PLL基本频率作 2 分频 ( fC PU = 1~2 .5MHz)。

如果振荡器时钟失效 ,由 PLL提供基本时钟 ,系统将以 PLL 基本频率工作。

用这种 PLL 时钟信号 , CP U 可以执行一个受控的掉电序列 ,使系统进入规定的省电

空闲状态。也可为系统提供一个应急操作 ,使其进行基于应急时钟的减缓的操作。

注意 : CP U 时钟源只有在硬件复位后才能返回到振荡器时钟。

2 . OWD的禁止

对寄存器 SYSCON 的位 OWDD1S置“1”, 可以禁止振荡器监视器工作。这时 PLL

保持空闲状态 ,并且不提供时钟信号 , CP U 时钟信号由振荡器时钟直接驱动或通过预分

频器或 SDD驱动。在丢失振荡器时钟时也不会有中断请求信号产生。

注意 :在外部复位过程结束时 ,位 OWDDIS 取那个时刻RD引脚上电平的“反”。因

此 ,振荡器看门狗也可用硬件禁止 ,只要在复位时把端口电平通过外电路拉到低 ,其工作

情况与通过 P0 口进行标准的复位配置类似。

3 . OWD的安全性

当 CPU 时钟是由慢速分频器产生时 ,由于这时 OWD不能切换到 PLL 时钟 ,因而不

能提供充分的安全。OWD中断只在 fOSC仍可用时才能识别 (例如 ,输入频率太低或只是

间隙失效情况 )。对晶体断开情况就不能用 OWD中断服务检测 ,因为这时无 SDD时钟。

2 .4 .5 时钟驱动

工作时钟信号 fCP U通过几个时钟驱动器加到控制器硬件。这些驱动器在某些情况

下可被禁止。实时时钟 R TC 是通过单独的时钟驱动器工作的 ,这个驱动器提供经过预

分频的振荡器时钟 (与其他的时钟驱动器不同 )。表 2-16 摘要列出了各种不同的时钟驱

动器及它们的功能 ,特别是在节省功率模式中。表 2-16 中 , CCD 是 CP U 时钟驱动器的

第 2 章 体 系 结 构

Page 91: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

80

缩写 , ICD 是接口时钟驱动器的缩写 , PCD 是周边电路时钟驱动器的缩写 , RCD 是 R TC

时钟驱动器的缩写。

表 2-16 各种时钟驱动的说明

时钟驱动器 时钟信号 工作模式 空闲模式 掉电模式 连接电路

CCD

CPU 时钟驱动器fCPU ON OFF OFF CPU ,存储器

ICD

接口时钟驱动器fCPU ON ON OFF

ASC0 , WDT , SSC

中断检测电路

PCD周边电路

时钟驱动器fCPU

由 PCDDIS

控制

由 PCDDIS

控制OFF

( XBUS )周边电路 (定

时器等 )使用 ICD 的除

外 ,中断控制器 ,端口

RCD

RTC 时钟驱动器fOSC ON ON

由 PCDON

控制

注 :对位 PCDDIS 置“1”时 ,禁止 PCD 工作 ,所有与它连接的模块的时钟停止。在停止这些时钟信号前 ,应确认所

有这些模块处在安全状态。

当 PCD 禁止时 ,端口的输入值和输出值不改变。CLKO UT (如果使能 )将为“高”。

其他请参看 4 .4 .4“灵活的周边电路管理”一节。

2 .5 并行 I/O口

2 .5 .1 概述

C164CI 提供 59 个并行 I/ O 口引脚 ,用来接收或生成外部控制信号或并行数据。它

们组成 4 个 8 位 I/ O 口 ( P0H 和 P0L构成 P0 口 , P1 H 和 P1L 构成 P1 口 ) ,一个 9 位 I/ O

口 ( P3)、一个 6 位 I/ O口 (P4 )、一个 4 位 I/ O口 ( P8 )和一个 8 位输入口 ( P5)。图 2-25 给

出了与并行 I/ O口有关的 SFR 和引脚。

图 2-25 与并行口有关的 SFR 和引脚

这些端口可以通过软件控制设为一般的 I/ O 口 ,或用于 C164CI 集成在片内的周边

亿恒 C164CI 16 位单片机

Page 92: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

81

电路和外部总线控制器。

所有的口都是可按位寻址的 ,并且所有 I/ O 口引脚可以通过方向控制寄存器编程 ,

分别设成输入或输出 ( P5 口除外 )。 I/ O 口是真正的双向口 , 当构成输入口时 ,引脚处在

高阻状态。3 个输出口 ( P3、P4 和 P8 )的驱动可以通过漏极开路控制寄存器按引脚设置

成推挽工作方式或漏极开路工作方式。

引脚的逻辑电平锁存到输入锁存器 ,每个状态时间锁存一次 ,与口是输入还是输出

无关。

当对输入口进行写操作时 ,该值是写到输出锁存器。而读操作返回的是引脚本身锁

存的状态。一个读-修改-写操作是读取输出锁存器的值 ,对它修改后再写回输出锁存器 ,

与此同时修改了引脚上的输出电平。

1 .输入门限控制

C164CI 标准输入口按 T TL 电平确定输入信号的状态。为了接收和识别噪波 ,某些

特殊端口的引脚可以选取类似 CMOS输入的门限来代替标准的 T TL 门限。这些规定的

门限位于 T TL 门限上方 ,有一个滞后 (见图 2-26 )。它可防止接近输入电平的信号由于

叠加上噪波而引起错误的状态转换。

图 2-26 特殊输入门限的滞后

口输入控制寄存器 PICON用来选择这些门限。P8 口 4 位和 P4 口 6 位的门限用一

位进行选择 , P3 口 16 位的门限用两位选择。

位 功 能

PxLIN

口 x低位字节输入电平选择

0 : Px .7~Px .0 脚切换到 T T L输入电平

1 : Px .7~Px .0 脚切换到特殊门限的输入电平

Px H IN

口 x高位字节输入电平选择

0 : Px .15~Px .8 脚切换到 T T L输入电平

1 : Px .15~Px .8 脚切换到特殊门限的输入电平

各个引脚可以分别选取传送方向和输出方式 ,与输入门限的选取无关。

第 2 章 体 系 结 构

Page 93: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

82

输入滞后削弱了杂波对稳定输入的影响 ,使对外部信号变化的反应变慢。

2 .输出驱动控制

一个端口的输出驱动器可以通过把相应引脚切换到输出来激活 ,即设 DPx .y 为“1”。

加到引脚上的电平 ,或取端口输出锁存器中的值 ,或由相关的替换功能 (如地址、周边电路

的输入/ 输出等 )确定。输出驱动器的性能可以用下列机制进行控制 :

� 漏极开路输出 使上拉晶体管总是处在关断状态 ,只能把引脚驱动到“0”,这时需

外接上拉电阻。

� 驱动特性 驱动电流的大小 (动态的和静态的 )可以选择。

� 边沿特性 输出信号的上升/ 下降时间可以选择。

(1 ) 漏极开路输出

C164CI 某些端口具有漏极开路方式 ,可以从推挽方式切换到漏极开路方式。推挽方

式时 ,输出由上下两个晶体管驱动 ,使端口输出“高”或“低”电平。而在漏极开路方式 ,上

拉晶体管总是处在关断状态 ,输出驱动器只能把引脚拉到“低”电平。当把“1”写到口锁存

器时 ,下拉晶体管关断 ,输出引脚进入高阻状态 ,这时高电平必须由外部上拉器件提供。

由于这个特性 ,可以把几个引脚连接到一起 ,构成“线与”结构。由此可节省一些外部逻辑

电路 ,还不必再对端口送输出禁止/ 使能信号 ,省掉了这些操作所需的额外软件开销。

这一特性是通过相应的漏极开路控制寄存器 ODPx 进行控制的 ,这些寄存器对每个

引脚作漏极开路的选择。若相应的控制位 ODPx .y 为“0”(复位时缺省值 ) , 输出驱动工

作在推挽方式。若 ODPx .y 是“1”,则选择漏极开路方式。所有的寄存器 ODPx 是在

ESFR 区。图 2-27 给出了输出驱动器两种工作方式的电路。

图 2-27 输出驱动器的推挽方式和漏极开路方式

(2 ) 驱动特性

一些引脚的输出驱动电流是可以控制的 ,或是使用一般的驱动电流 ,或是在达到目标

电平时减弱驱动电流 ,或是一直使用减弱的驱动电流。驱动电流减弱时 ,输出电路的内阻

增加 ,这可减弱输出线上感受到的噪波。而为了驱动 LED 或功率晶体管 ,可能需要稳定

的大的驱动电流。

这些输出驱动器中的推拉两部分电路各由两个不同的晶体管并联构成 ,一个工作在

强电流 ,一个工作在弱电流 ,各在什么情况下激活由相应端口的驱动特性确定。为适应不

同的工作要求 ,有下列 3 种方式可选 :

� 在强电流方式中 ,两个晶体管都激活 ,这时驱动器提供最大的电流 ,在达到目标电

亿恒 C164CI 16 位单片机

Page 94: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

83

平后仍保持所提供的电流。

� 在低噪波方式中 ,两个晶体管在信号转换开始时激活 ,当达到目标电平后 ,关断强

电流的晶体管 , 使驱动电流减小。弱电流的晶体管用来保持所要的电平 , 减弱噪波的

影响。

� 在小电流方式中 ,仅仅两个弱电流的晶体管激活 ,而强电流的晶体管关断。用低

的电流进行缓慢的转换 , 这将增加转换时间 ,使跳变沿变缓。其特性与电容负载大小

有关。

(3 ) 边沿特性

改变外部电容上电压时 ,慢变化的沿可使流过电容的峰值电流减小。但是对总线接

口 ,仍需要快变化的沿。边沿特性先对预驱动器起作用 ,再经最后的驱动级输出。

表 2-17 给出了各种情况下输出晶体管的工作。

表 2-17 输出晶体管的工作

驱动方式 弱电流方式 动态电流方式 强电流方式

输出电平 “0” “1” “0” “1” “0” “1”

上拉①

晶体管

强电流 --- --- --- --- ON

弱电流 --- ON --- ON --- ON

下拉

晶体管

强电流 --- --- --- ON ---

弱电流 ON --- ON --- ON ---

① 在漏极开路方式中 ,上拉晶体管总是关断的。

端口输出控制寄存器 POCONx 提供相应的控制位。对每个端口半字节的边沿和驱

动特性有一个 2 位的控制域。每个字端口使用 4 个半字节控制 ,每个字节端口使用 2 个

半字节控制 ,每个半字节控制管理相应端口的 4 个引脚。

下面所示的寄存器各部分的分配对所有 POCON 寄存器有效。对字节端口只提供 2

对位域 (见寄存器分配表 2-18 )。

位 功 能

PNxEC

端口半字节 x的边沿特性

00:快速边沿方式 ,上升/ 下降时间由驱动器能力决定

01:减慢边沿方式

10:保留

11:保留

第 2 章 体 系 结 构

Page 95: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

84

续表

位 功 能

PNxDC

端口半字节 x的驱动特性

00:强电流方式 ,驱动器总是以最大的电流工作

01:弱电流方式 ,驱动器总是以减小的电流工作

10:动态电流方式 ,驱动器在达到目标电平后从强电流减为弱电流工作

11:保留

表 2-18 给出了 POCON 寄存器及其地址、控制的端口。

表 2-18 输出控制寄存器分配

控制寄存器 地 址 控制的端口 注 释

POCON20 F0AAH/ 55 H RST OU TCLKOU T/

FOU TALE

WR, RD

BHE/ WRH无相关端口

POCON8 F092 H/ 49 H --- P8 .3~0

POCON4 F08CH/ 46 H P4 .6~5 P4 .3~0 缺 P4 .7 , P4 .4

POCON3 F08AH/ 45 H P3 .15~12 P3 .11~8 P3 .6~4 --- 缺 P3 .14 , P3 .7 , P3 .5

POCON1 H F086 H/ 43 H P1 H .7~4 P1 H .3~0

POCON1L F084 H/ 42 H P1L .7~4 P1L .3~0

POCON0 H F082 H/ 41 H P0 H .7~4 P0 H .3~0

POCON0L F080 H/ 40 H P0L .7~4 P0L .3~0

3 .替换的端口功能

为使 I/ O口在不同应用中具有最大的灵活性 ,可对输入/ 输出端口进行编程 ,使其具

有另一种输入/ 输出功能 ,这些功能如表 2-19 所示。

表 2-19 替换的端口功能

端 口 替 换 功 能

P0 访问外部资源 (如存储器 )时的地址线和数据线

P1

访问外部资源 (如存储器 )时的地址线

CAPCOM 单元的捕获输入和比较输出 , CAPCOM 定时器的输入端

快速外部中断的输入端

P3选用的总线控制信号和系统时钟输出端

定时器、串行口的输入/ 输出功能

P4

对大于 64KB存储器进行直接访问时 ,用作附加的段地址选择位 A xx~A16

使用片选时的片选输出端( CS3~CS0 )

CAN 接口

P5A/ D转换器模拟输入端

时钟控制信号输入端

P8CAPCOM2 单元的捕获输入和比较输出

CAN 接口

亿恒 C164CI 16 位单片机

Page 96: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

85

如果使用一个引脚的替换输出功能 ,这个引脚必须编程为输出口 (DPx .y =“1”) ,但

那些在复位后自动配置可直接使用的信号除外。若不设置 ,引脚保持在高阻状态 ,不能起

替换输出功能的作用。相应的口锁存器应保持为“1”,因为口锁存器内容与替换输出数据

相“与”后构成引脚的输出。

如果使用一个引脚的替换输入功能 ,若有外部器件与此引脚连接 ,这个引脚必须编程

为输入口 ( DPx .y =“0”) ,在复位后默认的是输入。若没有外部器件接到该引脚 ,该引脚

也可以设为输出 ,这时 ,引脚反映的是口输出锁存器的状态 ,即替换的输入功能读到的是

存在口输出锁存器中的值。这一功能可用于测试 ,用对口输出锁存器写来代替输入功能

的软件触发。

当使用替换输入或输出功能时 ,大多数端口要由用户软件设定合适的传送方向。在

激活替换功能之前 ,用引脚的方向控制位 DPx .y 清“0”或置“1”进行设定。但是有的端口

的传送方向是自动切换的。例如 P0 口工作在外部复用总线模式时 ,在提取指令时要输

出地址和输入数据 ,口的传送方向必须来回变换。显然 ,这不可能通过指令进行 ,这时口

的传送方向是通过硬件自动切换的。

为了使口输出锁存器有合适的电平 ,需要了解一下替换的数据输出与相应端口锁存

器的输出是怎样组合的。

只含替换输入功能的所有端口具有同一个基本结构 ,而只含替换输出功能的端口则

具有不同的结构。这是由于切换引脚传送方向时接通的路径有所不同 ,并与该引脚是否

可由用户软件访问 ,或是否处在替换功能模式有关。

所有未用于替换功能的引脚可以用作一般的 I/ O 口。当用作一般的输出功能时 ,在

对输出使能前 ,应对口锁存器写入一个初始值 ,以避免在输出引脚上出现不希望的跳变。

对单个引脚赋值的方法与成组引脚相同 ,见下例。

OUT PUT_ENABLE_SINGL E_PIN :

BSE T P4 .0 ;初始化输出电平为“高”

BSE T DP4 .0 ;切换到输出驱动器

OUT PUT_ENABLE_PIN_GROUP:

BFLDL P4 , # 05 H , # 05 H ;初始化输出电平为“高”

BFLDL DP4 , # 05 H , # 05 H ;切换到输出驱动器

注 :当使用几对 BSET 控制一个口的多个引脚时 ,这些指令对之间必须用不是访问该口的指令隔开。

(参见 2 .3 .1“指令的流水线操作”一节 )

下面各节分别对每个口作一说明 ,其替换的输入/ 输出功能的使用将在后续的有关章

节中说明。

2 .5 .2 P0口

P0 H 和 P0L 两个 8 位口分别表示 P0 口的高端 8 位和低端 8 位。它们中的每一个端

口都可以单独写 (例如通过 PEC传送 )而不影响到另一个。

若此口用作一般 I/ O 口 ,其每个端口的传送方向可以通过寄存器 DP0H 和 DP0L 进

第 2 章 体 系 结 构

Page 97: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

86

行配置。

位 功 能

P0x .y 口数据寄存器 P0 H 或 P0L的位 y

位 功 能

DP0x .y

口方向控制寄存器 DP0 H 或 DP0L的位 y

DP0x .y = 0 :端口 P0x .y为输入(高阻 )

DP0x .y = 1 :端口 P0x .y为输出

P0 口的替换功能为 :当外部总线使能时 , P0 口用作地址/ 数据线 (见图 2-28)。

图 2-28 P0口的输入/ 输出和替换功能

亿恒 C164CI 16 位单片机

Page 98: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

87

P0 口还用于系统初始配置的选择。在复位期间 , P0 口配置成输入 ,每个端口通过内

部上拉电路保持为高电平。此时 ,每个端口可以单独通过外接下拉器件拉到低电平。当

P0 口的各口线为高电平时 ,选取缺省的配置。需其他配置时 ,可以通过把对应端口拉到

低电平实现。

内部上拉电路是这样设计的 ,当端口接一个外部下拉电阻时即可得到低电平。这些

下拉电阻在正常工作时仍会接在电路中 ,所以必须选取合适的大小 ,使它们不会干扰 P0

口的正常工作。若外部电阻中通过的电流过大 ,就可能对 P0 口产生影响。

复位结束时 ,所选取的总线结构写到寄存器 BUSCON0。P0 口高位字节的配置将会

复制到寄存器 RP0 H。这个只读寄存器将保留对片选号和段地址的选择。如果需要 ,可

以通过软件读取此寄存器 ,检查所选定的配置是否正确。

当复位终止后 ,内部上拉电路关断 , P0 口将转换到所要求的工作模式。

以复用总线方式进行外部访问时 , P0 口用作替换功能 ,先输出段内的 16 位地址 ,然

后转换为高阻输入 ,读取指令或数据。在 8 位模式时 , 对字的访问需要对存储器访问两

次 ,第一次访问字的低位字节 ,第二次访问字的高位字节。在 P0 口的写周期中 , 先输出

地址 ,然后输出数据字节或数据字。

当外部总线模式使能时 ,口的传送方向和口输出锁存器的数据加载是由总线控制器

的硬件控制的。口输出锁存器的输入端不与内部总线连接 ,它通过多路选择器接到“替换

数据输出”线上。替换数据可以是 16 位的段内地址或 8/ 16 位数据信息。外部总线模式

使能时 ,不要用软件去写口输出锁存器 ,否则会发生不可预期的结果。当外部总线模式禁

止时 ,用户最后一次写到方向控制寄存器中的内容生效。

P0 口每个引脚的结构如图 2-29 所示。

图 2-29 P0口引脚的结构图

第 2 章 体 系 结 构

Page 99: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

88

2 .5 .3 P1口

P1 H 和 P1L 两个 8 位口分别表示 P1 口的高 8 位和低 8 位。无论对 P1 的哪部分写

都不会影响到另一部分。

如果这个口用作一般的 I/ O口 ,其每个端口的传送方向可以通过相应的方向控制寄

存器 DP H1 和 DPL1 进行配置。

位 功 能

P1x .y 口数据寄存器 P1 H 或 P1L的位 y

位 功 能

DP1x .y

口方向控制寄存器 DP1 H 或 DP1L的位 y

DP1x .y = 0 :端口 P1x .y为输入(高阻 )

DP1x .y = 1 :端口 P1x .y为输出

P1 口的替换功能为 :

当分离的多路外部总线使能时 , P1 口用作地址总线。注意 ,分离的多路外部总线以

16 位方式使用 P1 口 ,否则所有 16 位可用作一般的 I/ O口。

P1 口的低 11 位 ( P1H .2~P1L .0 )可用作 CAPCOM6 单元的输入/ 输出端。P1H .3

~P1 H .0 引脚接受快速的外部中断输入。P1H .3 还可用作定时器 T7 的输入端。P1 口

的高四位 ( P1H .7~P1 H .4 )可用作 CAPCOM2 单元的捕获输入端 ( CC27IO~CC24IO)。

亿恒 C164CI 16 位单片机

Page 100: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

89

像所有其他的捕获输入端一样 ,引脚 P1 H .7~P1 H .4 的捕获输入功能也可用作外部

中断输入端 (见图 2-30 )。

图 2-30 P1口的输入/ 输出和替换功能

以地址总线方式工作时 ,作为一个附带功能 ,也可使用这些口线的捕获能力。因此可

以检测高位地址线的变化 ,并用来触发执行一些特定的服务子程序的中断请求。外部捕

获信号只能使用那些未选为地址输出的 P1 口线。

图 2-31 和图 2-32 给出了 P1 口引脚的结构。

图 2-31 用于地址和 CAPCOM 功能的 P1 口引脚的方框图

第 2 章 体 系 结 构

Page 101: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

90

图 2-32 用于地址和替换输入/ 输出功能的 P1 口引脚的方框图

2 .5 .4 P3口

此 9 位口若用作一般的 I/ O口 ,其每个端口的方向可以通过相应的方向控制寄存器

DP3 进行配置。大多数端口可以在推挽方式和漏极开路方式之间进行切换 ,这是通过漏

极开路控制寄存器 ODP3 实现的 (引脚 P3 .15 和 P3 .12 不支持漏极开路方式 )。

位 功 能

P3 .y 口数据寄存器 P3的位 y

亿恒 C164CI 16 位单片机

Page 102: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

91

位 功 能

DP3 .y

口方向控制寄存器 DP3 的位 y

DP3 .y = 0 :端口 P3 .y 为输入 (高阻)

DP3 .y = 1 :端口 P3 .y 为输出

位 功 能

ODP3 .y

漏极开路控制寄存器 ODP3 的位 y

ODP3 .y = 0:端口 P3 .y输出驱动为推挽方式

ODP3 .y = 1:端口 P3 .y输出驱动为漏极开路方式

P3 口的替换功能为 :

P3 口引脚可用于各种其他功能 ,包括外部定时器的控制线 ,两个串行接口和控制线

BH E/ WR H ,以及 CLKOU T/ F OU T(见图 2-33)。

图 2-33 P3口的输入/ 输出和替换功能

表 2-20 摘要列出了 P3 口引脚的替换功能。

P3 口引脚的结构与其替换功能有关 (见图 2-34)。

当片内周边电路使用 P3 口引脚的替换输入功能时 , 将通过“替换功能输入”线来读

取表示引脚状态的输入锁存器。具有替换功能的 P3 引脚是 T3IN 和 T3EUD。

当片内周边电路使用 P3 口引脚的替换输出功能时 ,“替换数据输出”线和口输出锁

存器内容相“与”输出。当使用这种替换功能时 ,用户必须把端口的传送方向设为输出

( DP3 .y = 1) ,口输出锁存器必须置“1”( P3 .y = 1 ) ,否则引脚会处在高阻状态 (当配置

成输入时 ) ,或者被强制到“0”(当口输出锁存器为“0”时 )。当不使用替换输出功能时 ,

“替换数据输出”线处在非工作状态 ,为高电平“1”。具有替换输出功能的 P3 口引脚是

TxD0 和 CLKOUT/ FOUT。

第 2 章 体 系 结 构

Page 103: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

92

表 2-20 P3 口引脚的替换功能

P3 口引脚 替 换 功 能

P3 .4

P3 .6

P3 .8

P3 .9

P3 .10

P3 .11

P3 .12

P3 .13

P3 .15

T3EUD 定时器 3 外部加/ 减输入端

T3IN 定时器 3 计数输入端

MRST SSC 主接收/ 从发送

M TSR SSC 主发送/ 从接收

TxD0 ASC0 发送数据输出端

RxD0 ASC0 接收数据输入端

BH E/ WRH 高位使能/ 高位写信号输出

SCLK SSC移位时钟输入/ 输出

CLKOU T/ FOUT 系统时钟输出/ 可编程频率输出

图 2-34 具有替换输入/ 输出功能的 P3 口引脚的方框图

当片内周边电路与既有替换输入又有替换输出功能的 P3 口引脚结合使用时 ,前面

的说明可适用于当时所在的工作模式。传送方向必须相应设置。具有替换输入/ 输出功

能的 P3 口引脚有 M TSR, M RST , RxD0 和 SCLK。

注意 :当 CLKOUT 功能使能时 ,自动对 P3 .15 输出使能。不需要设 DP3 .15 为“1”。

亿恒 C164CI 16 位单片机

Page 104: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

93

P3 .12 脚 ( BHE/ WR H )是另一个具有替换输出功能的引脚。但是它的结构稍有不

同 (见图 2-35 ) ,因为复位后 , B HE或WR H功能必须使用 ,使用哪一个取决于系统的初始

化配置。在这种情况下 ,不可能先对口锁存器作任何编程 ,因此必须能自动地选择适当的

替换功能。如果系统不使用BH E/ WR H ,则通过禁止替换功能 ( BYTDIS =“1”/ WRCFG

=“0”) ,使这个引脚用作一般的 I/ O 口。

图 2-35 引脚 P3 .15 ( CLKOU T/ FOUT ) 和 P3 .12 (BHE/ WRH ) 的方框图

注意 :对BHE或WR H功能使能时 ,也会自动对 P3 .12 输出驱动器使能。不需要对位

DP3 .12 置“1”。

2 .5 .5 P4口

这个 6 位口若用作一般的 I/ O 口 , 其每个端口的方向通过相应的方向控制寄存器

DP4 配置。

第 2 章 体 系 结 构

Page 105: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

94

位 功 能

P4 .y 口数据寄存器 P4的位 y

位 功 能

DP4 .y

口方向控制寄存器 DP4 的位 y

DP4 .y = 0 :端口 P4 .y 为输入 (高阻)

DP4 .y = 1 :端口 P4 .y 为输出

位 功 能

ODP4 .y

P4 口漏极开路控制寄存器的位 y

ODP4 .y = 0:端口 P4 .y工作在推挽方式

ODP4 .y = 1 :端口 P4 .y 工作在漏极开路方式

P4 口的替换功能为 :

在使用分段 (也即超过 64KB的地址空间 )的外部总线周期期间 , P4 口的一些引脚可

以输出段地址 ,段地址输出的引脚个数由直接访问的地址空间确定 ,参见 4 .1“外部总线”

一节。P4 口的其他引脚可用作一般的 I/ O 口或 CAN 接口。

如果选用作段地址线 , P4 口就必须使用替换功能 ,例如复位后对外部存储器的直接

访问 ,因此 ,复位后 P4 口必须自动切换到替换功能。

一些段地址线在复位时通过 P0 口进行选择 ,所选取的值可以从寄存器 RP0H (只读 )

的位域 SALSEL 和 CSSEL 读取。这可用来检查运行时的配置情况。用软件通过寄存器

RSTCON 可以调整所选的段地址线个数。

CAN接口使用 P4 口的两个引脚。这两个引脚用来连接 CAN 模块和外部的 CAN

收发器。这种情况下可用的段地址线要减少。

表 2-21 概要列出了和段地址线相关的 P4 口替换功能 (由位域 SALSEL 编码设

定 )。

亿恒 C164CI 16 位单片机

Page 106: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

95

表 2-21 P4口的替换功能

P4 口引脚

标准功能

SALSEL = 01

64KB

替换功能

SALSEL = 11

256KB

替换功能

SALSEL = 00

1MB

替换功能

SALSEL = 10

4MB

P4 .0

P4 .1

P4 .2

P4 .3

P4 .5

P4 .6

一般 I/ O 口或CS3

一般 I/ O 口或CS2

一般 I/ O 口或CS1

一般 I/ O 口或CS0

一般 I/ O口或 CAN

一般 I/ O口或 CAN

段地址线 A16

段地址线 A17

一般 I/ O 口或CS1

一般 I/ O 口或CS0

一般 I/ O 口或 CAN

一般 I/ O 口或 CAN

段地址线 A16

段地址线 A17

段地址线 A18

段地址线 A19

一般 I/ O 口或 CAN

一般 I/ O 口或 CAN

段地址线 A16

段地址线 A17

段地址线 A18

段地址线 A19

段地址线 A20或 CAN

段地址线 A21或 CAN

注意 :既不用于段地址和片选线输出 ,也不用于 CAN 接口的 P4 口引脚 ,可以用作一

般的 I/ O口。用作片选输出的引脚由位域 CSSEL 规定。

如果 P4 口引脚选择了多于一个的功能 ,段地址线要优先于片选线 , CAN 接口要优先

于段地址线。

P4 口的片选线附有一个内部的弱上拉器件 ,它在复位时是接通的 (包括单片模式的

复位 ) ,这样可以为所选取的片选线提供一个稳定的电平 ,直到控制器开始工作。

P4 口的替换功能如图 2-36 所示。其方框图如图 2-37 所示。

图 2-36 P4口的输入/ 输出和替换功能

2 .5 .6 P5口

这个 8 位口只能读取数据 ,无输出锁存器 ,无传送方向寄存器。写到 P5 口的数据将

丢失。

第 2 章 体 系 结 构

Page 107: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

96

图 2-37 P4口引脚的方框图

位 功 能

P5 .y 口数据寄存器 P5的位 y

P5 口的替换功能为 :

P5 口的每根端口线还连接到 A/ D转换器的多路选择器输入端。所有端口可接收送

到 ADC 进行转换的模拟信号 ( ANx ) ,见图 2-38。P5 口的一些引脚还可用作外部一些定

图 2-38 P5口的输入/ 输出和替换功能

亿恒 C164CI 16 位单片机

Page 108: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

97

时器的控制线 (见表 2-22 )。

表 2-22 P5口引脚的替换功能

P5 口引脚 替换功能 a) 替换功能 b )

P5 .0

P5 .1

P5 .2

P5 .3

P5 .4

P5 .5

P5 .6

P5 .7

模拟输入端 AN0

模拟输入端 AN1

模拟输入端 AN2

模拟输入端 AN3

模拟输入端 AN4

模拟输入端 AN5

模拟输入端 AN6

模拟输入端 AN7

T2EUD 定时器 2 外部加/ 减使能端

T4EUD 定时器 4 外部加/ 减使能端

T2IN 定时器 2 计数输入端

T4IN 定时器 4 计数输入端

P5 口引脚用作模拟输入时最好对 P5DIDIS 寄存器中的相应位进行设置 ,使相应引

脚的数字输入级与引脚断开 ,它可以减少流到数字输入级的电流 ,防止模拟输入电平处在

数字信号的低限和高限之间时引起无规则的触发。还可使功耗减小 ,产生的噪波减小。

复位后数字输入是使能的。

位 功 能

P5D .y

P5 口数字输入控制寄存器的位 y

P5D .y = 0 :数字输入级与口线 P5 .y连接

P5D .y = 1 :数字输入级与口线 P5 .y不连接

注 :当读该位或用于替换输入时 ,口线显示为高

P5 口有一个特殊的口结构 (见图 2-39 ) ,这是由于它只是一个输入口。另外 ,模拟输

入通道是直接与引脚相连 ,不接到输入锁存器。

图 2-39 P5口引脚的方框图

第 2 章 体 系 结 构

Page 109: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

98

2 .5 .7 P8口

这个 4 位口若用作一般的 I/ O口 ,其每个端口的传送方向可以通过相应的方向控制

寄存器 DP8 进行配置。每个端口可以在推挽输出和漏极开路输出方式之间进行转换 ,用

漏极开路控制寄存器 ODP8 进行控制。

位 功 能

P8 .y 口数据寄存器 P8的位 y

位 功 能

DP8 .y

口方向寄存器 DP8 的位 y

DP8 .y = 0 :端口 P8 .y 为输入 (高阻)

DP8 .y = 1 :端口 P8 .y 为输出

位 功 能

ODP8 .y

P8 口漏极开路控制寄存器的位 y

ODP8 .y = 0:端口 P8 .y输出驱动为推挽方式

ODP8 .y = 1:端口 P8 .y输出驱动为漏极开路方式

P8 口的替换功能为 :

P8 口所有引脚用作 CA PCOM2 单元的捕获输入端或比较输出端 (见图 2-40)。

CAN接口可使用 P8 口的两个引脚使 CAN 模块和外部的 CAN 接收器相连接。这

时用于 CAPCOM 的 I/ O 口要减少。

表 2-23 示出了 P8 口引脚的替换功能。

亿恒 C164CI 16 位单片机

Page 110: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

99

图 2-40 P8口的输入/ 输出和替换功能

表 2-23 P8口引脚的替换功能

P8 口引脚 替 换 功 能

P8 .0

P8 .1

P8 .2

P8 .3

CC16IO 捕获输入/ 比较输出通道 16 或 CAN

CC17IO 捕获输入/ 比较输出通道 17 或 CAN

CC18IO 捕获输入/ 比较输出通道 18 或 CAN

CC19IO 捕获输入/ 比较输出通道 19 或 CAN

在口锁存输入前 , P8 引脚先把内部总线数据和替换的数据输出进行组合 (见图

2-41)。

图 2-41 P8口引脚的方框图

第 2 章 体 系 结 构

Page 111: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

100

2 .5 .8 专用功能引脚

大多数 C164CI 的功能块的输入/ 输出和控制信号是用并行口的替换功能实现的。

但是有一些信号使用单独的引脚 ,这些信号包括振荡器、专用的控制信号、电源 ,共有 21

个 (见表 2-24 )。

表 2-24 专用功能引脚

引 脚 功 能

ALE 地址锁存使能

RD 外部读选通

WR/ WRL 外部写/ 写低位字节选通

Vpp/ EA 外部存取使能和外加编程电压

NMI 不可屏蔽中断输入

XTAL1 , XT AL2 振荡器输入/ 输出

RSTIN 复位输入

RSTOU T 复位输出

VAREF , VAGND 模数转换器的电源

VDD , VSS 数字电源和地 (各有 5 个 )

1 .地址锁存使能信号 ALE

地址锁存使能信号 ALE锁存外部地址 ,为复用总线模式提供一个稳定的地址。

ALE对任何外部总线周期有效 ,与选择的总线模式无关。当对外部总线模式使能及

对 XBU S周边电路访问时 ,将产生激活的 ALE 信号。

ALE 信号在内部存取 ,即访问 ROM/ OTP/ Flash、内部 RAM 区和专用寄存器时不

激活。在单片模式中 ,外部总线不使能 ,对 XBU S周边电路的访问 , ALE 也不激活。

在复位时 ,内部的下拉电路保证 ALE 输出为低电平 ,使其处在不激活状态。

2 .外部读选通信号RD

在 C164CI 从外部存储器和周边电路读数据时 ,外部读选通信号RD控制这些器件的

输出驱动。在访问片内的 XBU S周边电路时 , RD保持不激活状态 ,输出为高电平。

在复位时 ,内部的上拉电路使RD输出为高电平 ,处在未激活状态。

在内部复位序列的终了时 , RD引脚按 P0 口的配置进行锁定。锁定的RD电平决定于

寄存器 SYSCON 中位 OWDDIS的复位值。RD引脚上的缺省值为“高”电平 ,使振荡器监

视器激活 ( OWDDIS =“0”) ,而“低”电平将禁止监视器工作 ( OWDDIS =“1”)。

接到RD引脚的外电路必须这样设计 ,它既能保持缺省的高电平 ,且如果需要 ,又能用

亿恒 C164CI 16 位单片机

Page 112: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

101

外接地的电阻提供一个合适的低电平。

3 .外部写选通信号WR/ WRL

外部写选通信号WR/ WRL控制数据从 C164CI 到外部存储器或周边电路的传送。

这个引脚既可以对字节和字的访问提供一个激活的WR信号 ,也可专门对外部 16 位器件

的低位字节进行控制 ( WRL) ,与WRH信号配合使用 ( P3 .12/ BHE引脚的替换功能 )。

在访问片内的 XBU S周边电路时 , WR/ WRL保持未激活状态。

在复位时 ,内部的上拉电路保证WR/ WR L输出为高电平 ,处在未激活状态。

4 .引脚EA

外部访问使能引脚EA/ V PP确定复位后取指是从内部 ROM 开始 ( EA =“1”)还是经

由外部总线接口 ( EA =“0”)进行。对于无 ROM 器件 ,确认这个引脚输入为低。在内部

复位序列的终了 , EA信号与 P0 口配置一起被锁定。

这个引脚还接受外加的编程电压 ,这是对片内的 OTP 存储器进行编程所需要的。

5 .不可屏蔽中断输入端NMI

不可屏蔽中断输入端NMI允许通过一个外部信号 (如掉电信号 )触发一个高优先级

的陷阱。它还用来使 PWRDN指令生效 ,此指令使 C164CI 进入掉电模式。每个 CP U 时

钟周期对NMI采样一次 ,以检测其有无跳变。

6 .振荡器输入/输出端 XTAL1/ XTAL2

振荡器的输入端 XT AL1 和输出端 XTAL2 用来外接石英晶体构成的皮尔斯振荡

器。其内部有一个反相器和一个反馈元件。标准的振荡电路包括石英晶体、两个电容和

限制通过晶体电流的串接电阻。

7 .复位输入端RSTIN

无论是由于上电 ,或是硬件失效等外部事件 ,或是人工复位 ,复位输入端RSTIN使

C164CI 进入复位状态。RSTIN的输入门限比标准引脚的要高一些 ,以使复位输入端对

噪波的灵敏度降到最小。

在双向复位模式中 , C164CI的RSTIN线可以由片选逻辑激活 ,以支持那些启动时需

要复位的外部设备 (如闪速存储器 )。

双向复位把内部复位源 (软件、看门狗 )反映到RSTIN引脚上 ,并把一个短的硬件复

位脉冲转换为最短内部复位序列的低电平输出。双向复位通过对寄存器 SYSCON 中的

位 BDRST EN 置“1”进行使能 , 并把 RSTIN从一个单纯的输入端改变为漏极开路 I/ O

端口。

8 .复位输出端RSTOUT

复位输出端RSTOUT为外部电路提供专门的复位信号。RSTOUT在复位序列开始

第 2 章 体 系 结 构

Page 113: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

102

后被激活。复位序列由RSTIN、监视定时器的溢出或由 SRST 指令触发。RSTOU T保持

低电平的激活状态 ,直到执行 EINI T 指令。这就使得在外部电路激活前可对控制器作初

始化。

注意 :在仿真模式期间 , RSTOU T用作输入 ,因此必须由外电路驱动。

9 .模拟电源端 VAREF和 VAGND

A/ D转换器的电源端 VA R EF和 VAGND为片内 ADC 提供一个单独的电源。它可以减少

由数字逻辑部分耦合到模拟输入端的噪波。为了改善转换结果的稳定性 ,应使 VA R EF 和

VAG ND与电源 VDD和 VSS适当去耦。

10 .电源端 VDD和 VSS

电源 VDD和 VSS为 C164CI 的数字逻辑部分供电。VDD/ VSS 的去耦电路尽可能挨着引

脚放置。为了得到最好的结果 ,建议使用两级去耦 ,例如广泛使用的把 100nF 的电容与

削除尖峰电流的 30 ~ 40pF电容并联。

注意 :所有 VDD引脚和 VS S引脚必须各自连到电源端和地。

亿恒 C164CI 16 位单片机

Page 114: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

指 令 系 统

3 .1 概 述

C164CI 单片机使用 C166/ C167 族单片机共有的指令系统 ,具有功能强、使用灵活等

优点。按精简指令集 ( RISC )的概念 ,对指令进行了优化和格式化 ,共有 230 条指令。每

条指令为 2 字节或 4 字节 ,其中 2 字节指令 129 条 , 4 字节指令 101 条。

1 .指令的功能特点

为了加强指令的功能和编程灵活性 ,方便程序编写 ,指令系统在模块化程序结构、循

环、跳转等方面进行了专门的设计和优化 ,并且将一些常用指令序列合并 ,简化成几条指

令 ,以便在更短的时间内完成相当的功能。该指令系统的主要特点如下 :

(1 ) 指令集效率高。绝大多数指令只需一个机器周期 ,只有子程序调用、分支、跳转、

返回等指令需要 2 个机器周期。另外 , 16 位乘法需要 5 个机器周期 ; 16 位除法需要 10 个

机器周期 ,但乘除指令可被中断。

(2 ) 功能强大的 8 位、16 位算术逻辑单元 ALU。16 位 ALU 可执行所有标准的算术

逻辑操作 ,对大多数内部执行模块进行了优化 ,以适合 8 位和 16 位数的计算。有独立的

乘除单元 ,可在 4 个和 9 个机器周期内分别完成 16 位与 16 位的乘 ,以及 16 位对 32 位的

除。为了加快软件实现浮点处理的速度 ,增加了数据规格化指令。上述这些措施大大增

强了 C164CI 的算术处理能力。

(3 ) 扩展的位处理能力。允许在一个指令中访问两个可寻址位 ,可以对 PSW 等专用

寄存器的位进行比较和修改 ,具有多位移位指令。

(4 ) 高性能的分支、调用和循环处理。对这些功能专门作了优化、分支和调用处理 ,

只需要增加一个额外周期。同时利用递增间接寻址方式和 PSW 表尾标志位的检测 ,可

实现简洁快速的查表功能。此外 ,根据 C语言的分支、循环语句特点 ,设计了相应的分支

和调用指令 ,使用非常方便。

(5 ) 可编程的多级中断机构。采取一些加快中断响应时间的措施 ,如乘除指令也可

中断 ,减少了进入中断的延时。还提供有识别运行出现异常和错误的“硬件陷阱”。

(6 ) 直接、间接、变址等多种寻址方式 ,及替代标准 DP P寻址的扩展寻址方式。

Page 115: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

104

表3-1 指令的助记符和寻址方式

助 记 符 寻址方式/ 字节数 助 记 符 寻址方式/ 字节数

ADD[ B] Rwn Rwm ① 2

ADDC[ B] Rwn [ Rwi] ① 2

AND[ B] Rwn [ Rwi + ] ① 2

OR[ B] Rwn # data3 ① 2

SUB[B] reg # data16 ② 4

SUBC[ B] reg mem 4

XOR[ B] mem reg 4

ASHR Rwn Rwm 2

ROL/ ROR Rwn # data4 2

SHL/ SHR

BAND bitaddrZ .z bitaddrQ .q 4

BCMP

BMOV

BMOVN

BOR

BXOR

BCLR bitaddrQ .q 2

BSE T

BFLDH bitoffQ # mask8 # data8 4

BFLDL

MOV [B] Rwn Rwm ① 2

Rwn # data4 ① 2Rwn [ Rwm] ① 2Rwn [ Rwm + ] ① 2[ Rwm] Rwn ① 2[ - Rwm] Rwn ① 2

[ Rwn ] [ Rwm] 2[ Rwn + ] [ Rwm] 2[ Rwn ] [ Rwm + ] 2reg # data16 ② 4Rwn [Rwm+ # d16] ① 4[Rwm + # d16] Rwn ① 4[ Rwn ] mem 4

mem [ Rwn] 4reg mem 4mem reg 4

MOVBS Rwn Rbm 2MOVBZ reg mem 4

mem reg 4EXTS Rwm # irang2 ③ 2

EXTSR # seg # irang2 4NOP - 2RE TRE TI

RE TS

CPL[B] Rwn ① 2

N EG [B]DIV Rwn 2

DIVL

DIVLU

DIVU

MUL Rwn Rwn 2

MUL U

CMPD1/ 2 Rwn # data4 2

CMPI1/ 2 Rwn # data16 4

Rwn mem 4

CMP[ B] Rwn Rwm ① 2

Rwn [ Rwi] ① 2

Rwn [ Rwi + ] ① 2

Rwn # data3 ① 2

reg # data16 ② 4

reg mem 4

CALLA cc caddr 4

JMPA

CALLI cc [ Rwn] 2

JMPI

CALLS seg caddr 4

JMPS

CALLR rel 2

JMPR cc rel 2

JB bitaddrQ .q rel 4

JBCJNBJNBS

PCAL L reg caddr 4POP reg 2PUSH

RET PSCXT reg # data16 4

reg mem 4

PRIOR Rwn Rwn 2

TRAP # trap7 2

A TOMIC # irang2 ③ 2

EXTR

EXT P Rwm # irang2 ③ 2

EXT PR # pag # irang2 4

SRST/ IDLE - 4

① 面向字节的指令 (带 B)使用 Rb 代替 R w(不用 Rwn )。② 面向字节的指令 (带 B)使用 # da ta8 代替 # dat a16。③ 在 8XC166 ( w )单片机中 ,不使用 ATOM IC 指令和扩展寻址指令。

亿恒 C164CI 16 位单片机

Page 116: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

105

(7 ) 统一的指令格式。指令代码规格化为单字和双字 ,都从偶地址字节开始存放 ,与

此同时也增大了相对寻址的范围。

2 .指令的格式

每条指令由操作码和操作数组成。操作码说明指令的操作类型。C164CI 指令系统

使用了 84 个操作码助记符 ,如表 3-1 所示。

操作数可以是 1 个、2 个或 3 个 ,也可以没有 ,取缺省值 ,完全由各种操作码决定。操

作数由立即数、字和字节的数据、位数据、转移的目的地址、分支的条件代码等组成。操作

数中所用的符号如表 3-2 所示。

表 3-2 操作数中的符号

类 型 符 号 意 义

数据寻址方式

Rw 字 GPR( R0 , R1 ,⋯ , R15 )

Rb 字节 GPR( RL0 , RH0 ,⋯ , RL7 , RH 7)

reg SFR 或是 GPR (对 SFR进行字节操作时 ,只有低字节可通过 reg 寻址 )

mem 字或字节存储器的地址

[⋯ ]

间接对字或字节存储器寻址 (在算术、逻辑和比较指令中 ,只有 R0~

R3 可用作间接寻址指针 ;其他指令中 ,任何一个字 GPR 都可用作间接寻址指针 )

bitaddr 可位寻址存储空间的位地址

bitoff 可位寻址存储空间的字的地址

# data 立即数 (其有效位数由所用的指令规定 )

# mask8 用于位域操作的 8位屏蔽立即数

分支指令目的地址的寻址方式

caddr 16 位跳转指令的目的地址 (直接更新指令指针 I P)

seg 2 位段地址 (直接更新代码段指针 CSP )

rel 相对于 IP 的有符号 8 位偏移地址

# t rap7 立即数 , 7 位陷阱号或是中断号

cc 分支的条件代码

扩展寻址方式 (替代一般的 DPP 寻址 )

# pag10 立即数 , 10 位页地址

# seg8 立即数 , 8 位段地址

# irang2 扩展寻址起作用的指令数

3 .指令的执行时间

各种指令的最小执行时间如表 3-3 所示。

表 3-3 最小指令执行时间

指 令 CPU 时钟周期 机 器 周 期

CALLI ,CALLA 4( + 2 ) 2( + 1 )

CALLS, CALLR , PCALL 4 2

JB , JBC , JNB, JNBS 4( + 2 ) 2( + 1 )

第 3 章 指 令 系 统

Page 117: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

106

续表

指 令 CPU 时钟周期 机 器 周 期

JMPS 4 2

JMPA, JMPI , JMPR 4( + 2 ) 2( + 1 )

MUL , MULU 10 5

DIV , DIVL , DIVU , DIVLU 20 10

MOV[ B] Rn , [ Rm + # da ta16] 4 2

RE T , RETI , RET P , RE TS 4 2

TRAP 4 2

其他 2 1

注 : 括号内的值表示分支条件未满足或用高速缓存跳转时增加的周期数。

3 .2 寻 址 方 式

C164CI 单片机的指令集具有多种强有力的寻址方式。对字、字节和位数据访问的寻

址方式包括短寻址、长寻址和间接寻址 ;对分支的目的地址的寻址方式包括绝对寻址、相

对寻址和间接寻址。下面逐一介绍这些寻址方式。

3 .2 .1 短寻址方式

短寻址方式用于访问 GPR , SFR 和可寻址位。使用一个隐含的基址来确定 18 位

(80C166 系列 )或是 24 位 ( 80C167 系列 )物理地址 ,其确定方式为

物理地址 = 基址 + Δ* 短地址

对字节 GPR 寻址时 ,系数Δ= 1;对字 GPR 寻址时 ,系数Δ= 2。

对短地址的说明如表 3-4 所示。

表 3-4 短地址说明

助记符 物理地址 短地址范围 可寻址空间

Rw (CP ) + 2 * Rw Rw = 0~15 GPR(字 )

Rb (CP ) + 1 * Rb Rb = 0~15 GPR(字节 )

00FE00 H + 2 * reg reg = 00 H~EFH SFR (字 ,低字节 )

reg00F000 H + 2 * reg① reg = 00 H~EFH ESFR(字 ,低字节)①

(CP ) + 2 * ( reg∧0FH ) reg = F0 H~FFH GPR(字 )

(CP ) + 1 * ( reg∧0FH ) reg = F0 H~FFH GPR(字节 )

00FD00 H + 2 * bitoff bitoff = 00 H~7FH RAM

bitoff 00FF00 H + 2 * ( bitoff∧FFH ) bitoff = 80 H~EFH SFR

(CP ) + 2 * ( bitoff∧0F H ) bitoff = F0 H~FFH GPR

bitaddrbitoff决定可位寻址所在字的地址 bitoff = 00 H~FF H 任何可寻址位

bitpos 决定寻址到的字中的哪一位 bitpos = 0~15

① 80C166 系列没有 ESF R。

亿恒 C164CI 16 位单片机

Page 118: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

107

1 . Rw和 Rb

对当前有效的工作寄存器组中的 GPR 进行直接寻址。

在指令格式中 , Rw 和 Rb 都需用 4 位表示。当前工作寄存器组 GPR 的基址由寄存

器 CP的内容决定。Rw 为字 GPR 相对于基址 ( CP)的 4 位地址 ; Rb 为字节 GPR 相对于

基址 ( CP)的 4 位地址。

2 . reg

对当前有效的工作寄存器组中的 GPR,或是任何 SFR , ESFR 直接寻址。

在指令格式中 , reg用 8 位表示。当 reg 的值在 00 H~EF H 范围内时 ,是对 SFR 或

是 ESFR 寻址。此时 ,系数Δ= 2。对标准 SFR 寻址时的基址是 00FE00H ,对扩展 ESFR

寻址时的基址是 00F000H。对 ESFR 寻址之前 ,需要用相应的 EXT R 指令选择基址。根

据指令的执行代码不同 ,可对 SFR 的整字 (字操作 )或是低字节 (字节操作 )寻址。而 SFR

的高字节无法通过 reg 寻址。当 reg 的值在 F0H~FF H 之间时 ,对 GPR 寻址 ,此时 ,只

有 reg 的低 4 位起作用。可以认为这时与 Rw , Rb 寻址方式相同。

3 . bitoff

对可位寻址的存储空间中任何字进行直接寻址。

在指令格式中 , bitoff 需用 8 位表示。根据 bitoff 所在范围的不同 ,使用不同的基址

产生物理地址。bitoff 从 00 H 到 7F H 时 ,基址取为 00FD00H ,即对内部 RAM 高端的

128 个字寻址 ( 00FD00 H~00FDFEH ) ; bitoff 从 80 H 到 EF H 时 ,基址取为 00FF00H ,对

内部 SFR 的高地址字寻址 ( 00FF00H~00FFDEH ) ,或是使用 00F100H 作基址 , 对内部

ESFR 的高地址字寻址 (00F100H~00F1DEH ) , bifoff 对 ESFR 寻址之前 ,需要用相应的

EXT R 指令选择基址 ; bitoff 从 F0 到 FF 时 ,只有低 4 位起作用 , 由寄存器 CP 决定工作

寄存器组的基址 ,对字 GPR 寻址。

4 . bitaddr

对可位寻址的存储空间中的位进行寻址。

一个可位寻址的地址 ,该位所在的字地址由 bitoff决定 ,该位在字中的位置由 bitpos

决定。因此 ,在指令格式中共需用 12 位表示。

3 .2 .2 长寻址方式

长寻址方式利用 4 个数据页指针寄存器 DPP 中的某一个 ,确定 18 位或 24 位物理地

址。可对整个寻址空间的任何字或字节数据寻址。

对任何一个 16 位长地址 ,要拆成两部分来理解。该 16 位地址的位 13~0 确定一个

14 位长的数据作页内偏移量 ,位 15 和位 14 的内容用来从 4 个数据页指针 DPP 中选出一

个 ,将 DPP中的后 4 位或后 10 位的页地址和 14 位页内偏移量连接起来 ,即得到 18 位或

第 3 章 指 令 系 统

Page 119: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

108

24 位物理地址 ,见图 3-1。

图 3-1 从 16 位长地址得到物理地址

长地址也可以直接使用页号和段号与低位地址拼接而成。

各种长地址表示的说明如表 3-5 所示。

表 3-5 长地址说明

助记符 物理地址 长地址范围 访问区域

( DPP0 ) ‖mem∧3FFF H 0000 H~3FFFH 任何字或字节

mem( DPP1 ) ‖mem∧3FFF H 4000 H~7FFFH

( DPP2 ) ‖mem∧3FFF H 8000 H~BFFFH

( DPP3 ) ‖mem∧3FFF H C000H~FFFFH

mem pag ‖mem∧3FFF H 0000 H~FFFFH (14 位 ) 任何字或字节

mem seg ‖mem 0000 H~FFFFH (16 位 ) 任何字或字节

3 .2 .3 扩展寻址方式

与 80C166 系列不同 , C164CI 单片机还提供了可暂时取代 DPP的扩展寻址方式。扩

展寻址利用 EXTP ( R )和 EXTS ( R )指令实现。在 EXTP ( R )指令中 , 用操作数代替了

DPP寄存器的内容 ;而在 EXTS( R)指令中 ,则直接将 16 位长地址连接到一个段基址后

面 ,这个段基址也是由操作数给出的 ,见图 3-2。

图 3-2 用扩展寻址得出物理地址

亿恒 C164CI 16 位单片机

Page 120: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

109

3 .2 .4 间接寻址方式

各种间接寻址方式可以认为是不同的短寻址方式和长寻址方式的组合。或者说 ,先

通过一个 4 位地址 ( Rw = 0~15 )直接寻址到一个字 GPR,再利用该字 GPR 的内容得到

一个 16 位长地址。在用 GPR 的内容计算 16 位地址时 ,可以先将 GPR 内容加上一个常

数作为 16 位地址 ,也可以对 G PR 的内容根据字操作或是字节操作的需要 ,进行增减 2 或

1 的运算。

与长寻址方式相同 ,用 4 个 DPP寄存器中的 1 个得出 18 位或 24 位物理地址。间接

寻址方式可以对整个寻址空间的任意字或字节寻址。

有些指令只使用 GPR 最低端的 4 个字 ( R0~R3 ) 作间接地址指针。这种情况使用

两位短寻址。

间接寻址方式中 ,物理地址的计算过程如下 :

(1 ) 根据寄存器 CP 的内容和短地址 Rw ,先确定间接地址指针 GPR 的物理地址。

GPR 地址 = ( CP) + 2 * 短地址

(2 ) 在产生 16 位长地址前 ,允许选用对该 GPR 的内容先进行递减 Δ(字节操作中

Δ= 1 ,字操作中Δ= 2) (可选的步骤 )。

( GPR 地址 ) = ( GPR 地址 ) - Δ

(3 ) 还允许选用对间接地址指针 GPR 的内容上加一个常数得到 16 位长地址。

16 位长地址 = (GPR 指针 ) + 常数

(4 ) 由 DPP寄存器和 16 位长地址得到 18 位或 24 位物理地址。

物理地址 = (DPPx) + 页内偏移量

(5 ) 允许选用对该 GPR 的内容进行递增Δ(字节操作中Δ= 1 ,字操作中Δ= 2) (可选

的步骤 )。

( GPR 地址 ) = ( GPR 地址 ) + Δ

综上所述 ,有以下 4 种间接寻址方式 ,如表 3-6 所示。

表 3-6 间接寻址

助 记 符 特 点

[ Rw ] 绝大多数指令允许使用任意一个 GPR( R0~R15)作为间接地址指针 ,但是 ,

有些指令只能采用 R0~R3这 4 个 GPR作间址指针

[ Rw + ] 间接地址指针在寻址完成后自动增加 2(字操作)或者 1(字节操作 )

[ - Rw] 间接地址指针在寻址之前自动减少 2(字操作)或者 1(字节操作)

[ Rw + # data16] 间接地址指针增加一个 16位常数再得到 16 位长地址

C166 系列指令集使用表示为字或字节的立即数。常数在指令格式中用 3 , 4 , 8 或是

16 位方式存储。因此 ,短的常数要用 0 来扩展 ;而对于长的常数 ,如果必须与相应操作的

数据格式匹配 ,则该常数会被截断。具体格式如表 3-7 所示。

第 3 章 指 令 系 统

Page 121: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

110

表 3-7 常数的表示和操作

助 记 符 字 操 作 字 节 操 作

# data3 0000 H + data3 00 H + data3

# data4 0000 H + data4 00 H + data4

# data8 0000 H + data8 data8

# data16 data16 data16∧FFH

# mask 0000 H + mask mask

注意 : 常数前面用 # 标记。

3 .2 .5 分支目的地址的寻址

对跳转或是调用指令的目的地址的寻址方式 ,包括绝对寻址、相对寻址和间接寻址 3

种。指令指针寄存器 IP 的内容可以用上述 3 种方式改变 ,而代码段指针寄存器 CSP 的

内容只能用一个数值直接更新。中断和陷阱向量表驻留在代码段 0 的最低地址部分 ,有

专门的寻址方式。各种寻址方式如表 3-8 所示。

表 3-8 分支目的地址的寻址

助 记 符 目 的 地 址 目 的 段 有效地址范围

caddr ( IP ) = caddr - caddr = 0000 H~FFFE H

rel( IP ) = ( IP ) + 2 * rel - rel = 00 H~7FH

( IP ) = ( IP ) - 2 * ( rel + 1) - rel = 80 H~FFH

[ Rw] ( IP ) = ( (CP ) + 2 * Rw) - Rw = 0~15

seg - ( CSP ) = seg seg = 0~255 (3 )

# t rap7 ( IP ) = 0000 H + 4 * trap7 ( CSP ) = 0000 H trap = 00 H~7FH

1 . caddr

直接给出当前代码段中的 16 位地址 IP。

程序不能跳转到奇地址处 ,所以 caddr的最低位只能是 0 ,否则会产生硬件陷阱。

2 . rel

给出相对于当前地址 IP (指向分支指令的下一条指令 )的 8 位偏移量。

rel是有符号数 ,当 rel的范围在 00~7F H 时 ,程序往前跳 ; rel的范围在 80 H~FF H

时 ,程序向回跳。当分支指令占一个字长 ,并且 rel = - 1 ,即 F F H 时 ,会重复执行该条指

令 ;对双字长的分支指令 , rel = - 2 ,即 FEH 时 ,重复执行该条指令。

3 . [Rw]

分支指令的目的地址由字 GPR 间接寻址得到。

与 caddr 方式相同 , GPR 内容的最低位只能是 0。

亿恒 C164CI 16 位单片机

Page 122: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

111

4 . seg

直接给出代码段地址。

80C166 系列支持 4 个代码段 ,而 C164CI 支持 256 个不同的代码段。因此 , seg 操作

数中只有最低两位或是最低 8 位用来更新 CSP寄存器。

5 . # trap7

给出中断号或是硬件陷阱号 ,通过中断向量表寻址跳转到相应的服务程序。

中断号可从 00 到 7F H ,由此可对代码段 0 中的从 000000 H 到 0001FCH 范围的任何

一个双字代码地址寻址 (如对中断向量表寻址 )。

3 .3 指 令 系 统

C164CI 单片机有 230 条指令 ,按其功能可分为 :

(1 ) 数据传送指令 42 条 ;

(2 ) 算术运算指令 62 条 ;

(3 ) 逻辑操作指令 46 条 ;

(4 ) 移位指令 11 条 ;

(5 ) 位操作指令 10 条 ;

(6 ) 比较指令 24 条 ;

(7 ) 转移指令 19 条 ;

(8 ) 系统控制指令 16 条。

下面分别介绍各类指令。

3 .3 .1 数据传送指令

数据传送指令包括传送指令和堆栈操作指令两部分 ,如表 3-9 所示。

表 3-9 数据传送指令

类 型 指 令 操 作 内 容

MOV 在寄存器、存储器或立即数之间进行字的传送

MOVB 在寄存器、存储器或立即数之间进行字节的传送

传送MOVBS 将寄存器或存储器中的字节传送到字寄存器或字存储器的低字节 ,并对高字

节进行符号位扩展

MOVBZ 将寄存器或存储器中的字节传送到字寄存器或字存储器的低字节 ,并将高字节扩展为 0

POP 从堆栈取数到字寄存器

堆栈操作 PUSH 将字寄存器的内容压入堆栈

SCXT 将字寄存器的内容压入堆栈 ,并修改字寄存器内容

第 3 章 指 令 系 统

Page 123: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

112

1 .传送指令

传送指令有 MOV , MOVB, MOVBS , MOVBZ 4 种。

(1 ) MOV指令进行字的数据传送 ,将源操作数的内容送到目的操作数中。这种指令

有如下 16 条。

助 记 符 功 能 说 明 字节数

MOV Rw, Rw 将字 GPR 的内容传送到另一个字 GPR 2

MOV Rw, # data4 将字立即数传送到字 GPR 2

MOV reg , # data16 将字立即数传送到直接寻址的字寄存器 4

MOV Rw, [ Rw] 将间接寻址的字存储器内容传送到 GPR 2

MOV Rw, [ Rw + ] 将间接寻址的字存储器内容传送到 GPR ,然后对源地址

指针加 22

MOV [ Rw] , Rw 将字 GPR 的内容送到间接寻址的字存储器 2

MOV [ - Rw] , Rw 先对目的地址指针减 2 ,然后将字 GPR 的内容传送到间

接寻址的存储器2

MOV [ Rw] , [ Rw ] 将间接寻址存储器的内容传送到间接寻址的字存储器 2

MOV [ Rw + ] , [ Rw ] 将间接寻址存储器的内容传送到间接寻址的字存储器 ,然

后对目的地址指针加 22

MOV [ Rw] , [ Rw + ] 将间接寻址存储器的内容传送到间接寻址的字存储器 ,然

后对源地址指针加 22

MOV Rw, [ Rw + # data16] 将间接寻址(源地址指针先增加一个常数 )的字存储器的

内容传送到字 GPR4

MOV [ Rw + # data16 ] , Rw 将字 GPR 的内容传送到间接寻址 (在目的地址指针上增

加一个常数)的字存储器4

MOV [ Rw] , mem 将直接寻址字存储器的内容传送到间接寻址的字存储器 4

MOV mem, [ Rw] 将间接寻址字存储器的内容传送到直接寻址的字存储器 4

MOV reg , mem 将直接寻址字存储器的内容传送到直接寻址的寄存器 4

MOV mem, reg 将直接寻址寄存器的内容传送到直接寻址的字存储器 4

MOV 指令根据传送数据的内容修改相应的状态标志位 E , Z , N ;标志位 V 和 C 不受

MOV 指令影响。标志位的设置如下 :

E 被传送数据等于最小负数时置“1”,否则清零。

Z 被传送数据等于 0 时 ,零标志位置“1”,否则清零。

N 被传送数据的最高位为 1 时 ,负数标志位置“1”,否则清零。

(2 ) MOVB 指令进行字节的数据传送 ,将源操作数的内容送到目的操作数中。这种

指令有如下 16 条。

亿恒 C164CI 16 位单片机

Page 124: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

113

助 记 符 功 能 说 明 字节数

MOVB Rb, Rb 将字节 GPR 的内容传送到另一个字节 GPR 2

MOVB Rb, # data4 将字节立即数传送到字节 GPR 2

MOVB reg , # da ta8 将字节立即数传送到直接寻址的寄存器低位字节 4

MOVB Rb, [ Rw] 将间接寻址的字节存储器内容传送到字节 GPR 2

MOVB Rb, [ Rw + ] 将间接寻址的字节存储器内容传送到字节 GPR,然后对源

地址指针加 12

MOVB [ Rw] , Rb 将字节 GPR 的内容送到间接寻址的字节存储器 2

MOVB [ - Rw] , Rb 先对目的地址指针减 1 ,然后将字节 GPR 的内容传送到间接

寻址的字节存储器2

MOVB [ Rw] , [ Rw ] 将间接寻址的字节存储器内容传送到间接寻址的存储器 2

MOVB [ Rw + ] , [ Rw ] 将间接寻址的字节存储器内容传送到间接寻址的字存储器 ,

然后对目的地址指针加 12

MOVB [ Rw] , [ Rw + ] 将间接寻址的字节存储器内容传送到间接寻址的字存储器 ,

然后对源地址指针加 12

MOVB Rb, [ Rw + # data16] 将间接寻址 (源地址指针先增加一个常数 )的字节存储器的

内容传送到字节 GPR4

MOVB [ Rw + # data16 ] , Rb 将字节 GPR 的内容传送到间接寻址 (目的地址指针先增加

一个常数 )的字节存储器4

MOVB [ Rw] , mem 将直接寻址的字节存储器内容传送到间接寻址的字节存储器 4

MOVB mem , [ Rw] 将间接寻址的字节存储器内容传送到直接寻址的字节存储器 4

MOVB reg , mem 将直接寻址的字节存储器内容传送到直接寻址的寄存器 4

MOVB mem , reg 将直接寻址寄存器的字节内容传送到直接寻址的字节存储器 4

MOVB指令根据传送字节的内容修改相应的状态标志位 E , Z , N ;标志位 V 和 C 不

受 MOVB 指令影响。标志位的设置如下 :

E 传送字节等于最小负数时置“1”,否则清零。

Z 传送字节等于 0 时 ,零标志位置“1”,否则清零。

N 传送字节的最高位为 1 时 ,负数标志位置“1”,否则清零。

(3 ) MOVBS指令将字节数据传送到目的字的低字节中 ,并根据传送字节的符号位

扩展目的字的高字节。当传送字节的最高位等于 1 时 ,目的字的高字节写入 FF H ,当传

送字节的最高位等于 0 时 ,目的字的高字节写入 00H。这种指令有如下 3 条。

助 记 符 功 能 说 明 字节数

MOVBS Rw , Rb 将字节 GPR 的内容传送到另一个字 GPR的低字节部分 ,并

扩展符号位2

MOVBS reg , mem 将直接寻址的字节存储器内容送到直接寻址的字寄存器的

低字节部分 ,并扩展符号位4

MOVBS mem , reg 将直接寻址寄存器的低字节内容送到直接寻址的字存储器

中 ,并扩展符号位4

第 3 章 指 令 系 统

Page 125: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

114

MOVBS指令根据传送数据的内容修改相应的状态标志位 E , Z, N ;标志位 V 和 C 不

受 MOVBS指令影响。标志位的设置如下 :

E 总是为零。

Z 传送字节等于 0 时 ,零标志位置“1”,否则清零。

N 传送字节的最高位为 1 时 ,负数标志位置“1”,否则清零。

(4 ) MOVBZ指令将字节数据传送到目的字的低字节中 ,并将目的字的高字节扩展

为 0。这种指令有如下 3 条。

助 记 符 功 能 说 明 字节数

MOVBZ Rw, Rb 将字节 GPR 的内容传送到另一个字 GPR 的低字节部分 ,

并将该 GPR 的高字节部分扩展为 02

MOVBZ reg , mem 将直接寻址的字节存储器内容送到直接寻址的字寄存器

的低字节部分 ,并将高字节部分扩展为 04

MOVBZ mem , reg 将直接寻址寄存器的低字节内容送到直接寻址到的字存

储器的低字节部分 ,并将高字节部分扩展为 04

MOVBZ指令根据传送数据的内容修改相应的状态标志位 E , Z , N ;标志位 V 和 C 不

受 MOVBZ 指令影响。标志位的设置如下 :

E 总是为零。

Z 被传送字节等于 0 时 ,零标志位置“1”,否则清零。

N 总是为零。

2 .堆栈操作指令

堆栈操作指令包括 POP , PU SH , SCXT 3 种。

(1 ) POP指令属于字操作 ,将堆栈指针所指的字取出 ,存放到 POP 操作数决定的目

的字中 ,并将堆栈指针增加 2。POP 指令只有 1 条。

助 记 符 功 能 说 明 字节数

POP reg 将字从堆栈取出 ,存放到直接寻址的字寄存器 2

PO P指令根据弹出堆栈的字的内容修改标志位 E , Z , N ;标志位 V 和 C 不受影响。

标志位的设置如下 :

E 当从堆栈弹出的字等于最小负数时 ,标志位 E置“1”,否则清零。

Z 当从堆栈弹出的字等于 0 时 ,零标志位置“1”,否则清零。

N 当从堆栈弹出的字的最高位等于 1 时 ,负数标志位置“1”,否则清零。

(2 ) PU SH 指令属于字操作 ,首先将堆栈指针减 2 ,然后将字数据压入堆栈。PU SH

指令只有 1 条。

助 记 符 功 能 说 明 字节数

PUSH reg 将字从直接寻址的字寄存器压入堆栈 2

亿恒 C164CI 16 位单片机

Page 126: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

115

P US H 指令根据压入堆栈的字的内容修改标志位 E , Z, N ;标志位 V 和 C 不受影响。

标志位的设置如下 :

E 当入栈字等于最小负数时 ,标志位 E置“1”,否则清零。

Z 当入栈字等于 0 时 ,零标志位置“1”,否则清零。

N 当入栈字的最高位等于 1 时 ,负数标志位置“1”,否则清零。

(3 ) SCXT 指令属于字操作 ,适用于变换任一寄存器的内容。该指令先将寄存器 (由

第一个操作数决定 )的内容压入堆栈 ,再将由第二个操作数确定的字数据加载到该寄存器

中。这种指令共有 2 条。

助 记 符 功 能 说 明 字节数

SCXT reg , # data16 将字寄存器的内容压入堆栈 ,再将立即数加载到寄存器中 4

SCXT reg , mem 将字寄存器的内容压入堆栈 ,再将直接寻址的字存储器的

内容加载到寄存器中4

SCXT 指令不影响标志位。

3 .3 .2 算术运算指令

运算指令包括加减指令和乘除指令两部分 ,如表 3-10 所示。

表 3-10 算术运算指令

类 型 指 令 操 作 内 容

ADD 两个字相加

ADDB 两个字节相加

ADDC 两个字带进位标志加法

加减ADDCB 两个字节带进位标志加法

SUB 两个字相减

SUBB 两个字节相减

SUBC 两个字带进位标志减法

SUBCB 两个字节带进位标志减法

MUL 两个字的有符号乘法

MULU 两个字的无符号乘法

乘除DIV 对寄存器 MDL 进行有符号除法 (16位/ 16 位)

DIVU 对寄存器 MDL 进行无符号除法 (16位/ 16 位)

DIVL 对寄存器 MD进行有符号除法 (32 位/ 16位 )

DIVLU 对寄存器 MD进行无符号除法 (32 位/ 16位 )

1 .加减指令

加减指令包括 ADD, ADDB, ADDC, ADDCB, SUB, SUBB, SUBC, SUBCB 等指令。

它们对字或字节以及进位标志执行 2 的补码加减法。它们影响标志位 E , Z, V , C 和 N。

第 3 章 指 令 系 统

Page 127: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

116

下 分别给予介绍。

(1 ) ADD指令属于字操作 ,对两个操作数执行 2 的补码加法 ,并将结果保存在第一

个操作数中。这种指令有如下 7 条。

助 记 符 功 能 说 明 字节数

ADD Rw , Rw 将两个字 GPR的内容相加 ,存放到第一个 GPR 中 2

ADD Rw , [ Rw ] 将间接寻址存储器的内容加到 GPR上 2

ADD Rw , [ Rw + ] 先将间接寻址存储器的内容加到 GPR上 ,再对源地址指针加 2 2

ADD Rw , # da ta3 将立即数加到字 GPR 上 2

ADD reg , # data16 将字立即数加到直接寻址寄存器上 4

ADD reg , mem 将直接寻址存储器的内容加到直接寻址寄存器上 4

ADD mem , reg 将直接寻址寄存器的内容加到直接寻址存储器上 4

ADD指令影响标志位 E , Z , V , C, N。标志位的设置为 :

E 当第二个操作数的内容等于最小负数时 ,标志位 E 置“1”,否则清零。用做表尾

信号。

Z 当加法结果等于 0 时 ,零标志位置“1”,否则清零。

V 当发生算术溢出时 ,溢出标志位置“1”,否则清零。

C 最高位产生进位时 ,进位标志置“1”,否则清零。

N 当结果的最高位为 1 时 ,负数标志置“1”,否则清零。

(2 ) ADDB 指令属于字节操作 ,对两个操作数执行 2 的补码加法 ,并将结果保存在第

一个操作数中。这种指令有如下 7 条。

助 记 符 功 能 说 明 字节数

ADDB Rb , Rb 将两个字节 GPR 的内容相加 ,存放到第一个 GPR 中 2

ADDB Rb , [ Rw ] 将间接寻址的字节存储器的内容加到字节 GPR 上 2

ADDB Rb , [ Rw + ] 先将间接寻址的字节存储器的内容加到字节 GPR 上 ,再对源地

址指针增加 12

ADDB Rb , # da ta3 将立即数加到字节 GPR 上 2

ADDB reg , # data8 将字节立即数加到直接寻址寄存器上 4

ADDB reg , mem 将直接寻址到的字节存储器的内容加到寄存器上 4

ADDB mem , reg 将直接寻址寄存器的低字节内容加到直接寻址存储器上 4

ADDB指令对标志位 E , Z , V , C, N 的影响与 ADD指令相同。

(3 ) ADDC 指令属于字操作 ,对两个操作数以及进位标志执行 2 的补码加法 ,并将

结果保存在第一个操作数中。ADDC 指令可用于实现多精度加法。这种指令有如下

7 条。

亿恒 C164CI 16 位单片机

Page 128: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

117

助 记 符 功 能 说 明 字节数

ADDC Rw , Rw 将两个字 GPR的内容带进位相加 ,存放到第一个 GPR 中 2

ADDC Rw , [ Rw ] 将间接寻址存储器的内容带进位加到 GPR上 2

ADDC Rw , [ Rw + ] 先将间接寻址存储器的内容带进位加到 GPR 上 ,再对源地址指针

增加 22

ADDC Rw , # data3 将立即数带进位加到字 GPR 上 2

ADDC reg , # da ta16 将字立即数带进位加到直接寻址寄存器上 4

ADDC reg , mem 将直接寻址存储器的内容带进位加到寄存器上 4

ADDC mem , reg 将直接寻址寄存器的内容带进位加到直接寻址存储器上 4

ADDC 指令影响标志位 E , Z, V, C, N。标志位的设置为 :

E 当第二个操作数的内容等于最小负数时 ,标志位 E置“1”,否则清零。

Z 在加法结果等于 0 ,并且零标志位已经置“1”的条件下 ,零标志位继续置“1”,否则

清零。

V 当发生算术溢出时 ,溢出标志位置“1”,否则清零。

C 最高位产生进位时 ,进位标志置“1”,否则清零。

N 当结果的最高位为 1 时 ,负数标志置“1”,否则清零。

(4 ) ADDCB指令属于字节操作 ,对两个字节操作数和进位标志执行 2 的补码加法 ,

并将结果保存在第一个操作数中。该指令可用来实现多精度加法。这种指令有 7 条。

助 记 符 功 能 说 明 字节数

ADDCB Rb, Rb 将两个字节 GPR的内容带进位相加 ,存放到第一个 GPR 中 2

ADDCB Rb, [ Rw ] 将间接寻址到的字节存储器的内容带进位加到字节 GPR 上 2

ADDCB Rb, [ Rw + ] 先将间接寻址到的字节存储器的内容带进位加到 GPR 上 ,再对源

地址指针增加 12

ADDCB Rb, # data3 将立即数带进位加到字节 GPR 上 2

ADDCB reg , # data8 将字节立即数带进位加到直接寻址寄存器上 4

ADDCB reg , mem 将直接寻址到的字节存储器的内容带进位加到寄存器上 4

ADDCB mem , reg 将直接寻址寄存器的低字节内容带进位加到直接寻址存储器上 4

ADDCB 指令对标志位 E , Z , V , C, N 的影响与 ADDC指令相同。

(5 ) SUB 指令属于字操作 ,第一个操作数是被减数 ,第二个操作数是减数 ,执行 2 的

补码减法 ,结果保存在第一个操作数中。这种指令有如下 7 条。

助 记 符 功 能 说 明 字节数

SUB Rw, Rw 从第一个字 GPR的内容中减去第二个 GPR 的内容 2

SUB Rw, [ Rw] 从 GPR的内容中减去间接寻址存储器的内容 2

SUB Rw, [ Rw + ] 先从 GPR的内容中减去间接寻址存储器的内容 ,再对源地址指针

增加 22

第 3 章 指 令 系 统

Page 129: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

118

续表

助 记 符 功 能 说 明 字节数

SUB Rw, # data3 从字 GPR的内容中减去一个立即数 2

SUB reg , # data16 从寄存器的内容中减去一个立即数 4

SUB reg , mem 从寄存器的内容中减去直接寻址存储器的内容 4

SUB mem , reg 从直接寻址存储器的内容中减去寄存器的内容 4

SUB指令影响标志位 E , Z, V , C, N。标志位的设置为 :

E 当第二个操作数 (减数 )的内容等于最小负数时 ,标志位 E 置“1”,否则清零。用

做表尾信号。

Z 当减法结果等于 0 时 ,零标志位置“1”,否则清零。

V 当发生算术溢出时 ,溢出标志位置“1”,否则清零。

C 需要借位时 ,进位标志置“1”,否则清零。

N 当结果的最高位为 1 时 ,负数标志置“1”,否则清零。

(6 ) SUBB 指令属于字节操作 ,第一个操作数是被减数 ,第二个操作数是减数 ,执行 2

的补码减法 ,结果保存在第一个操作数中。这种指令也有 7 条。

助 记 符 功 能 说 明 字节数

SUBB Rb , Rb 从第一个字节 GPR 的内容中减去第二个字节 GPR的内容 2

SUBB Rb , [ Rw] 从字节 GPR的内容中减去间接寻址到的字节存储器的内容 2

SUBB Rb , [ Rw + ] 先从字节 GPR的内容中减去间接寻址到的字节存储器的内容 ,再

对源地址指针增加 12

SUBB Rb , # data3 从字节 GPR的内容中减去一个立即数 2

SUBB reg , # data8 从寄存器的低字节内容中减去一个立即数 4

SUBB reg , mem 从寄存器的低字节内容中减去直接寻址到的字节存储器的内容 4

SUBB mem , reg 从直接寻址到的字节存储器的内容中减去寄存器低字节的内容 4

SUBB 指令对标志位 E , Z, V , C, N的影响与 SUB 指令相同。

(7 ) SUBC指令属于字操作 ,第一个操作数是被减数 ,第二个操作数是减数 ,执行 2

的补码减法 ,从被减数中减去减数和借位 ,结果保存在第一个操作数中。该指令可用来实

现多精度减法。这种指令有如下 7 条。

助 记 符 功 能 说 明 字节数

SUBC Rw ,Rw 从第一个字 GPR的内容中减去第二个 GPR 的内容和借位 2

SUBC Rw , [ Rw ] 从 GPR的内容中减去间接寻址存储器的内容和借位 2

SUBC Rw , [ Rw + ] 先从 GPR的内容中减去间接寻址存储器的内容和借位 ,再对源地

址指针增加 22

SUBC Rw , # data3 从字 GPR的内容中减去立即数及借位 2

SUBC reg , # data16 从寄存器的内容中减去立即数及借位 4

SUBC reg , mem 从寄存器的内容中减去直接寻址存储器的内容和借位 4

SUBC mem , reg 从直接寻址存储器的内容中减去存储器的内容和借位 4

亿恒 C164CI 16 位单片机

Page 130: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

119

SUBC 指令对标志位 E , Z , V , C, N 的影响与 SUB 指令相同。

(8 ) SUBCB 指令属于字节操作 ,第一个操作数是被减数 ,第二个操作数是减数 ,执行

2 的补码减法 ,从被减数中减去减数和借位 ,结果保存在第一个操作数中。该指令可用来

实现多精度减法。这种指令也有 7 条。

助 记 符 功 能 说 明 字节数

SUBCB Rb ,Rb 从第一个字节 GPR的内容中减去第二个字节 GPR 的内容和借位 2

SUBCB Rb , [ Rw ] 从字节 GPR 的内容中减去间接寻址的字节存储器的内容和借位 2

SUBCB Rb , [ Rw + ] 先从字节 GPR 的内容中减去间接寻址的字节存储器的内容和借

位 ,再对源地址指针增加 12

SUBCB Rb , # data3 从字节 GPR 的内容中减去立即数及借位 2

SUBCB reg , # data8 从寄存器的低字节内容中减去立即数及借位 4

SUBCB reg , mem 从寄存器的低字节内容中减去直接寻址的字节存储器的内容和借位 4

SUBCB mem , reg 从直接寻址的字节存储器的内容中减去字节寄存器低字节的内容和借位 4

SUBCB指令对标志位 E , Z, V , C, N 的影响与 SUB指令相同。

2 .乘除指令

乘除指令包括 MUL , MULU , DIV , DIVL , DIVLU , DIVU。乘除法指令分为有符号

乘除法和无符号乘除法。同时 ,除法指令还包括了字的除法和双字的长除法。因此 ,各种

乘除法的使用十分方便。上述 6 种乘除法指令各只有 1 条 ,且都使用了 MD寄存器作为

隐含的源或是目的操作数。所有的乘除法指令影响标志位 Z, V , N ;标志位 E 和 C 总是

清零。下面分别给予介绍。

(1 ) MUL 指令对两个字操作数执行 16 位乘 16 位的有符号乘法 ,得到的 32 位结果

存放在 MD寄存器中。该指令只有 1 条。

助 记 符 功 能 说 明 字节数

MUL Rw ,Rw 将两个字 GPR的内容有符号相乘 ,结果存放在 MD中 2

MUL 指令影响标志位 Z , V和 N ;标志位 E和 C 总是为零。标志位的设置为 :

Z 结果为 0 时置“1”,否则清零。

V 当结果无法在字长范围内表示时置“1”,否则清零。

N 当结果最高位为 1 时置“1”,否则清零。

(2 ) MULU 指令对两个字操作数执行 16 位乘 16 位的无符号乘法 ,得到的 32 位结

果存放在 MD寄存器中。该指令只有 1 条。

助 记 符 功 能 说 明 字节数

MULU Rw , Rw 将两个字 GPR的内容无符号相乘 ,结果存放在 MD中 2

MULU 指令对标志位的影响与 MUL 指令相同。

第 3 章 指 令 系 统

Page 131: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

120

(3 ) DIV指令只有一个字操作数作为除数 ,被除数存放在寄存器 MDL 中 ,执行有符

号的 16 位和 16 位的除法 ,有符号商存放在 MDL 中 ,余数存放在 MDH 中。该指令只有

1 条。

助 记 符 功 能 说 明 字节数

DIV Rw 用 GPR的内容去除 MDL的内容 2

DIV 指令影响标志位 Z, V 和 N ;标志位 E 和 C总是为零。标志位的设置为 :

Z 结果为 0 时置“1”,否则清零。

V 当结果无法在字长范围内表示 ,或是除数 (操作数 )等于零时 ,溢出标志位置“1”,

否则清零。

N 当结果最高位为 1 时置“1”,否则清零。

(4 ) DIVU 指令只有一个字操作数作为除数 ,被除数存放在寄存器 MDL 中 ,执行无

符号的 16 位和 16 位的除法 ,无符号商存放在 MDL 中 ,余数存放在 MDH 中。该指令只

有 1 条。

助 记 符 功 能 说 明 字节数

DIVU Rw 用 GPR的内容去除 MDL的内容 ,无符号除 2

DIVU 指令对标志位的影响与 DIV 指令相同。

(5 ) DIVL指令只含有一个字操作数作为除数 ,用来实现被除数是双字的长除法。被

除数存放在寄存器 MD中 ,执行有符号的 32 位除以 16 位的长除。有符号商存放在 MDL

中 ,余数存放在 MDH 中。该指令只有 1 条。

助 记 符 功 能 说 明 字节数

DIVL Rw 用 GPR的内容去除 MD 的内容 2

DIVL 指令对标志位的影响与 DIV指令相同。

(6 ) DIVLU 指令只含有一个字操作数作为除数 ,被除数是双字 ,存放在寄存器 MD

中 ,执行无符号的 32 位除以 16 位的长除。无符号商存放在 MDL 中 ,余数存放在 MDH

中。该指令只有 1 条。

助 记 符 功 能 说 明 字节数

DIVLU Rw 用 GPR的内容去除 MD 的内容 ,无符号除 2

DIVLU 指令对标志位的影响与 DIV 指令相同。

3 .3 .3 逻辑操作指令

逻辑操作指令包括 AND, ANDB, OR, ORB, XOR, XORB, CPL , CPLB, NEG 和

NEGB,即字或是字节的与、或、异或、取反和求负运算 ,如表 3-11 所示。

亿恒 C164CI 16 位单片机

Page 132: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

121

表 3-11 逻辑操作指令

类 型 指 令 操 作 内 容

AND 两个字的按位与ANDB 两个字节的按位与

OR 两个字的按位或ORB 两个字节的按位或

逻辑操作XOR 两个字的按位异或XORB 两个字节的按位异或

CPL 对字取反CPLB 对字节取反NEG 对字求负NEGB 对字节求负

(1 ) AND指令属于字操作 ,对两个字操作数执行按位与运算 ,结果保存在第一个操

作数中。这种指令有如下 7 条。

助 记 符 功 能 说 明 字节数

AND Rw , Rw 对 GPR和 GPR 的内容进行按位与 2

AND Rw , [ Rw ] 对 GPR和间接寻址存储器的内容进行按位与 2

AND Rw , [ Rw + ] 对 GPR和间接寻址存储器的内容进行按位与 ,然后对源地址指针

加 22

AND Rw , # da ta3 对 GPR和立即数进行按位与 2

AND reg , # data16 对寄存器和立即数进行按位与 4

AND reg , mem 对寄存器和直接寻址存储器的内容按位与 4

AND mem , reg 对直接寻址存储器的内容和寄存器的内容按位与 4

AND指令影响标志位 E , Z , N ;标志位 V和 C 总是为零。标志位的设置为 :

E 当第二个操作数等于最小负数时 ,标志位置“1”,否则清零。

Z 当结果等于 0 时置“1”,否则清零。

N 当结果的最高位为 1 时置“1”,否则清零。

(2 ) ANDB 指令属于字节操作 ,对两个字节操作数执行按位与运算 ,结果保存在第一

个操作数中。这种指令有如下 7 条。

助 记 符 功 能 说 明 字节数

ANDB Rb , Rb 对字节 GPR和字节 GPR的内容进行按位与 2

ANDB Rb , [ Rw ] 对字节 GPR和间接寻址的字节存储器的内容进行按位与 2

ANDB Rb , [ Rw + ] 对字节 GPR和间接寻址的字节存储器的内容进行按位与 ,然后对

源地址指针增加 12

ANDB Rb , # da ta3 对字节 GPR和立即数进行按位与 2

ANDB reg , # data8 对寄存器低字节和立即数进行按位与 4

ANDB reg , mem 对寄存器低字节和直接寻址的字节存储器的内容按位与 4

ANDB mem , reg 对直接寻址的字节存储器的内容和寄存器低字节的内容按位与 4

第 3 章 指 令 系 统

Page 133: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

122

ANDB指令对标志位的影响与 AND指令相同。

(3 ) OR 指令属于字操作 ,对两个字操作数执行按位或运算 ,结果保存在第一个操作

数中。这种指令有如下 7 条。

助 记 符 功 能 说 明 字节数

OR Rw , Rw 对 GPR和 GPR 的内容进行按位或 2

OR Rw , [ Rw ] 对 GPR和间接寻址存储器的内容进行按位或 2

OR Rw , [ Rw + ] 对 GPR和间接寻址存储器的内容进行按位或 ,然后对源地址指针

加 22

OR Rw , # da ta3 对 GPR和立即数进行按位或 2

OR reg , # data16 对寄存器和立即数进行按位或 4

OR reg , mem 对寄存器和直接寻址存储器的内容按位或 4

OR mem , reg 对直接寻址存储器的内容和寄存器的内容按位或 4

OR 指令对标志位的影响与 AND指令相同。

(4 ) ORB 指令属于字节操作 ,对两个字节操作数执行按位或运算 ,结果保存在第一

个操作数中。这种指令有如下 7 条。

助 记 符 功 能 说 明 字节数

ORB Rb , Rb 对字节 GPR和字节 GPR的内容进行按位或 2

ORB Rb , [ Rw ] 对字节 GPR和间接寻址的字节存储器的内容进行按位或 2

ORB Rb , [ Rw + ] 对字节 GPR和间接寻址的字节存储器的内容进行按位或 ,然后对

源地址指针加 12

ORB Rb , # da ta3 对字节 GPR和立即数进行按位或 2

ORB reg , # data8 对寄存器低字节和立即数进行按位或 4

ORB reg , mem 对寄存器低字节和直接寻址的字节存储器的内容按位或 4

ORB mem , reg 对直接寻址的字节存储器的内容和寄存器低字节的内容按位或 4

OR 指令对标志位的影响与 AND指令相同。

(5 ) XOR 指令属于字操作 ,对两个字操作数执行按位异或运算 ,结果保存在第一个

操作数中。这种指令有如下 7 条。

助 记 符 功 能 说 明 字节数

XOR Rw , Rw 对 GPR和 GPR 的内容进行按位异或 2

XOR Rw , [ Rw ] 对 GPR和间接寻址存储器的内容进行按位异或 2

XOR Rw , [ Rw + ] 对 GPR和间接寻址存储器的内容进行按位异或 ,然后对源地址指

针增加 22

XOR Rw , # data3 对 GPR和立即数进行按位异或 2

XOR reg , # data16 对寄存器和立即数进行按位异或 4

XOR reg , mem 对寄存器和直接寻址存储器的内容按位异或 4

XOR mem , reg 对直接寻址存储器的内容和寄存器的内容按位异或 4

亿恒 C164CI 16 位单片机

Page 134: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

123

XOR 指令对标志位的影响与 AND指令相同。

(6 ) XORB 指令属于字节操作 ,对两个字节操作数执行按位异或运算 ,结果保存在第

一个操作数中。这种指令有如下 7 条。

助 记 符 功 能 说 明 字节数

XORB Rb , Rb 对字节 GPR和字节 GPR的内容进行按位异或 2

XORB Rb , [ Rw ] 对字节 GPR和间接寻址的字节存储器的内容进行按位异或 2

XORB Rb , [ Rw + ] 对字节 GPR和间接寻址的字节存储器的内容进行按位异或 ,然后

对源地址指针加 12

XORB Rb , # data3 对字节 GPR和立即数进行按位异或 2

XORB reg , # data8 对寄存器低字节和立即数进行按位异或 4

XORB reg , mem 对寄存器低字节和直接寻址的字节存储器的内容按位异或 4

XORB mem , reg 对直接寻址的字节存储器的内容和寄存器低字节的内容按位异或 4

XORB 指令对标志位的影响与 AND指令相同。

(7 ) CPL 指令对字操作数取反。该指令只有 1 条。

助 记 符 功 能 说 明 字节数

CPL Rw 对字 GPR的内容取反 ,结果仍存放在字 GPR 中 2

CPL 指令影响标志位 E , Z 和 N ;标志位 V 和 C 总是为零。标志位的设置为 :

E 当操作数等于最小负数时置“1”,否则清零。

Z 结果为零时置“1”,否则清零。

N 当最高位为 1 时置“1”,否则清零。

(8 ) CPLB 指令对字节操作数取反。该指令只有 1 条。

助 记 符 功 能 说 明 字节数

CPLB Rb 对字节 GPR的内容取反 ,结果仍存放在字节 GPR 中 2

CPLB指令对标志位 E , Z和 N 的影响与 CPL 指令相同。

(9 ) NEG指令对字操作数执行二进制 2 的补码运算 ,求得该操作数的负数。该指令

只有 1 条。

助 记 符 功 能 说 明 字节数

NEG Rw 对字 GPR的内容求负 ,结果仍存放在字 GPR 中 2

NEG 指令影响标志位 E , Z , V , C 和 N。标志位的设置为 :

E 当操作数等于最小负数时置“1”,否则清零。

Z 结果为零时置“1”,否则清零。

V 结果溢出时置“1”,否则清零。

C 发生借位时置“1”,否则清零。

第 3 章 指 令 系 统

Page 135: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

124

N 当最高位为 1 时置“1”,否则清零。

(10) NEGB 指令对字节操作数执行二进制 2 的补码运算 ,求得该操作数的负数。该

指令只有 1 条。

助 记 符 功 能 说 明 字节数

NEGB Rb 对字节 GPR的内容求负 ,结果仍存放在字节 GPR 中 2

NEGB指令对标志位的影响与 NEG指令相同。

3 .3 .4 移位指令

移位指令包括 SH L , S H R, ROL , ROR , AS HR 和 PRIOR, 涉及在字长位数内的移

位、循环移位、保留符号位的算术移位以及一个规格化指令。如表 3-12 所示。

表 3-12 移位指令

类 型 指 令 操 作 内 容

移位 SH L 字的左移位操作 ,低位补 0

SHR 字的右移位操作 ,高位补 0

ROL 字的循环左移位

ROR 字的循环右移位

ASHR 字的保留符号位的算术右移位 ,除符号位保留外其他的高位补 0

PRIOR 对字进行左移位操作 ,直至该字的最高位为 1 ,并保存左移的位数

(1 ) S HL 指令对第一个操作数进行左移位 ,移位的位数由第二个操作数决定。被移

位操作数的低位填补 0 ,相应的高位移到进位标志位中。有效的移位位数 (第二个操作

数 )在 0~15 之间。如果用 GPR 的内容作为移位位数 ,只有低 4 位有效。这种指令共有

2 条。

助 记 符 功 能 说 明 字节数

SH L Rw , Rw 对第一个 GPR的内容左移位 ,移位的位数由第二个 GPR 给出 2

SH L Rw , # data4 对 GPR的内容左移位 ,移位的位数由立即数给出 2

SH L指令影响标志位 Z , C, N ;标志位 E 和 V 总是为零。标志位的设置为 :

Z 结果为零时置“1”,否则清零。

C 进位标志位的内容为最后一次左移位移出的最高位 ,当移位的位数是零时 ,该标

志位清零。

N 结果的最高位为 1 时置“1”,否则清零。

(2 ) S H R 指令对第一个操作数进行右移位 ,移位的位数由第二个操作数决定。被移

位操作数的高位填补 0 ,相应的低位移位到进位标志位中。有效的移位位数 (第二个操作

数 )在 0~15 之间。如果用 GPR 的内容作为移位位数 ,只有低 4 位有效。S HR 指令和

SH L指令不同的一点在于 , S HR 指令利用溢出标志位来记录因右移出而丢掉的位中是

亿恒 C164CI 16 位单片机

Page 136: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

125

否有“1”。这种指令也有 2 条。

助 记 符 功 能 说 明 字节数

SHR Rw, Rw 对第一个 GPR的内容右移位 ,移位的位数由第二个 GPR 给出 2

SHR Rw, # data4 对 GPR的内容右移位 ,移位位数由立即数给出 2

SH R 指令影响标志位 Z , C, N 和 V ;标志位 E 总是为零。标志位的设置为 :

Z 结果为零时置“1”,否则清零。

C 进位标志位的内容为最后一次右移位移出的最低位 ,当移位的位数是零时 ,该标

志位清零。

N 结果的最高位为 1 时置“1”,否则清零。

V 在右移位过程中 ,从被移位操作数移出的位中有 1 存在时置“1”;当右移位移出

的所有位都是“0”时清零。当移位的位数是零时也清零。

(3 ) ROL指令对第一个操作数进行左循环移位 ,移位位数由第二个操作数决定。在

每次移位中 ,相应的最高位移到最低位和进位标志中。有效的移位位数 (第二个操作数 )

在 0~15 之间。如果用 GPR 的内容作为移位位数 ,只有低 4 位有效。这种指令有 2 条。

助 记 符 功 能 说 明 字节数

ROL Rw , Rw 对第一个 GPR的内容左循环移位 ,移位的位数由第二个 GPR给出 2

ROL Rw , # data4 对 GPR的内容左循环移位 ,移位的位数由立即数给出 2

ROL 指令影响标志位 Z, C, N ;标志位 E和 V 总是为零。标志位的设置为 :

Z 结果为零时置“1”,否则清零。

C 进位标志位的内容为最后一次左循环移位移出的最高位 ,也是最后结果的最低

位 ,当移位的位数是零时 ,该标志位清零。

N 结果的最高位为 1 时置“1”,否则清零。

(4 ) ROR 指令对第一个操作数进行右循环移位 ,移位位数由第二个操作数决定。在

每次移位中 ,相应的最低位移到最高位和进位标志中。有效的移位位数 (第二个操作数 )

在 0~15 之间。如果用 GPR 的内容作为移位位数 , 只有低 4 位有效。这种指令也有

2 条。

助 记 符 功 能 说 明 字节数

ROR Rw , Rw 对第一个 GPR的内容右循环移位 ,移位的位数由第二个 GPR给出 2

ROR Rw , # data4 对 GPR的内容右循环移位 ,移位的位数由立即数给出 2

ROR 指令影响标志位 Z, C, N和 V;标志位 E总是为零。标志位的设置为 :

Z 结果为零时置“1”,否则清零。

V 循环移位过程中有 1 右移到进位标志中时置“1”;当所有移入进位标志位的位都

是“0”或在移位的位数是零时清零。

C 进位标志位的内容为最后一次右循环移位移出的最低位 ,也是最后结果的最高

第 3 章 指 令 系 统

Page 137: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

126

位 ,当移位的位数是零时 ,该标志位清零。

N 结果的最高位为 1 时置“1”,否则清零。

(5 ) ASH R 指令是保留符号位的算术右移位指令。对第一个操作数进行右移位 ,移

位的位数由第二个操作数决定。移位后的最高位始终等于原操作数的最高位 ,即符号位。

其他的高位补 0 ,相应的低位移位到进位标志位中。有效的移位位数 (第二个操作数 )在

0~15 之间。如果用 G PR 的内容作为移位的位数 ,只有低 4 位有效。ASH R 指令与 S HR

指令相同 ,也用溢出标志位来记录在右移出而丢掉的位中是否有“1”。这种指令共有

2 条。

助 记 符 功 能 说 明 字节数

ASHR Rw , Rw 对第一个 GPR的内容算术右移位 ,移位的位数由第二个 GPR给出 2

ASHR Rw , # data4 对 GPR的内容算术右移位 ,移位的位数由立即数给出 2

AS H R 指令影响标志位 Z, C, N和 V ;标志位 E总是为零。标志位的设置为 :

Z 结果为零时置“1”,否则清零。

C 进位标志位的内容为最后一次右移位移出的最低位 ,当移位位数是零时 ,该标志

位清零。

N 结果的最高位为 1 时置“1”,否则清零。

V 在右移位过程中 ,从被移位操作数移出的位中有 1 存在时置“1”;当右移位移出

的所有位都是 0 时清零。当移位位数是 0 时也清零。

(6 ) PRIOR 指令对第二个操作数 (非零 )进行左移位 (低位补 0 ) ,直至最高位等于 1

时停止 ,并将移位位数保存在第一个操作数中。当第二个操作数等于零时 ,第一个操作数

中写入零 ,并将零标志位置“1”。该指令只有 1 条。

助 记 符 功 能 说 明 字节数

PRIOR Rw , Rw 对第二个 GPR的内容规格化 ,移位的位数放在第一个 GPR中 2

PRIOR 指令只影响零标志位 ,当第二个操作数等于零时置“1”,否则清零。其他的标

志位总是清零。

3 .3 .5 位操作指令

这些指令是对可寻址位的各种操作 ,包括位的设置、传送、逻辑运算、位的比较以及位

的屏蔽等。允许的指令操作如表 3-13 所示。

表 3-13 位 操 作

类 型 指 令 操 作 内 容

设置BCLR 清零

BSE T 置“1”

传送 BMOV 位的传送

亿恒 C164CI 16 位单片机

Page 138: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

127

续表

类 型 指 令 操 作 内 容

传送 BMOVN 位取“反”后传送

BAND 与

逻辑运算 BOR 或

BXOR 异或

比较 BCMP 位的比较

屏蔽BFLDH 用立即数屏蔽直接寻址字存储器的高字节

BFLDL 用立即数屏蔽直接寻址字存储器的低字节

1 .设置指令

位设置操作包括对直接寻址位的置“1”或是清零。

(1 ) BSET 指令对直接寻址位置“1”。主要用于对周边电路和系统的控制。该指令

只有 1 条。

助 记 符 功 能 说 明 字节数

BSET bitaddr 对直接寻址位置“1” 2

BSE T 指令执行完后 ,标志位 N中保留了该位的原有值 ,其“反”保留在标志位 Z中。

其他的标志位清零。

(2 ) BCLR 指令对直接寻址位清零。主要用于周边电路和系统的控制。该指令只有

1 条。

助 记 符 功 能 说 明 字节数

BCLR bitaddr 对直接寻址位清零 2

BCL R 指令执行完后 ,标志位 N中保留了该位的原有值 ,其“反”保留在标志位 Z中。

其他的标志位清零。

2 .位传送指令

位的传送操作包括 BMOV 和 BMOVN 两条指令。

(1 ) BMOV 指令将由第二个操作数确定的源位传送到由第一个操作数确定的目的

位中。该指令只有 1 条。

助 记 符 功 能 说 明 字节数

BMOV bitaddr , bitaddr 将第二个可寻址位传送到第一个可寻址位中 4

BMOV指令执行完后 ,在标志位 N 和 Z中分别保存了源位原有状态及其“反”,其他

标志位清零。

(2 ) BMOVN 指令将由第二个操作数确定的源位求“反”后 ,传送到由第一个操作数

确定的目的位中。该指令只有 1 条。

第 3 章 指 令 系 统

Page 139: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

128

助 记 符 功 能 说 明 字节数

BMOVN bitaddr , bitaddr 将第二个可寻址位的“反”传送到第一个可寻址位中 4

BMOVN 指令执行完后 ,在标志位 N 和 Z 中分别保存了源位原有状态及其“反”,其

他标志位清零。

3 .位逻辑运算指令

位的逻辑运算包括位的“与”、“或”和“异或”指令 ,即 BAND, BOR , BXOR 指令。

(1 ) BAND指令将由第二操作数确定的源位和由第一操作数确定的目的位相“与”的

结果存放在目的位中。该指令只有 1 条。

助 记 符 功 能 说 明 字节数

BAND bitaddr , bitaddr 两个可寻址位的“与” 4

BAND指令影响标志位 Z , V , C, N。实际上 Z , V , C, N 中分别是两个可寻址位的“或

非”、“或”、“与”、“异或”的结果。标志位 E 清零。

(2 ) BOR 指令将由第二操作数确定的源位和由第一操作数确定的目的位相“或”的

结果存放在目的位中。该指令只有 1 条。

助 记 符 功 能 说 明 字节数

BOR bitaddr , bitaddr 两个可寻址位的“或” 4

BOR 指令对标志位 Z , V , C, N 的影响与 BAND指令相同。

(3 ) BXOR 指令将由第二操作数确定的源位和由第一操作数确定的目的位相“异或”

的结果存放在目的位中。该指令只有 1 条。

助 记 符 功 能 说 明 字节数

BXOR bitaddr , bitaddr 两个可寻址位的“异或” 4

BXOR 指令对标志位 Z , V , C, N 的影响与 BAND指令相同。

4 .位比较指令

BCMP指令根据两个可寻址位修改状态标志位。该指令只有 1 条。

助 记 符 功 能 说 明 字节数

BCMP bitaddr , bitaddr 比较两个可寻址位 4

BCMP指令执行后 ,标志位 Z, V, C, N中分别是两个可寻址位的“或非”、“或”、“与”、

“异或”的结果。标志位 E 清零。

5 .位屏蔽指令

位的屏蔽操作包括 BFLDH 和 BFLDL 2 条指令。

亿恒 C164CI 16 位单片机

Page 140: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

129

(1 ) BFLDH 指令对第一个字操作数的高字节 ,利用第二个和第三个字节操作数进行

屏蔽操作 ,其结果为 :

第一个字操作数的低字节不变 ;

第一个字操作数的高字节 = (第一个字操作数的高字节 ∧ 第二个字节操作数的非 )

∨ 第三个字节操作数

因此 ,第一个字操作数高字节中的各位如果保持不变的话 ,第二个和第三个字节操作

数的对应位必须是 0;而第三个字节操作数为“1”的位会将第一个字操作数高字节的相应

位置“1”。这个指令只有 1 条。

助 记 符 功 能 说 明 字节数

BFLDH bitoff , # mask8 , # data8 对可位寻址的直接寻址存储器的高字节的位作屏蔽

和修改4

BFLDH 指令只影响标志位 Z和 N ,其他标志位 E , V , C 清零。标志位的设置为 :

Z 当第一个字操作数的结果等于 0 时 ,零标志位置“1”,否则清零。

N 当第一个字操作数的结果的最高位为 1 时 ,负数标志位置“1”,否则清零。

(2 ) BFLDL指令对第一个字操作数的低字节 ,利用第二个和第三个字节操作数进行

屏蔽操作 ,其结果为 :

第一个字操作数的高字节不变 ;

第一个字操作数的低字节 = (第一个字操作数的低字节 ∧ 第二个字节操作数的非 )

∨ 第三个字节操作数

因此 ,第一个字操作数低字节中的各位如果保持不变的话 ,第二个和第三个字节操作

数的对应位必须是 0;而第三个字节操作数为“1”的位会将第一个字操作数低字节的相应

位置“1”。这个指令只有 1 条。

助 记 符 功 能 说 明 字节数

BFLDL bitoff , # mask8 , # da ta8 对可位寻址的直接寻址存储器的低字节的位作屏蔽

和修改4

BFLDL 指令对标志位的影响和 BFLDH 指令相同。

3 .3 .6 比较指令

比较指令包括 CMP , CMPB, CMPD1, CMPD2, CMPI1 和 CMPI2 ,它们完成字或字节

的比较。此外 ,有的指令在完成对字的比较后 ,还可对源操作数进行增减 1 或 2 的运算 ,

这对实现循环十分方便。各种比较指令如表 3-14 所示。

(1 ) CMP 指令比较两个字的大小。字的比较是通过对两个字操作数执行一次“2 的

补码”减法来实现的 ,从第一个操作数中减去第二个操作数 ,根据减法的规则设置相应的

标志位 ,两个操作数的内容保持不变。CMP 指令有如下 6 条。

第 3 章 指 令 系 统

Page 141: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

130

表 3-14 比较指令

类 型 指 令 操 作 内 容

CMP 比较两个字的大小

CMPB 比较两个字节的大小

比较CMPD1 比较两个字的大小 ,并对第一个操作数的内容减 1

CMPD2 比较两个字的大小 ,并对第一个操作数的内容减 2

CMPI1 比较两个字的大小 ,并对第一个操作数的内容加 1

CMPI2 比较两个字的大小 ,并对第一个操作数的内容加 2

助 记 符 功 能 说 明 字节数

CMP Rw ,Rw 比较两个字 GPR内容的大小 2

CMP Rw, [ Rw] 比较 GPR内容和间接寻址字存储器内容的大小 2

CMP Rw, [ Rw + ] 比较 GPR和间接寻址存储器的内容后 ,将源地址指针加 2 2

CMP Rw, # data3 比较字 GPR内容和立即数的大小 2

CMP reg , # data16 比较寄存器内容和立即数的大小 4

CMP reg , mem 比较寄存器和直接寻址存储器的内容 4

CMP指令根据减法规则设置标志位 E , Z, V , C, N ,比较结果反映在标志位中。标志

位的设置为 :

E 第二个操作数等于最小负数时 ,该标志位置“1”,否则清零。

Z 两个操作数相减的结果为零时置“1”,否则清零。

V 减法结果溢出时置“1”,否则清零。

C 减法发生借位时置“1”,否则清零。

N 减法结果的最高位为 1 时置“1”,否则清零。

(2 ) CMPB 指令比较两个字节的大小。字节的比较是通过对两个字节操作数执行一

次“2 的补码”减法来实现的 ,从第一个操作数中减去第二个操作数 ,根据减法的规则设置

相应的标志位 ,两个操作数保持不变。CMPB 指令也有 6 条。

助 记 符 功 能 说 明 字节数

CMPB Rb, Rb 比较两个字节 GPR 内容的大小 2

CMPB Rb , [ Rw] 比较字节 GPR内容和间接寻址的字节存储器内容的大小 2

CMPB Rb , [ Rw + ] 比较字节 GPR和间接寻址的字节存储器内容的大小后 ,将源地址

指针加 12

CMPB Rb , # data3 比较字节 GPR内容和立即数的大小 2

CMPB reg , # da ta8 比较寄存器低字节的内容和立即数的大小 4

CMPB reg , mem 比较寄存器低字节和直接寻址的字节存储器的内容的大小 4

CMPB指令对标志位的影响与 CMP 指令相同。

(3 ) CMPD1 指令比较两个字操作数的大小 ,并对第一个字操作数减 1。字的比较是

通过对两个字操作数执行一次“2 的补码”减法来实现的 ,从第一个操作数中减去第二个

亿恒 C164CI 16 位单片机

Page 142: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

131

操作数 ,根据减法的规则设置相应的标志位 ,然后再将第一个操作数的内容减 1。该指令

和其他基于标志位的分支跳转指令结合使用 ,可以方便地实现循环结构。CMPD1 指令

有如下 3 条。

助 记 符 功 能 说 明 字节数

CMPD1 Rw, # data4 比较 GPR内容和立即数的大小 ,并将 GPR 内容减 1 2

CMPD1 Rw, # data16 比较 GPR内容和字立即数的大小 ,并将 GPR 内容减 1 4

CMPD1 Rw, mem 比较 GPR和直接寻址存储器的内容后 ,将 GPR 内容减 1 4

CMPD1 指令对标志位的影响与 CMP指令相同。

(4 ) CMPD2 指令比较两个字操作数的大小 ,其功能和 CMPD1 指令相同 ,只是在比

较后对第一个字操作数减 2。CMPD2 指令也有 3 条。

助 记 符 功 能 说 明 字节数

CMPD2 Rw, # data4 比较 GPR内容和立即数的大小 ,并将 GPR 内容减 2 2

CMPD2 Rw, # data16 比较 GPR内容和字立即数的大小 ,并将 GPR 内容减 2 4

CMPD2 Rw, mem 比较 GPR和直接寻址的存储器的内容后 ,并将 GPR 内容减 2 4

CMPD2 指令对标志位的影响与 CMP指令相同。

(5 ) CMPI1 指令比较两个字操作数的大小 ,其功能和 CMPD1 指令相同 ,只是在比较

后对第一个字操作数加 1 ,而不是减 1。CMPI1 指令也有 3 条。

助 记 符 功 能 说 明 字节数

CMPI1 Rw , # data4 比较 GPR内容和立即数的大小 ,并将 GPR 内容加 1 2

CMPI1 Rw , # data16 比较 GPR内容和字立即数的大小 ,并将 GPR 内容加 1 4

CMPI1 Rw , mem 比较 GPR和直接寻址的存储器的内容后 ,并将 GPR 内容加 1 4

CMPI1 指令对标志位的影响与 CMP指令相同。

(6 ) CMPI2 指令比较两个字操作数的大小 ,其功能和 CMPI1 指令相同 ,只是在比较

后对第一个字操作数加 2。CMPI2 指令也有 3 条。

助 记 符 功 能 说 明 字节数

CMPI2 Rw , # data4 比较 GPR内容和立即数的大小 ,并将 GPR 内容加 2 2

CMPI2 Rw , # data16 比较 GPR内容和字立即数的大小 ,并将 GPR 内容加 2 4

CMPI2 Rw , mem 比较 GPR和直接寻址的存储器的内容后 ,并将 GPR 内容加 2 4

CMPI2 指令对标志位的影响与 CMP指令相同。

3 .3 .7 转移指令

转移指令用来改变程序的流向 ,包括跳转、调用和返回等指令 ,如表 3-15 所示。

第 3 章 指 令 系 统

Page 143: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

132

表 3-15 转移指令

类 型 指 令 操 作 内 容

JMPA 条件满足时转移 , IP 由绝对地址得到

JMPI 条件满足时转移 , IP 由间接地址得到

JMPR 条件满足时转移 , IP 由相对地址得到

跳转JMPS 无条件转移到新的位置

JB 直接寻址位置“1”时转移

JBC 直接寻址位置“1”时转移 ,并对该位清零

JNB 直接寻址位为零时转移

JNBS 直接寻址位为零时转移 ,并将该位置“1”

CAL LA 条件满足时调用子程序 ,入口地址由绝对地址得到

CAL LI 条件满足时调用子程序 ,入口地址由间接地址得到

调用CAL LR 无条件调用子程序 ,入口地址由相对地址得到

CAL LS 无条件调用任意代码段中的子程序

PCALL 寄存器入栈后调用指定的子程序

TRAP 通过异常处理号调用异常处理子程序

RET 退出代码段内的子程序

返回RETS 退出代码段间的子程序

RET P 退出代码段内的子程序 ,并从堆栈中取出一个字到寄存器中

RETI 退出中断服务子程序

空操作 NOP 不做任何运算

在跳转和调用指令中 ,包括有条件跳转和有条件调用。共有 16 种条件 ,这些条件作

为一个操作数在指令中出现 ,称为条件代码操作数。条件代码操作数在执行代码中用 4

位来标记。这些条件代码的助记符和检查方式如表 3-16 所示。

表 3-16 条件代码

条件代码助记符 cc 条 件 检 查 条 件 描 述 条件代码数 c

cc_ UC 1 = 1 无条件 0 H

cc_Z Z = 1 零 2 H

cc_ NZ Z = 0 非零 3 H

cc_ V V = 1 溢出 4 H

cc_ NV V = 0 无溢出 5 H

cc_ N N = 1 负 6 H

cc_ NN N = 0 非负 7 H

cc_C C = 1 进位 8 H

cc_ NC C = 0 无进位 9 H

cc_EQ Z = 1 等于 2 H

cc_ NE Z = 0 不等于 3 H

cc_ UL T C = 1 小于 (无符号数 ) 8 H

cc_ ULE (Z∨C) = 1 不大于 (无符号数 ) FH

亿恒 C164CI 16 位单片机

Page 144: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

133

续表

条件代码助记符 cc 条 件 检 查 条 件 描 述 条件代码数 c

cc_ UGE C = 0 不小于 (无符号数 ) 9 H

cc_ UGT (Z∨C) = 0 大于 (无符号数 ) E H

cc_SLT ( Nī V) = 1 小于 (有符号数 ) CH

cc_SLE (Z∨ ( Nī V ) ) = 1 不大于 (有符号数 ) BH

cc_SGE ( Nī V) = 0 不小于 (有符号数 ) DH

cc_SGT (Z∨ ( Nī V ) ) = 0 大于 (有符号数 ) AH

cc_ NET (Z∨ E) = 0 不等于且不是最小负数 1 H

1 .跳转指令

跳转指令包括 JMPA , JMPI, JMPR, JMPS, JB, JBC, JNB, JNBS。它们分为无条件转

移和有条件转移。新的代码目的地址的计算也有多种方式 ,可实现同一代码段内的转移

或是不同代码段间的长转移。

(1 ) JMPA 指令在第一个操作数 (条件代码 )给出的条件满足时 ,程序转移到第二个

操作数给出的绝对地址处执行 ;否则接着执行 JMPA 指令的下一条指令。该种指令只有

1 条。

助 记 符 功 能 说 明 字节数

JMPA cc , caddr cc条件满足时 ,将 caddr 装载入 IP ;否则执行下一条指令 4

JMP A指令不影响标志位。

(2 ) JMPI 指令在第一个操作数 (条件代码 )给出的条件满足时 ,程序转移到由第二个

操作数 GPR 间接寻址到的代码绝对地址处执行 ;否则接着执行 JMPI 指令的下一条指

令。该种指令只有 1 条。

助 记 符 功 能 说 明 字节数

JMPI cc , [ Rw] cc条件满足时 ,将 GPR的内容装载入 I P;否则执行下一条指令 2

JMPI 指令不影响标志位。

(3 ) JMPR 指令在第一个操作数 (条件代码 )给出的条件满足时 ,程序转移到新的代

码地址处执行 ,新的代码地址在当前地址 IP (即紧接 JMPR 指令的 IP)上增加一个相对偏

移量 (由第二个操作数给出 )得到 ;否则接着执行 JMPR 指令的下一条指令。该种指令只

有 1 条。

助 记 符 功 能 说 明 字节数

JMPR cc , rel cc条件满足时 ,在 IP 上增加一个相对偏移量得到新的 IP ;否则执行

下一条指令2

JMPR 指令不影响标志位。

第 3 章 指 令 系 统

Page 145: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

134

(4 ) JMPS指令无条件转移 ,新的代码地址的代码段指针 CSP 由第一个操作数给出 ,

代码地址指针 IP 由第二个操作数给出。该种指令只有 1 条。

助 记 符 功 能 说 明 字节数

JMPS seg , caddr 无条件转移 4

JMPS指令不影响标志位。

(5 ) JB 指令在第一个操作数可寻址位置“1”时 ,程序转移到新的代码地址处执行 ,新

的代码地址在当前地址 IP (即紧接 JB 指令的 IP )上增加一个相对偏移量 (由第二个操作

数给出 )得到 ;否则接着执行 JB 指令的下一条指令。该种指令只有 1 条。

助 记 符 功 能 说 明 字节数

JB bitaddr , rel 可寻址位置“1”时 ,在 IP 上增加一个相对偏移量得到新的 IP ;否则

执行下一条指令4

JB 指令不影响标志位。

(6 ) JBC指令在第一个操作数可寻址位置“1”时 ,将该位清零 ,然后程序转移到新的

代码地址处执行 ,新的代码地址在当前地址 IP (紧接 JBC 指令的 IP)上增加一个相对偏移

量 (第二操作数给出 )得到 ;否则接着执行 JBC 指令的下一条指令。该种指令只有 1 条。

助 记 符 功 能 说 明 字节数

JBC bitaddr , rel 可寻址位置“1”时 ,将该位清零 ,并在 IP 上增加一个相对偏移量得

到新的 IP ;否则执行下一条指令4

JBC 指令执行完后 ,标志位 N 和 Z中分别是可寻址位原来的值和它的“非”,其他标

志位清零。

(7 ) JNB指令在第一个操作数可寻址位清零时 ,程序转移到新的代码地址处执行 ,新

的代码地址在当前地址 IP (紧接 JNB 指令的 IP )上增加一个相对偏移量 (由第二操作数

给出 )得到 ;否则接着执行 JNB指令的下一条指令。该种指令只有 1 条。

助 记 符 功 能 说 明 字节数

JNB bitaddr , rel 可寻址位清零时 ,在 I P 上增加一个相对偏移量得到新的 IP ;否则执

行下一条指令4

JNB 指令不影响标志位。

(8 ) JNBS指令在第一个操作数可寻址位清零时 ,将该位置“1”,然后程序转移到新的

代码地址处执行 ,新的代码地址在当前地址 IP (紧接 JNBS指令的 IP )上增加一个相对偏

移量(由第二操作数给出)得到;否则接着执行 JNBS指令的下一条指令。该种指令只有 1条。

助 记 符 功 能 说 明 字节数

JNBS bitaddr , rel 可寻址位清零时 ,将该位置“1”,并在 IP 上增加一个相对偏移量得

到新的 IP ;否则执行下一条指令4

亿恒 C164CI 16 位单片机

Page 146: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

135

JNBS指令执行完后 ,标志位 N和 Z 中分别是可寻址位原来的值和它的“非”,其他标

志位清零。

2 .调用指令

调用指令包括 CALLA , CALLI , CALL R, CALLS, PCALL , TRA P。除 TRA P 指令

用来调用中断服务子程序外 ,其他的调用指令是对子程序的有条件调用和无条件调用。

子程序入口地址可以与调用程序在同一个代码段中 ,也可以是不同代码段的长调用。

(1 ) CALLA指令在第一个操作数 (条件代码 )给出的条件满足时 ,调用子程序 ,子程

序地址由第二个操作数直接给出。该种指令只有 1 条。

助 记 符 功 能 说 明 字节数

CALLA cc , caddr cc条件满足时 ,将当前 IP 压入堆栈 , caddr 装载入 IP ,调用位于

caddr 处的子程序 ;否则执行 CALLA 的下一条指令4

CALLA 指令不影响标志位。

(2 ) CALLI 指令在第一个操作数 (条件代码 )给出的条件满足时 ,调用子程序 ,子程

序地址由第二个操作数间接寻址得到。该种指令只有 1 条。

助 记 符 功 能 说 明 字节数

CALLI cc , [ Rw ] cc条件满足时 ,将当前 IP 压入堆栈 , GPR 的内容装载入 IP ,调用子

程序 ;否则执行 CAL LI的下一条指令2

CALLI 指令不影响标志位。

(3 ) CALLR 指令无条件调用子程序 ,子程序地址在当前 IP 上增加一个相对偏移量

(由操作数给出 )得到。该种指令只有 1 条。

助 记 符 功 能 说 明 字节数

CALLR rel 将当前 IP 压入堆栈 ,在 IP上增加相对偏移量得到子程序的入口地址 2

CALL R 指令不影响标志位。

(4 ) CALLS指令无条件调用子程序 ,与 CALLR 指令的不同之处在于 , CALLS指令

不仅把 IP 压入堆栈保护 ,代码段指针 CSP也压入堆栈保护 ,新的 CSP 和 IP 分别由第一

个和第二个操作数直接给出。该种指令只有 1 条。

助 记 符 功 能 说 明 字节数

CALLS seg , caddr 将当前 CSP 和 IP 压入堆栈 ,第一个操作数放入 CSP 中 ,第二个操

作数放入 IP 中 ,调用子程序4

CALLS指令不影响标志位。

(5 ) PCALL 指令先将第一个字操作数压入堆栈 ,然后无条件调用子程序 ,子程序入

口地址 IP 由第二个操作数直接给出。该种指令只有 1 条。

第 3 章 指 令 系 统

Page 147: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

136

助 记 符 功 能 说 明 字节数

PCALL reg , caddr 先将寄存器中的字压入堆栈 ,再将当前 IP 也压入堆栈 ,第二个操作

数放入 IP 中 ,调用子程序4

PCALL指令不影响标志位 V和 C,但根据压入堆栈的寄存器的内容设置标志位 E ,

Z和 N。标志位的设置为 :

E 寄存器内容等于最小负数时置“1”,否则清零。

Z 寄存器内容等于零时置“1”,否则清零。

N 寄存器内容的最高位为 1 时置“1”,否则清零。

(6 ) TRA P指令为软件陷阱指令 ,根据操作数给出的陷阱号 ,进入相应的陷阱处理程

序或是中断服务程序。通过陷阱号 ,在中断向量表中寻找到相应的处理程序入口地址。

软件陷阱除了不影响 CPU 的优先级外 ,系统状态与发生硬件陷阱时一样 ,都被保存在系

统堆栈中。陷阱处理程序用 RETI 指令返回。当存储空间使用分段方式时 (由 SYSCON

寄存器的 SGTDIS位决定 ) , CSP 寄存器也被保存在堆栈中。该种指令只有 1 条。

助 记 符 功 能 说 明 字节数

TRAP # trap7 根据陷阱号 t rap7 ,在中断向量表中寻找相应处理程序入口地址 2

T RAP 指令不影响标志位。

3 .返回指令

返回指令有 RE T , RE TS , RE TP , R ETI。包括从同一代码段或不同代码段的子程

序 ,以及从中断服务子程序的返回。上述指令分别与不同的调用指令配合使用。

(1 ) RE T 指令从堆栈中取回 IP。因此 , RET 指令适合在 CALLA , CALLI , CALLR

调用的子程序中使用。该种指令只有 1 条。

助 记 符 功 能 说 明 字节数

RE T 从堆栈中取出一个字 ,放入 IP 2

RET 指令不影响标志位。

(2 ) RE TS指令从堆栈中取回 IP 和 CSP。因此 , RE T 指令适合在 CALLS调用的子

程序中使用。该种指令只有 1 条。

助 记 符 功 能 说 明 字节数

RE TS 从堆栈中取出一个字 ,放入 IP ;再取出一个字 ,放入 CSP 2

RETS指令不影响标志位。

(3 ) R ETP指令从堆栈中取回 IP ,再从堆栈中取出一个字 , 放在操作数中。因此 ,

RETP 指令适合在 PCALL调用的子程序中使用。该种指令只有 1 条。

助 记 符 功 能 说 明 字节数

RE TP reg 从堆栈中取出一个字 ,放入 IP ;再取出一个字 ,存放到寄存器中 2

亿恒 C164CI 16 位单片机

Page 148: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

137

RETP 指令不影响标志位 V 和 C,但根据寄存器的内容设置标志位 E , Z 和 N。标志

位的设置为 :

E 寄存器内容等于最小负数时置“1”,否则清零。

Z 寄存器内容等于零时置“1”,否则清零。

N 寄存器内容的最高位为 1 时置“1”,否则清零。

(4 ) R ETI 指令从中断程序返回。将 PSW, IP (当存储空间采用分段方式时加上

CSP) 的内容从堆栈中取出 ,恢复调用中断程序之前的系统状态。该种指令只有 1 条。

助 记 符 功 能 说 明 字节数

RE TI 从堆栈中取出一个字 ,放入 IP ;当系统使用分段方式时 ,将 CSP 的

内容从堆栈中取出 ;最后 ,从堆栈中取出 PSW内容2

RET I指令恢复进入中断程序前的标志位。

4 .空操作指令

NOP指令不作任何操作。

助 记 符 功 能 说 明 字节数

NOP 无任何操作 2

3 .3 .8 系统控制指令

系统控制指令包括复位、待机、监控定时器设置、初始化结束指令以及扩展寻址指令。

指令分类如表 3-17 所示。

表 3-17 系统控制指令

类 型 指 令 操 作 内 容

复位 SRST 软件复位

待机IDLE 进入休闲模式

PWRDN 进入停止模式 ( NMI引脚低电平时有效)

监视定时器设置SRVWDT 启动监视定时器

DISWDT 停止监视定时器

初始化结束 EINIT 在RSTOUT引脚上给出初始化结束的信号

原子操作 A TOMIC 开始 ATOMIC作用的指令序列

EXTR 开始对扩展寄存器寻址的指令序列

EXT P 开始对扩展数据页寻址的指令序列

扩展寻址 EXT PR 开始对扩展数据页和扩展寄存器寻址的指令序列

EXTS 开始对扩展数据段寻址的指令序列

EXTSR 开始对扩展数据段和扩展寄存器寻址的指令序列

第 3 章 指 令 系 统

Page 149: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

138

1 .复位指令

复位指令 SRST 完成软件复位 ,与外部因素引起的硬件复位效果相同。

助 记 符 功 能 说 明 字节数

SRST 复位 4

该指令对标志位清零。

2 .待机指令

待机指令包括 IDLE 和 PWRDN两条指令 ,用于管理 CPU 的运行速度。

(1 ) IDLE指令使 CP U 停止工作 ,但周边电路仍保持运行 ,进入休闲模式。当发生周

边电路中断或是外部中断时 ,退出休闲模式。

助 记 符 功 能 说 明 字节数

IDL E CPU 停止工作 4

IDLE 指令不影响标志位。

(2 ) PWRDN 指令使 CP U 和所有周边电路都停止工作 ,进入掉电模式 , 直到外部硬

件复位 ,唤醒掉电模式。PWRDN 指令只有在NMI引脚为低电平时才有效。当NMI为高

电平时 ,该指令不起作用。

助 记 符 功 能 说 明 字节数

PWRDN CPU 和所有周边电路都停止工作 4

PWRDN 指令不影响标志位。

3 .监视定时器设置指令

监视定时器设置指令包括 SRVWDT 和 DISWDT , 分别用来启动和停止监视定

时器。

(1 ) SRVWDT 指令用来启动监视定时器。

每次执行该指令时 ,将计时器的低字节清零 ,计时器的高字节加载一个预设置值。这

是一个受保护的指令 ,可防止由于意外而造成监视定时器工作。一旦用此指令启动监视

定时器后 ,就不可能使它停止了。

助 记 符 功 能 说 明 字节数

SRVWDT 启动监视定时器。将计时器的低字节清零 ,高字节加载预设值 4

SRVWDT 指令不影响标志位。

(2 ) DISWDT 指令用来停止监视定时器。

当监视定时器是通过复位方式打开时 ,可以通过该指令停止计时器工作 , 直到执行

亿恒 C164CI 16 位单片机

Page 150: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

139

SRVWDT 指令或 EINIT 指令后重又工作。当这两条指令中的任何一条执行后 ,

DISWDT 指令失效 ,即不能用它来使计时器停止工作。

助 记 符 功 能 说 明 字节数

DISWDT 停止监视定时器 4

DISWDT 指令不影响标志位。

4 .初始化结束指令

初始化结束指令即 EINIT 指令 ,用来标志程序的初始化工作结束。

输出引脚RSTOU T在复位后输出低电平 ,直至执行 EINIT 指令后 , RSTOUT才输出

高电平。因此 ,当初始化工作结束后 ,可以利用该指令给出外部电路所需的信号。

执行完 EINIT 指令后 , DISWDT 指令失效。

助 记 符 功 能 说 明 字节数

EINIT 表明初始化结束 ,使引脚RSTOU T输出高电平 4

EINIT 指令不影响标志位。

5 .原子操作指令

原子操作指令即 ATOMIC 指令。在该指令之后的 1~4 条指令执行期间 ,关闭标准

中断和 PEC 中断 ,禁止 A类陷阱。指令数由 ATOMIC 指令中的操作数 irang2 确定 ,其

值只能在 1~4 中选取 ,它规定了 ATOMIC 指令作用的时间范围。ATOMIC 指令立即生

效 ,无需 NOP 指令等待。

在 ATOMIC指令有效期间 ,如果发生了 B 类硬件陷阱 ,将会先中止 ATOMIC 作用 ,

即打开中断 ,恢复标准运行状态 ,再去执行硬件陷阱处理程序。从硬件陷阱处理程序返回

后 ,也不会再恢复 A TOMIC 指令的作用 ,剩余的在 ATOMIC 指令有效作用期内的指令

也将继续在标准状态下运行。

助 记 符 功 能 说 明 字节数

ATOMIC # irang2 在 AT OMIC指令后的 i rang2( 1≤ irang2≤4 )条指令执行期间 ,关闭

标准中断和 PEC 中断 ,关闭 A 类陷阱4

A TOMIC 指令不影响标志位。

6 .扩展寻址指令

寻址扩展指令包括 EXT R, EXTP, EXTPR, EXTS, EXTSR 等 5 条指令。80C166 系

列中无这些指令。这些指令除具有 ATOMIC 指令的关闭中断和禁止 A 类陷阱功能外 ,

还实现了扩展寻址方式。

若在 ATOMIC 指令有效作用期间 ,又执行了新的扩展寻址指令 ,注意这两种指令将

第 3 章 指 令 系 统

Page 151: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

140

使用同一个计数器装载指令的操作数。在指令有效期间 ,该计数器进行减 1 计数 ,当计数

至 0 时 ,结束指令的作用。在计数期间若执行到新的扩展寻址指令 ,该计数器会重新装载

当前的扩展寻址指令的操作数。

(1 ) EXT R 指令在该指令的后续 1~4 条指令执行期间 ,凡是通过 reg , bitoff , bitaddr

寻址方式对 SFR 以及 SFR 可寻址位的寻址操作 ,都是对扩展 SFR 空间的寻址。在此期

间 ,关闭标准中断和 PEC中断 ,禁止 A 类陷阱。

EXT R 指令的有效作用范围由操作数 irang2 给出 ,其值只能在 1~4 之间。

EXT R 指令的其他工作性能和注意事项与 ATOMIC 指令相同。

EXT R 指令只有 1 条。

助 记 符 功 能 说 明 字节数

EXTR # irang2 在 EXTR 指令后的 irang2( 1~ 4 )条指令执行期间 ,对扩展 SFR 空

间寻址 ,同时关闭标准中断和 PEC中断 ,关闭 A 类陷阱4

EXT R 指令不影响标志位。

(2 ) 在 EXTP指令的后续 1~4 条指令执行期间 ,用扩展数据页寻址方式替代在长寻

址和间接寻址方式中采用的标准 DP P寻址方式。在此期间 ,关闭标准中断和 PEC 中断 ,

禁止 A 类陷阱。起作用的指令数由第二个操作数 irang2 给出 ,第一个操作数给出数据页

的数值。

对 EXTP 指令后续的、其有效作用期内的指令 ,凡是指令中的长寻址 ( mem )或是间

接寻址 ( [⋯ ] ) , 10 位的页地址 ( A23~A14 )不再从 DPP 寄存器读取 ,而是直接由第一个

操作数的数值决定。14 位的页偏移量 ( A13~A0 )仍和标准 DP P 寻址方式一样 , 从长地

址或是间接地址得到。

EXTP 指令的其他工作性能和注意事项与 A TOMIC 指令相同。

EXTP 指令有两条。

助 记 符 功 能 说 明 字节数

EXTP Rw , # irang2

在 EXTP 指令后的 irang2 (1~4 )条指令执行期间 ,长寻址或是间接寻址中的数据页号为 Rw 的内容 ,同时关闭标准中断和 PEC 中断 ,关闭 A 类陷阱

2

EXTP # pag , # irang2

在 EXTP 指令后的 irang2 (1~4 )条指令执行期间 ,长寻址或是间接寻址中的数据页号为立即数 pag ,同时关闭标准中断和 PEC 中断 ,关

闭 A 类陷阱

4

EXTP 指令不影响标志位。

(3 ) EXTPR 指令在该指令的后续 1~4 条指令执行期间 ,用扩展数据页寻址方式替

代在长寻址和间接寻址方式中采用的标准 DPP 寻址方式 , 同时 , 凡是通过 reg , bitoff,

bitaddr 寻址方式对 SFR 以及 SFR 可寻址位的寻址操作 ,都是对扩展 SFR 空间的寻址。

在此期间 ,关闭标准中断和 PEC中断 ,禁止 A 类陷阱。

EXTPR 指令的其他工作性能和注意事项与 EXTP指令相同。

EXTPR 指令有两条。

亿恒 C164CI 16 位单片机

Page 152: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

141

助 记 符 功 能 说 明 字节数

EXTPR Rw, # i rang2

在 EXT PR指令后的 irang2 (1~4 )条指令执行期间 ,长寻址或是间接寻址中的数据页号为 Rw 的内容 ,对扩展 SFR 空间寻址 ,同时关闭标准中断和 PEC中断 ,关闭 A 类陷阱

2

EXTPR # pag , # irang2

在 EXT PR指令后的 irang2 (1~4 )条指令执行期间 ,长寻址或是间接寻址中的数据页号为立即数 pag ,对扩展 SFR 空间寻址 ,同时关闭标准中断和 PEC中断 ,关闭 A 类陷阱

4

EXTPR 指令不影响标志位。

(4 ) EXTS指令在该指令的后续 1~4 条指令执行期间 ,用扩展数据段寻址方式替代

在长寻址和间接寻址方式中采用的标准 DPP寻址方式。在此期间 ,关闭标准中断和 PEC

中断 ,禁止 A类陷阱。

对 EXTS指令后续的、在其有效作用期内的指令中的长寻址 ( mem )或是间接寻址

( [⋯ ] ) , EXTS指令第一个操作数的数值确定 8 位段地址 ( A23~A16)。长地址或是间接

地址本身即是 16 位段偏移量 ( A15~A0 )。

EXTS指令的其他工作性能和注意事项与 A TOMIC 指令相同。

EXTS指令有两条。

助 记 符 功 能 说 明 字节数

EXTS Rw , # irang2

在 EXTS 指令后的 irang2 (1~4)条指令执行期间 ,长寻址或是间

接寻址本身作为段偏移量 ,数据段号为 Rw 的内容 ,同时关闭标准

中断和 PEC 中断 ,关闭 A 类陷阱

2

EXTS # seg , # irang2

在 EXTS 指令后的 irang2 (1~4)条指令执行期间 ,长寻址或是间

接寻址本身作为段偏移量 ,数据段号为立即数 seg ,同时关闭标准中

断和 PEC中断 ,关闭 A 类陷阱

4

EXTS指令不影响标志位。

(5 ) EXTSR 指令在该指令的后续 1~4 条指令执行期间 ,用扩展数据段寻址方式替

代在长寻址和间接寻址方式中采用的标准 DPP 寻址方式 , 同时 , 凡是通过 reg , bitoff,

bitaddr 寻址方式对 SFR 以及 SFR 可寻址位的寻址操作 ,都是对扩展 SFR 空间的寻址。

在此期间 ,关闭标准中断和 PEC中断 ,禁止 A 类陷阱。

EXTSR 指令的其他工作性能和注意事项与 EXTS指令相同。

EXTSR 指令有两条。

助 记 符 功 能 说 明 字节数

EXTSR Rw , # irang2

在 EXTSR 指令后的 i rang2 (1~4 )条指令执行期间 ,长寻址或是

间接寻址本身作为段偏移量 ,数据段号为 Rw 的内容 ,对扩展 SFR

空间寻址 ,同时关闭标准中断和 PEC中断 ,关闭 A 类陷阱

2

EXTSR # seg , # irang2

在 EXTSR 指令后的 i rang2 (1~4 )条指令执行期间 ,长寻址或是

间接寻址本身作为段偏移量 ,数据段号为立即数 seg ,对扩展 SFR

空间寻址 ,同时关闭标准中断和 PEC中断 ,关闭 A 类陷阱

4

第 3 章 指 令 系 统

Page 153: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

142

EXTSR 指令不影响标志位。

3 .4 汇编语言程序

3 .4 .1 汇编语言

C164CI 单片机使用 C166 族单片机通用的 A166 宏汇编器 ,根据汇编源文件 ,生成相

应的目标文件和列表文件。

1 .语句的格式

汇编语言源程序由若干条语句组成 ,每条语句占一行。一个汇编语言源程序包括 4

个组成部分 : 汇编语言命令行 ,汇编伪指令命令行 ,汇编控制命令行 ,注释行。

(1 ) 汇编语言命令行

由 CPU 的指令组成 ,经过汇编后 ,生成相应的二进制机器码。

汇编语言命令行的一般格式包括 4 段 ,如下所示。

标号段 操作码段 操作数段 注释段

标号段是选用段 ,使用标号时 ,用冒号“ :”将其与操作码段隔开。标号有两个基本作

用 ,一是标号作为符号地址使用 ,表示该条语句指令码所在的地址 ;二是在调用子程序时 ,

也可使用符号地址。注意标号要区分英文字母的大小写。

操作码段由指令助记符构成。一条可执行汇编命令必须包括操作码段。

操作数段由操作数构成。操作数的个数、类型完全由指令助记符决定。操作数可能

是 1 个、2 个或是 3 个。某些助记符不需要操作数。各个操作数用逗号“ ,”隔开。操作数

按其内容可以分成以下 4 种 :

1) 汇编器用的保留字 ,例如寄存器名、标志位名等。

2) 程序中定义的符号 ,包括标号、段名、外部变量名等。

3) 直接地址和间接地址。

4) 常数。

在汇编语言中 ,操作数还可以使用由上述成分构成的表达式。

注释段由分号“ ;”开始。所有跟在分号“ ;”后面的内容在汇编时都不处理。

(2 ) 汇编伪指令命令行

汇编伪指令用来定义程序结构 ,定义各种标号、符号。它在汇编时只生成不可执行的

代码 (如数据、消息等 ) ;或不生成机器码 ,只用来控制汇编器的操作。

伪指令命令行的结构与汇编语言命令行类似 ,但在操作码段放的是伪指令。

(3 ) 汇编控制命令行

汇编控制命令行用“$”开始。控制命令设置汇编工作模式 ,控制汇编流程。

亿恒 C164CI 16 位单片机

Page 154: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

143

(4 ) 注释行

程序说明。注释行用分号“ ;”开始 ,其内容在汇编时不予处理。

2 .标号、符号名和位符号名的格式

标号、符号名和位符号名等必须符合以下规则 :

(1 ) 最多由 31 个字符组成。

(2 ) 第一个字符必须是 A~Z, a~z,‘_’或是‘ ?’中的一个。

(3 ) 后续字符必须是 A~Z, a~z,‘_’,‘ ?’或是 0~9 中的一个。

(4 ) 保留字不能取为符号名。

A166 汇编器允许使用符号来代替数字常数或是地址 ,这样可增加程序的可读性。符

号常数有以下几个属性 :

(1 ) 类型 每个符号都有其相应的类型 ,可以是位、字节、字等。汇编器依靠符号的

类型来确定合适的操作方式和指令 ,并且可以进行类型匹配的检查。

(2 ) 所属区段 可以定义符号只属于某个区段内 ,如代码段、常数段或变量段等。

(3 ) 作用域 表示符号的适用范围 ,是局部常数、全局常数、公用常数 ,或是外部常数

和重定位符号。

(4 ) 数值 就是符号所表示的数值或偏移量。

(5 ) 可变更性 用 SE T 伪指令定义的符号常数可以再次用 SE T 伪指令改变其数

值。但不是用 SET 伪指令定义的符号 ,不能用 SET 伪指令改变其数值。

3 .常数的格式

允许在表达式中使用的常数有数字常数和字符串常数两种。

(1 ) 数字常数

数字本身总是认为是正的 ,可以在数字前添加正负号表示正负数 ,正负号和数字之间

不能有空格和表格键。

数字可以用十六进制、十进制、八进制或二进制表示。十进制不用数制后缀。其他 3

种数制各用一个缩写字母作后缀。数字的第一个字符必须是 0~9 之间的数字 ,在十六进

制中 ,如果第一个字符不是数字 ,而是 A~F, a~f 之间的字母 ,必须在该字母前加上数字

0。4 种数制的例子如表 3-18 所示。

表 3-18 不同数制的表示

数 制 后 缀 有效字符 例 子

十六进制 H , h 0~9 , A~F , a~f 1234 H , 0A0F0 H ,0FFH ,0ffh

十进制 D, d 0~9 1234 ,65590D ,20d

八进制 O ,o , Q, q 0~7 177O, 7777Q ,123o

二进制 B, b 0~1 1111B,10010011B,100100111b

在数字的内部 ,可以添加符号“$”来增加数字的易读性 , 例如 , 1111$0011$0010

$0001B 等于 1111001100100001B, 1$2$3$4$等于 1234。但是“$”绝对不能放在数

第 3 章 指 令 系 统

Page 155: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

144

字的第一个字符或是最后一个字符的位置上。

(2 ) 字符串常数

在表达式中 ,允许使用 ASCII码构成的字符串常数。表达式中的字符串最多可以包

括 2 个字符 ,用单引号括起来 ,如‘AB’表示 4142 H ,‘a’表示 0061 H 等。

当字符串常数在表达式之外使用时 ,比如在 DB伪指令中使用时 ,就没有字符个数的

限制 ,如‘ ENT ER_ANY_KEY_ TO_CONTINUE’。

注意 : 诸如‘ ’这样的空字符串是无效的。

4 .表达式

汇编语言中的表达式由数字、符号和运算符组成。如果表达式的结果在汇编时就已

经知道 ,这种表达式叫做绝对表达式 ;若表达式的结果需要在连接阶段才能计算出来 ,则

称为重定位表达式。

表达式中的运算符分为两类 ,单目运算符和双目运算符。表达式的运算优先级依靠括

号和隐含优先级确定 ,所有运算符的隐含优先级列在表 3-19 中 ,数字越小表示优先级越高。

表 3-19 运算优先级

优先级 运 算 符 示 例 说 明

0 ( ) (2 + 8) * 12 改变运算顺序

1 . SYSCON .3 确定位的位置

2 BIT P TR BIT PTR xbit 类型重载成位

2 BY TE PTR BYTR P TR wvar 类型重载成字节

2 WORD PTR WORD P TR bvar 类型重载成字

2 BITWORD P TR BITWORD PTR bvar 类型重载成可位寻址的字

2 NEAR PTR NEAR PTR flab NEAR/ FAR 类型重载成 NEAR

2 FAR P TR FAR PTR nlab NEAR/ FAR 类型重载成 FAR

2 DA TA3 DATA3 2 常数用 3 位表示( 0~7)

2 DA TA4 DATA4 8 常数用 4 位表示( 0~15 )

2 DA TA8 DATA8 25 常数用 8 位表示( 0~255)

2 DA TA16 DATA16 100 常数用 16 位表示 (0~65535)

2 DPP0~DPP3 DPP2 : var 数据页指针从操作数的内容重载

2 SEG SEG var 取得操作数所在段的段数 (一段 64KB)

2 PAG PAG var 取得操作数所在页的页数 (一页 16KB)

2 SOF SOF var 取得操作数在所在段内的偏移量

2 POF POF var 取得操作数在所在页内的偏移量

2 BOF BOF xbit 取得位操作数在相应字中的位置

3 H IGH HIGH 1234 H 取出字操作数的高字节值 ( 12 H )

3 LOW LOW 1234 H 取出字操作数的低字节值 ( 34 H )

3 NOT NO T 0 位的求反

亿恒 C164CI 16 位单片机

Page 156: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

145

续表

优先级 运 算 符 示 例 说 明

3 + , - - 2 单目正负

4 * ,/ , MOD 100 MOD 7 乘 ,除 ,模除

5 + , - 4 + 100 加 ,减

6 SH L , < < 1 SH L 3 左移位

6 SHR , > > 100 > > 7 右移位

7 AND, & 1234 & 7 位与

7 OR, | 1234 | 1 位或

7 XOR ,^ 1234 XOR 5 位异或

8 LT , < 5 < 2 小于

8 LE , < = 5 < = 2 不大于

8 GT , > 5 > 2 大于

8 GE , > = 5 > = 2 不小于

8 UL T 5U LT3 无符号小于

8 ULE 5U LE3 无符号不大于

8 UGT 5UGT3 无符号大于

8 UGE 5UGE3 无符号不小于

9 SHORT SH ORT lab 短跳转

使用运算符时 ,只有加减、HIGH , LOW 和关系运算符可以对绝对操作数和重定位操

作数进行运算 ,其他运算符只能对绝对操作数运算。下面对表中某些运算符作一说明。

(1 ) 加减

加减运算符可以对绝对操作数 ( ABS)和重定位操作数 ( R EL )进行运算。对两种操作

数的运算规则如表 3-20 所示。

表 3-20 不同定位操作数的加减运算

操作数±操作数 结 果

ABS + ABS ABS

ABS - ABS ABS

ABS + RE L REL

ABS - RE L 错误

REL + ABS REL

REL - ABS REL

REL + RE L 错误

REL - RE L(注 ) ABS

注 : R EL - R EL 运算要求两个重定位操作数在同一个父区中定义。因此 ,汇编阶段就已知两个操作数的地址

差值 ,运算结果是绝对数。外部操作数不能进行这种运算。

第 3 章 指 令 系 统

Page 157: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

146

(2 ) 类型转换运算符 PT R

PT R 运算符用来指定或改变操作数的类型。关键字为 PTR ,操作数可以是任意可

寻址的表达式 ,可以是数据变量或是代码标号。PT R 运算不能用于段名 SEC TION 或是

组名 GROU P(处在同一 SEGMENT 内的几个 SECTION 的总称 ) ,也不能用来改变外部

常数的类型。BI T PTR 只能用于对位的操作 ,不能把其他类型重定义成位。类型可以是

BIT , BYTE , WORD, BI TWORD , NEAR , FAR。

(3 ) DA TAn 运算符

DATAn 运算符用来给出指令中定义的或是外部定义的常数的类型 ,共包括 3 , 4 , 8 ,

16 这 4 种位数。当 A166 汇编器遇到一个未指定位数的常数时 ,它根据常数的大小 ,自动

给定其类型。DATAn 运算符可以用来加长常数的位数 ,但不能缩短其位数 ,否则 ,汇编

器会截短常数 ,并给出警告。

(4 ) 数据页替代运算符 DPPn

每个变量在存储器中都有一个具体的位置。存储器按 16KB 为一页划分成若干页。

存取变量时需指定一个数据页号 (存放在 DPP0~DPP3 中 )。A166 汇编器能跟踪由

DPPn 指定的段和组的基地址。这些基地址是通过 ASSUME 伪指令设定的。

进行页替代时 ,使用一个 DPPn 作为变量的前缀 ,用此 DPPn 的内容对变量寻址 ,起

到与 ASSUME 伪指令一样的作用。使用者需确认 DPPn 的内容正确 ,保证能寻到所要

的变量。

(5 ) 取段号运算符 SEG

SEG 运算符取得操作数所在段的 2 位段号 (80C167 的段号是 8 位 )。操作数可以是

变量、SECT ION , GROU P或是 SFR 的名称。

(6 ) 取页号运算符 P AG

P AG运算符取得操作数所在页的 4 位页号 ( 80C167 的页号是 10 位 )。操作数可以

是变量、SECT ION , GROU P或是 SFR 的名称。

(7 ) 取段偏移量运算符 SOF

SOF求得操作数在所在 64KB 段中的 16 位偏移量。SO F主要用来为 PEC 取得源和

目的操作数地址。因为 PEC 单元不采用 DPP寻址 ,而是使用线性地址空间 ,使用者必须

使用 SOF 运算符得到相应的线性地址。SOF 的操作数可以是变量、SECTION , SFR 的

名称 ,但不能用 GROUP 名。

(8 ) 取页偏移量运算符 P OF

PO F求得操作数在所在 16KB 段中的 14 位偏移量。POF 的操作数可以是变量、

SECTION , SFR 的名称 ,但不能用 GROUP 名。

(9 ) 取位序号运算符 BOF

BOF求得操作数在可位寻址字中位的序号 , BO F的操作数只可以是位变量。

(10) 短跳转运算符 SHOR T

SHOR T 运算符用来产生短跳转 ,相对当前指令地址的偏移量在 - 128~ + 127 个字

之间。在各种跳转、分支指令中的分支地址标号前使用 SHOR T 运算符 ,汇编器将检查

相对地址偏移量是否越界。

亿恒 C164CI 16 位单片机

Page 158: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

147

3 .4 .2 伪指令

汇编伪指令用来控制汇编过程 ,并不转换成可执行的机器码。A166 的伪指令按其功

能可分为 :

(1 ) 编译控制伪指令 ,引导 A166 的编译 (见表 3-21)。

表 3-21 编译控制伪指令

伪 指 令 功 能 使用与举例

EQU 定义一个符号 ( 不可重定义 ) X3 EQU R3

SE T 定义一个符号 ( 可以重定义 ) VAR1 SE T V1

BIT 定义一个位符号 BIT4 BIT PSW .1

LABEL 定义一个标号 XWORD LABE L WORD

DEFR 定义专用寄存器名称 ZREG DEFR 0FF1CH , R

DEFA 定义内部 RAM 绝对地址的符号名称 XFA00 DEFA 0FA00H

DEFB 定义位地址的符号名称 P0P1 DEFB 0FF00H .1

LIT 定义一个字符串 BCAST LIT ‘BYT E PTR’

ORG 设定有效段的地址 ORG $ + 20 H ;隔开 16 个字

EVEN 使其后的数据和代码从偶字节地址开始存放 EVEN

DS 保留出指定的存储空间 DS 10 H ;保留 16 个字节

DSW 保留出指定的存储空间 (字 )

DSB 保留出指定的存储空间 (字节 )

DBIT 保留出指定的位空间 bit1 DBIT 3 ;保留 3 个位

DB 定义一个字节 ,并初始化该字节 DB 13 ,10

DW 定义一个字 ,并初始化该字 DW $ ,$ ,$

DBP TR 定义一个位指针 ,并初始化位指针 见例 3 .1

DSP TR 定义一个段指针 ,并初始化段指针 见例 3 .1

DPP TR 定义一个页指针 ,并初始化页指针 见例 3 .1

ASSUME 声明对象所选用的 DPP ASSUME DPPn : section 名

REGDEF/

REGBANK 在内部 RAM 区设置寄存器组 BANK2 REGBANK R0~R15

PECDEF 在内部 RAM 区保留 PEC的源指针和目的指针 ,

最多为 8 个PECDEF PECC0~PECC2 , PECC7

SSKDEF 定义系统堆栈大小。用序号 0~7 表示系统堆栈

在片内 RAM 中所占的位置

SSKDEF 1

系统堆栈位于 0FB00H~0FBFFH

END 文件编译结束 END

(2 ) 连接控制伪指令 ,连接时管理地址的分配 (见表 3-22 )。

第 3 章 指 令 系 统

Page 159: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

148

表 3-22 连接控制伪指令

伪 指 令 功 能 使用与举例

SECTION/ E NDS 定义一个段

段的类型可以是代码段 CODE、数据段 DAT A

和位数据段 BIT

C100 SECTION CODE

C100 ENDS

GROUP 定义一个组 (包括多个段 )

组指令有 CGROUP 和 DGROUP 两种 ,分别用

于代码段和数据段

GDAT A DGROUP D100 , D200

GCODE CGROUP C100

PROC/ ENDP 定义一个过程

过程用 RE T指令结束

P101 PROC: NEAR

CALL P102

RE T

P101 ENDP

EXTERN 定义外部符号 EXTERN VAR1 WORD

PUBLIC 定义公共符号 PUBLIC BIT0 , BIT1

GLOBAL 定义全局符号

NAME 定义模块名称 NAME T EST_MODUL E

[例 3 .1] 说明伪指令 DBPT R / DSPTR / DPPT R 的作用。

EXT ERN NPROC : NEAR

BSEC SECTION BIT

BT1 DBIT

BT2 DBIT

BSEC ENDS

DSEC SECTION DATA

bp1 DBP TR BT1 ; bp1 的位指针与 BT1 相同

bp2 DBP TR BT2 ; bp2 的位指针与 BT2 相同

pd1 DPP TR bp1 ;页指针相同

cp1 DSP TR NPROC ;段指针相同

DSEC ENDS

END

3 .4 .3 汇编控制命令

汇编控制命令用来控制目标文件的内容 ,生成列表文件 ,引用信息 ,还可以完成条件

汇编等汇编流程的控制。

1 .汇编控制符

A166 提供的汇编控制符可以在汇编命令中跟在源文件名后作选择项使用 ;或是插在

亿恒 C164CI 16 位单片机

Page 160: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

149

源程序中的汇编命令行中 ,此时汇编控制符需加前缀“$”。

汇编控制符包括主控制和一般控制两类。主控制在整个汇编过程中都生效 ,所以必

须放在源文件的最前面 ,主控制汇编命令在 INCLUDE 控制命令处结束。而一般控制可

以使用在源文件的任何位置 ,只对定义后的汇编部分生效 ,并且可以更改。表 3-23 摘要

列出了 A166 提供的一些控制符名称和作用。

表 3-23 控制符列表

控制符/ 缩写 作 用 类 型

ABSOLUT E/ AB 检查编译模块是绝对模块 ,还是包含有对外

部定义的引用主控制

CASE/ CA 设置编译时区分符号的大小写 主控制

COND/ CO , NOCOND/ NOCO 设置列表文件是否打印条件汇编中跳过部

分的程序一般控制

DEBUG/ DB 设置目标模块中包括调试信息 主控制

ERRORPRIN T/ EP 打印汇编错误信息 主控制

GEN/ GE , NOGEN/ NOGE 设置是否列出全部的宏扩展 一般控制

INCL UDE 包含文件 一般控制

INCDIR/ ID 添加搜索 INCLUDE文件的目录路径 主控制

LIST/ LI , NOLIST/ NOLI 设置是否在列表文件中打印源代码的内容 一般控制

MOD166/ M166 不许使用 167 增加的指令 主控制

MOD167/ M167 允许使用 167 增加的指令 主控制

NOMACRO/ NOMR 不进行宏的预处理 主控制

NOSYMBOLS/ NOSB 不产生符号表 主控制

OBJECT / OJ, 生成目标文件 主控制

NOOBJECT/ NOOJ 不生成目标文件

PRINT/ PR 生成列表文件 主控制

NOPRINT/ NOPR 不生成列表文件

REGUSE 给出过程运行中使用过的寄存器 一般控制

SEGMEN TED/ SG 使用分段模式 主控制

NONSEGMENT ED/ NOSG 使用不分段模式

TITL E/ T T 定义打印在列表文件页头的字符串内容 一般控制

T YPE/ T Y, NOT YPE/ NOT Y 设置是否在目标文件中包括符号的类型信息 主控制

XREF/ XR 建立程序中所有引用的符号表 主控制

下面给出一些汇编控制命令的例子。

[例 3 .2] 包含说明 167 系列专用寄存器名称的文件。

$ INCLUDE ( REG167 .INS )

[例 3 .3] 指定寻找包含文件的路径。

第 3 章 指 令 系 统

Page 161: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

150

$ INCDIR (C : \C166\ ASM)

[例 3 .4] 指定生成 OBJ 文件的名称和路径。

$ OBJECT ( C: \ SAMPLE .OBJ)

[例 3 .5] 生成列表文件 ,并指定其名称和路径。

$ PRINT ( C: \ SAMPLE .LST )

[例 3 .6] 列出符号表为缺省情况 ,要使符号表不被列出 ,可使用下列命令。

$ NOSYMBOLS

2 .条件汇编命令

条件汇编命令属于一般控制符。A166 提供的条件汇编命令包括 IF , ELSE ,

ELSEIF , ENDIF , RESE T 和 SET 指令 (见表 3-24 ) ,其中 RESET 和 SET 命令可在汇编

命令中使用 ,也可插入到源程序的汇编控制命令行中使用 ;其他命令只能插入到源程序中

以汇编命令行方式使用。IF指令可以嵌套 10 层。

表 3-24 条件汇编命令

控 制 符 作 用

IF 条件为“真”时 ,编译其下的程序块

ELSE 前面的 I F 和 IFELSE条件为“假”时 ,编译其下的程序块

ELSEIF 条件为“真”,且前面的 IF 和 IFELSE 条件为“假”时 ,编译其下的程序块

IFEND 条件编译结束

SET 把在 IF 或 ELSEIF 命令中检查的符号设为“真”

RESE T 把在 IF 或 ELSEIF 命令中检查的符号设为“假”

下面给出一些条件汇编的例子。

[例 3 .7] 设 TEST 为“真”(0FFF F H ) , IT ERATION = 3 。

$ SET ( TEST , IT ERA TION = 3)

[例 3 .8] 按照符号 SWIT CH 中的值 ,改写 R8 的值。

$ IF ( SWITCH = 1 )

MOV R8, # T ABL E_1

$ ELSEIF ( SWITCH = 2 )

MOV R8, # T ABL E_2

$ ELSEIF ( SWITCH = 3 )

MOV R8, # T ABL E_3

$ IFEND

[例 3 .9] 根据符号 DEBUG和 T RST 中的值是否为“0”, R0 取不同的值。

$ IF (DEBUG)

亿恒 C164CI 16 位单片机

Page 162: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

151

MOV R0, # 1

$ ELSEIF ( TRST )

MOV R0, # 2

$ ELSE

MOV R0, # 0

$ IFEND

3 .4 .4 编程指南

C164 单片机指令集在模块化程序结构、循环、跳转等方面作了很多考虑 ,极大地方便

了软件开发。同时 ,该指令集还对许多常用的指令序列作了简化 ,使之在编程时具有更大

的灵活性。下面说明使用该指令集编程时需注意的一些特点。

1 .一些常用指令的归并简化

(1 ) 换用功能更强的指令

C164 单片机指令集用一些功能更强的指令来代替其他单片机中的一些指令 ,以完成

相同的操作。程序员可以利用宏定义把这些指令定义成和其他单片机指令具有相同的助

记符 ,以方便汇编编程。

可直接替换其他单片机指令的一些指令 ,如表 3-25 所示。

表 3-25 被替换指令列表

被替换指令 C164 中指令 功 能

CLR Rn AND Rn, # 0 H 寄存器清零

CPLB Bit BMOVN Bit ,Bit 对位求反

DEC Rn SUB Rn , # 1 H 寄存器递减

INC Rn ADD Rn, # 1 H 寄存器递增

SWAPB Rn ROR Rn, # 8 H 在字内交换字节

(2 ) 系统标志位的设置

系统标志位使用置“1”和清零指令 BSET , BCLR 设置。所有的位和字操作指令都可

对 PSW 寄存器寻址 ,因此不必使用诸如“进位标志清零”, 或是“中断使能”之类的专用

指令。

(3 ) 外部存储器的寻址

对外部存储器数据的存取 ,不需要专门的指令来加载数据指针 ,也不需要专用于加载

和存储外部数据的指令。C164 单片机采用冯·诺依曼式存储器结构 ,统一编址。片内硬

件会自动识别是对内部 RAM、通用寄存器或专用寄存器存取数据 ,还是对外部存储器存

取数据。

2 .一些运算的编程特点

(1 ) 乘除

第 3 章 指 令 系 统

Page 163: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

152

对字和双字的乘除运算通过多周期指令来完成。每个指令都隐含使用一个 32 位寄

存器 MD。对寄存器 MD的高位字 ( MDH )或是低位字 ( MDL)写入后 ,或是开始执行一

个乘法或是除法指令时 ,寄存器 MDC 的标志位 MDRIU 均置“1”。只在对寄存器 MDL

进行读操作时 ,对标志位 MDRIU 清零。由于在中断程序中可能需要使用乘除硬件 , 因

此 ,可利用该标志位对中断程序给出警示 ,判断是否需保存寄存器 MD 的中间结果。该

标志位可通过位跳转指令检测到。

乘除运算结果保留在寄存器 MD 中 ,溢出标志位在乘除结果超过 16 位时置“1”,这可

用来判断是否需要将寄存器 MD的高位字和低位字都保存起来。在保存寄存器 MD时 ,

需要先传送寄存器 MDH 到其他存储器 , 再传送寄存器 MDL , 这样才能保证标志位

MDRIU 为正确的状态。

[例 3 .10] 给出一个 16 位乘 16 位的无符号乘法。

SAVE :

JNB MDRI U , START ;检测寄存器 MD 是否正被使用

SCXT MDC, # 0010 H ;保存并清除 MDC ,保留 MDRIU 的置“1”状态

;注意在中断乘除法时 ,需使用这些指令

BSET SAVED ;注明保存操作

PUSH MDH

PUSH MDL ;将寄存器 MD 的结果保留在堆栈中

ST ART :

MU LU R1, R2 ;16 位×16 位无符号乘 , MDRI U 置“1”

JMPR cc_ NV , COPYL ;检测结果是否只有 16 位

MOV R3 , MDH

COPYL :

MOV R4 , MDL

REST ORE :

JNB SAVED, DONE

POP MDL

POP MDH

POP MDC

BCLR SAVED

DONE: . . .

在上述乘法的完成过程中 ,考虑到该乘法可能会中断其他的乘除法 ,因此 ,使用了相

应的保存和恢复指令。寄存器 MDC 的内容也被保存 ,以便恢复被中断的乘除法 , 同时 ,

还对该寄存器清零 ,用来正确标志后续乘除的状态。寄存器 MDC内容必须在执行 RE TI

指令前从堆栈中恢复。

对于除法操作 ,用户必须首先将被除数移入寄存器 MD 中。如果指明是 16 位除 16

位的除法 ,只需加载寄存器 MD中的低位字部分 ,结果也存放在寄存器 MD 中。低位字

部分 ( MDL)存放除法的整数结果 ,高位字部分 ( MDH )则存放余数。

[例 3 .11] 给出一个 32 位除以 16 位的除法。

亿恒 C164CI 16 位单片机

Page 164: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

153

MOV MDH , R1 ;将被除数送到寄存器 MD, MDRI U 置“1”

MOV MDL , R2 ;送寄存器 MD 的低位字部分

DIV R3 ;32 位/ 16 位的有符号除法 , R3 中存放除数

JMPR cc_ V , ERROR ;检测除法是否溢出

MOV R3 , MDH ;将余数送到 R3

MOV R4 , MDL ;将商数送到 R4 , MDRIU 清零

当一个乘法或除法指令在执行过程中被打断时 ,被中断的指令的地址将被压入堆栈 ,

且中断进程中状态寄存器 PSW 的标志位 MULIP 将置“1”。当中断进程以指令 RE TI 结

束时 ,在原有的 PSW 从堆栈中弹出之前 , 将对标志位 MULIP 作隐含的检测。如果

MULIP =“1”,在 RETI 指令执行之后 ,乘法或除法指令将从堆栈中保存的位置 (返回地

址 )处重新开始 ,并且完成该操作。

标志 MULIP是中断后需保存的内容之一。当中断进程未返回到被中断的任务 (例

如 ,程序调度切换到另一个任务 )时 ,标志位 MULIP 必须根据所要切换到的任务置“1”或

清零。

(2 ) BCD码的计算

没有提供直接支持 BCD码计算的指令。进行 BCD码的计算时 ,必须先将 BCD码格

式转换成二进制格式 ,执行完标准运算之后 ,再将结果转换成 BCD码格式。将 BCD码数

据转换成二进制数 ,可通过多位移位指令完成 ;将二进制数转换成 BCD码格式 ,可以通过

除 10 完成。这能得到与 BCD运算指令相似的结果 ,而不需增加硬件。

(3 ) 浮点运算

浮点运算通过软件实现。用标准的多精度指令进行超出 ALU 位数的数据类型的计

算。多位的循环移位指令和逻辑指令使屏蔽和提取浮点数部分变得容易。

为了加快浮点处理的速度 , C164 的 CPU 内核增加了两个新的功能。首先 , 使用

PRIOR 指令 ,指出 GPR 中第一个为“1”的位的位置 ,这可加快浮点的规格化过程。其次 ,

在右移位过程中 ,利用 PSW 中的溢出标志位 ,在有“1”移到进位标志位时 ,溢出标志置

“1”,这可用来加快规格化浮点数的截尾操作。

3 .一些功能增强的控制操作

(1 ) 寄存器组切换

寄存器组切换为多任务间快速传递数据提供了方便。寄存器组间的切换只需要一个

机器周期。每个寄存器组最多可含有 16 个寄存器 ,最好在一个任务中集中使用一个寄存

器组。在把内部存储器空间分成寄存器组区、内部堆栈和内部存储器区时 ,系统就分配好

了各个寄存器组的指针。进入一个新任务时 ,只要使用适当的寄存器组指针作为上下文

切换指令 SCXT 的操作数 ,就可实现寄存器组的切换。当结束一个任务时 , 只需简单地

使用 POP 指令 ,将前一个任务的寄存器组指针重装载到 CP 中。

(2 ) 表的查找

为了减少查表操作的执行时间 , C164 单片机提供了相当简洁的指令。在无序表的搜

索中 ,增强的 ALU 允许作更复杂的散转运行操作 ;对于有序表的搜索 ,使用递增间接寻

第 3 章 指 令 系 统

Page 165: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

154

址方式和 PSW 中表尾标志位 E ,可减小在循环中指令的执行时间。

下面两个例子将分别阐述有序表和无序表的查找。

[例 3 .12] 给出一个有序表查找的例子。

MOV R0 , # BASE ;将表的基地址赋给 R0

LOOP :

CMP R1 , [ R0 + ] ;比较目标与表的查找值

JMPR cc_SGT , LOOP ;检查是否找到目标

注意 : 表尾存放的内容必须比查找的最大值还要大。

[例 3 .13] 给出一个无序表查找的例子。

MOV R0 , # BASE ;将表的基地址赋给 R0

LOOP :

CMP R1 , [ R0 + ] ;比较目标与表的查找值

JMPR cc_ NET , LOOP ;检查是否找到目标 ,是否到达表的边界

注意 : 表尾存放的内容必须等于最小的有符号整数 8000H。

(3 ) 周边电路的控制和接口

周边电路和 CPU 之间的通信 ,或是通过 PEC 实现与内部存储器的数据传递 ,或是直

接对与周边电路相关的专用寄存器寻址完成。

复位后 ,除监视定时器外 ,所有其他的周边电路都被禁止 ,并初始化为缺省值。程序

员需通过 MOV 指令设置相应的专用寄存器 ,以及通过位操作设置标志位来设定合适的

周边电路配置。

建议使用 BFLDH , BFLDL 或是 MOV 指令来设定专用寄存器的位域 ,避免在使用

BCLR, BSET , AND , OR 等指令时可能出现的不想要的过渡状态。

4 .堆栈的操作

C164 单片机支持两种堆栈。系统堆栈位于片内 RAM 区 ,被隐含使用 ;用户堆栈可

定义在内部或是外部存储器。两种堆栈都从高地址开始 ,向低地址方向延伸。

(1 ) 内部系统堆栈

系统堆栈用来保存返回向量、段指针、过程或中断的状态。系统寄存器 SP指向堆栈

顶部。当数据入栈时 , SP递减 ;反之 , SP 递增。

系统堆栈可以用来暂时保存数据 ,或是在任务的子程序间传递数据。可使用压栈和

出栈指令对系统堆栈进行操作。但在很多情况下 ,使用寄存器组切换方式在多个任务间

传递数据能获得更好的性能。

系统堆栈只能用来保存字。字节首先要转换成字 ,或是忽略字节所在字的其他部分。

寄存器 SP 只能用偶字节地址加载。

堆栈上溢或下溢的检测是通过两个寄存器 (堆栈上溢指针 STKOV 和堆栈下溢指针

ST KUN)来实现的。当 SP达到这两个寄存器内容的任意一个时 ,系统调用相应的异常

处理程序。

亿恒 C164CI 16 位单片机

Page 166: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

155

当 SP 的内容被 CALL , P USH 或是 SUB 指令递减时 ,将 SP 的内容和上溢指针的内

容比较 ,如果 SP的内容小于上溢指针的内容 ,调用异常处理程序。

当 SP 的内容被 RET , POP或是 ADD指令递增时 ,将 SP 的内容和下溢指针的内容

比较 ,如果 SP的内容大于下溢指针的内容 ,调用异常处理程序。

注意 : 当把数据传送到 SP时 ,不进行溢出检测。

程序员经常将软件复位程序放到堆栈溢出异常处理程序中。使用这种方式处理溢出

十分方便 ,但是这要求系统规定的内部堆栈对当前软件运行是足够大的 ,一旦超出堆栈边

界 ,就表示有严重的错误。

(2 ) 循环 (虚拟 )堆栈

循环堆栈技术利用堆栈溢出处理程序来实现较大的堆栈。这时 ,只将当前使用的外

部堆栈的一部分放到内部 RAM 中 ,作高速存取。这样 ,堆栈只占用很少的 RAM ,而将更

多的 RAM 空间用于程序、数据或寄存器。使用循环堆栈时 ,假定溢出不是出现错误 ,而

是需要相应的控制程序。

若使用循环堆栈 ,当内部堆栈已满时 ,会将内部堆栈的内容保存到外部存储器中 ,以

腾出内部堆栈空间来继续做压栈操作。这时 ,需先执行若干个返回和出栈指令 ,腾空部分

内部堆栈。而当内部堆栈的内容都已出栈 ,堆栈空时 ,必须将上次保存在外部存储器里的

内容重新读回到内部堆栈里。由于过程的调用不会无限嵌套 ,调用和返回指令交替 ,保存

和恢复通常不会经常发生。如果不是这种情况 ,而是要频繁地进行保存和恢复操作 ,就不

应该使用循环堆栈技术。

循环堆栈的基本机制在于 SP , STKOV和 STKUN 控制的虚拟堆栈空间的地址和内

部 RAM 中定义的物理堆栈地址之间的相互转换。虚拟堆栈空间可以覆盖所有 SP 指向

的区域 ,即从 00F000H~00F FFE H 的空间。STKOV 和 STKUN 取在这 4KB 的寻址空

间内即可。

内部 RAM 中的物理堆栈空间的大小通过寄存器 SYSCON 中的位域 ST KSZ 来定

义 ,详细情况如表 3-26 所示。

表 3-26 循环堆栈的内部 RAM物理堆栈空间

ST KSZ位域 物理堆栈大小/ 字 物理堆栈的内部 RAM 地址 (字) SP 的有效位

000B 256 00FBFE H~00FA00 H SP .8~SP .0

001B 128 00FBFE H~00FB00 H SP .7~SP .0

010B 64 00FBFE H~00FB80 H SP .6~SP .0

011B 32 00FBFE H~00FBC0 H SP .5~SP .0

100B 512 00FBFE H~00F800 H SP .9~SP .0

101B ⋯ 没有定义 ⋯

110B ⋯ 没有定义 ⋯

00FDFE H~00FX00 H

111B 102400FX00 H 表示最小的内部 RAM 地址 :

SP .11~SP .01KB时 00FA00 H ;2KB时 00F600 H ;

3KB时 00F200 H

第 3 章 指 令 系 统

Page 167: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

156

从物理堆栈高端地址 00FBFE H 的低位部分截去一些位数 ,拼接上虚拟堆栈地址 SP

的有效位 ,就得到实际的物理堆栈地址。这种虚拟地址到物理地址的转换方式 ,保证了物

理地址从物理堆栈的尾部直接绕回到物理堆栈的头部 ,它是由硬件实现的 ,无需程序员关

心 (见图 3-3)。

图 3-3 物理堆栈地址的生成

与堆栈相关的寄存器的复位值 ( STKOV = FA00H ; ST KUN = FC00 H ; SP = FC00 H ;

ST KSZ = 000B) ,将虚拟堆栈直接映射到相同的物理堆栈区域。此时 ,相当于直接使用内

部系统堆栈。

下面的例子用来说明循环堆栈机制 ,亦即虚拟堆栈的映射效应。首先 ,根据所选择的

最大堆栈空间的大小 ,寄存器 R1 被压入物理堆栈的最底端。在其后的指令中 ,虽然在前

面的压栈操作中 , SP的值是以 2 递减 ,寄存器 R2 仍将被压入物理堆栈空间的最高端。

MOV SP, # 0F802 H ;在最后一次进入前 ,置 SP⋯

;物理堆栈中有 256 个字的空间⋯

⋯ ; ( SP ) = F802 H : 物理堆栈地址 = FA02 H

PUSH R1 ; (SP ) = F800 H : 物理堆栈地址 = FA00 H

PUSH R2 ; (SP ) = F7FEH : 物理堆栈地址 = FBFE H

地址转换的作用是将所定义物理堆栈空间的尾部地址重新连接到此物理堆栈空间的

头部地址。当刷新和填充内部堆栈时 ,这种循环堆栈机制只需要移动那些的确要被重新

使用的堆栈数据 (即所定义的堆栈空间的上面的部分 ) ,而无需移动整个堆栈空间。保留

在内部堆栈较低部分的堆栈数据 ,由于和要刷新或填充的部分尚有一段距离 ,故不需要移

动 ,因为堆栈指针将自动移到堆栈空间中的被更新部分的开头。

循环堆栈技术可取的堆栈大小为 32~512 个字 ( ST KSZ = 000B~100B)。不能选择

ST KSZ = 111B,它表明已把内部 RAM 全部用于系统堆栈 , 此时地址转换机制已不起

作用。

当物理堆栈发生上下溢出时 ,进入溢出处理程序。程序员必须在溢出处理程序中将

亿恒 C164CI 16 位单片机

Page 168: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

157

物理堆栈的内容保存到外部存储器中 ,或是从外部存储器中读取。转移数据量的大小由

子程序所需要的堆栈大小 ,子程序、异常处理和中断等程序调用的频繁程度来决定 ,一般

是取内部堆栈的 1/ 4~ 1/ 10。在堆栈数据转移完成后 , 把上下溢出指针 STKOV 和

ST KUN 改成新的当前内部堆栈所处的上下边界地址。因此 ,程序员可以无需考虑内部

堆栈的大小 ,更自由地编写程序 ,只是程序的执行时间要受到堆栈数据转移的影响。

采用循环堆栈机制所需要的初始化过程如下 :

1) 利用 SYSCON 中的 STKSZ 位域确定内部 RAM 区的物理堆栈大小。

2) 确定由外部堆栈上下边界规定的两个指针。

3) 将堆栈上溢指针 STKOV设置为内部物理堆栈的边界地址再加上 6 个字 (留出可

用于两个中断的堆栈空间 )。

初始化完成后 ,内部堆栈将不断接受入栈数据 ,直到 SP 达到上溢边界 STKOV。于

是进入上溢异常处理程序 ,将堆栈顶端的部分内容复制到外部存储器中。同时 ,堆栈上下

溢指针更改成新的外部边界。当从上溢异常处理程序返回后 ,内部堆栈又从其最高地址

处开始接受入栈数据 ,直至 SP又达到新的上溢指针 STKOV。

当 SP 达到下溢边界 STKUN时 ,堆栈变空。堆栈低地址部分由外部存储器重新装

载 ,相应地调整内部指针。

(3 ) 线性堆栈

C164 也可选用线性堆栈 (STKSZ = 111B) ,此时 ,系统堆栈占用了整个内部 RAM 区

域 ,这是在不使用循环堆栈技术的情况下所能得到的最大堆栈。但是 ,这种方式也需要留

一些 RAM 空间给变量和代码。由系统堆栈占用的 RAM 区可用指针 STKUN 和

ST KOV 定义。此时 ,溢出异常处理只用于严重错误检测的服务。

选用线性堆栈时 ,理论上 SP的所有可改变位都可用于物理堆栈的寻址。虽然 SP 所

指的地址可取为 00F000 H~00FFFEH ,但实际上 ,由于系统堆栈必须在内部 RAM 中 ,所

以可用的地址只能是在 00F600H~00FDFEH 之间。使系统堆栈限制在内部 RAM 中是

由程序员实现的。

不要让堆栈使用内部 RAM 以下的空间 ( ESFR 空间和保留区 ) ,也不可把地址范围

00FE00H~00F FFEH 用作堆栈。

(4 ) 用户堆栈

用户堆栈是用户为任务建立的专用数据堆栈 ,与系统堆栈的数据区是隔开的。用户

堆栈接受字节和字的出入栈操作。不再由硬件提供对用户堆栈的上下溢检测。下面列出

了可用来实现用户堆栈操作的寻址方式。

1) [ - Rw] , Rb/ [ - Rw] , Rw : 先递减的间接寻址方式。这种寻址方式用来将一个

字节或一个字压入用户堆栈中 ,只能在 MOV 指令中使用 ,可用任意一个 GPR 作为堆栈

指针。

2) Rb , [ Rwi + ]/ Rw , [ Rwi + ] : 后递增的变址寄存器间接寻址方式。这种寻址方式

用来将一个字节或一个字从用户堆栈中弹出 ,它可用于大部分指令 ,但只有 R0, R1 , R2 ,

R3 可作为堆栈指针。

3) Rb , [ Rw + ]/ Rw , [ Rw + ] : 后递增的间接寻址方式。这种寻址方式用来将一个

第 3 章 指 令 系 统

Page 169: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

158

字节或一个字从用户堆栈中弹出 ,只能在 MOV 指令中使用 , 可用任意一个 GPR 作为堆

栈指针。

5 .过程调用和返回

为了便于模块化编程 ,提供了调用子程序的过程机制。CALL 和 RET 指令可将 IP

等寄存器的内容保存到堆栈中。

(1 ) 利用系统堆栈传递参数

子程序参数传递的方式之一是利用堆栈。在调用程序之前 ,将参数入栈。在执行调

用程序过程中 ,将该参数出栈。如果采用基址加偏移量的间接寻址方式 ,无需将这些参数

从堆栈中弹出 ,就可对它们寻址。

此外 ,指令集还提供了两条指令 ,可方便地实现利用堆栈传递一个参数。PCALL 指

令先将操作数“ reg”和 IP的内容压入系统堆栈 ,然后再调用子程序。当从子程序返回时 ,

RETP 指令自动将 IP和操作数“ reg”的内容从系统堆栈弹出 ,返回调用程序。

(2 ) 不同段间的子程序调用

在不同的程序段之间调用子程序 ,需要使用 CALLS指令 ,该指令将 CSP和 IP 内容

都压入系统堆栈。从子程序返回时 , 使用 RE TS 指令恢复 CSP 和 IP 内容 , 以保证

CALLS后面的指令正确地执行。

相同段内的子程序调用也可以使用 CALLS指令。

(3 ) 为子程序提供局部寄存器

当子程序需要局部寄存器时 ,有以下几种方式 :

1) 使用不同的寄存器组。进入新的子程序时 ,使用 SCXT 指令指定新的寄存器组。

这种方式不支持子程序的递归调用。

2) 利用堆栈保存寄存器内容。在调用子程序之前 ,将寄存器的内容保留到堆栈中 ;

当从子程序返回后 ,再恢复寄存器的内容。这是最一般的方式 ,并且支持子程序递归调

用 ,只是保留寄存器需占用较多的堆栈。

图 3-4 局部寄存器

3) 将系统堆栈当作局部寄存器使用。通

过对 SP 和 CP 的操作 ,用两个机器周期为子

程序中的局部变量动态分配所需的寄存器。

从 SP 中减去相应的局部寄存器空间长度 (注

意堆栈向低地址方向延伸 ) ,并将新的 SP 赋值

给 CP即可。

上述操作是通过 SCXT 指令完成的 ,采用

reg , mem 寻址方式 ,将原先的 CP 内容保护起

来 ,存到系统堆栈中 , 并且将 SP 的值赋给 CP

(见图 3-4)。从子程序返回后 ,需要从栈中恢

复 CP 内容 , 并且将 SP 加上局部寄存器空间

长度 ,恢复原有的系统堆栈。

这种分配局部寄存器的方式指令十分简便 ,进入子程序后 ,其指令为

亿恒 C164CI 16 位单片机

Page 170: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

159

SUB SP , # 10D ;从当前系统堆栈中留出 5 个字作为局部

;寄存器使用

SCXT CP , SP ;设置寄存器组指针

在退出子程序之前 ,其指令为

POP CP ;恢复 CP

ADD SP , # 10D ;恢复系统堆栈

6 .中断和异常处理

(1 ) 进入和返回

当中断请求的优先级高于当前 CPU 优先级时 , 进入中断服务程序。异常处理程序

的调用与 CPU 优先级无关。当进入中断服务和异常处理时 ,系统状态先被保存在系统

堆栈中 ,然后再调用相应的程序。

所有的中断和异常处理程序需要用 RETI 返回 ,它首先从系统堆栈恢复系统原有的

状态 ,然后再返回中断发生前的位置。

(2 ) 不可中断的指令序列

C164 设计了十分高效的指令集 ,绝大部分指令在一个机器周期完成 ,即使是乘除指

令也可以被中断 ,以减少中断响应的延时。

但在一些特殊情况下 ,程序员需要某些指令序列的执行不被打断。此时 ,可以在这些

指令执行之前和完毕后分别关闭和打开中断。指令集中有 ATOMIC 指令 , 可以节省中

断关闭和恢复所需的设置程序。A TOMIC 指令对紧随其后的 1~4 条指令关闭标准中断

和 PEC 请求 ,同时也关闭了 A 类异常处理 ,包括NMI和堆栈溢出。但仍保留了非法操作

码、非法总线操作等 B 类异常处理。

[例 3 .14] 给出一个使用 ATOMIC指令的例子。

ATOMIC # 3 ;下面 3 条指令将屏蔽中断

MOV R0 , # 1234 H

MOV R1 ,35678 H

MU L R0 , R1 ;上述 3 条指令不响应中断

MOV R2 , MDL ;恢复普通模式

7 .替代 DPP的扩展寻址

对数据寻址的标准机制是使用 4 个数据页指针 DPPx 之一 ,选择一个 16KB 的数据

页 ,再在该数据页内确定 14 位偏移量。4 个数据页指针一共可寻址 64KB 空间 , 如果对

更大的存储器空间操作 ,就需要不断地重新加载 DPP 内容。C164 单片机提供了一些快

速扩展寻址方式 ,可暂时替代标准的 DPP 寻址 ,加快程序执行。在扩展寻址起作用的范

围内 ,同样禁止中断和 A类异常处理。

(1 ) EXTP指令

EXTP 指令允许在紧随其后的 1~4 条指令的寻址过程中 ,不改变 DPP 内容 ,即可任

意切换到另一个数据页。

第 3 章 指 令 系 统

Page 171: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

160

[例 3 .15] 给出一个使用 EXTP指令的例子。

EXT P R15 , # 1 ;新的数据页号在 R15中

MOV R0 , [ R14 ] ; R14 的内容是新数据页内的 14 位偏移量

MOV R1 , [ R13 ] ;恢复标准 DPP 机制

(2 ) EXTS指令

EXTS指令允许在紧随其后的 1~4 条指令的寻址过程中 ,不改变 DPP 内容 ,即可任

意切换到一个 64KB 数据段 , 对其中的数据寻址。此时 , 16 位操作数用来作为段内偏

移量。

[例 3 .16] 给出一个使用 EXTS指令的例子。

EXTS # 15 , # 1 ;新的段号是 15( 0F0000 H~0FFFFFH )

MOV R0 , [ R14 ] ; R14 中是 16 位段内偏移量

MOV R1 , [ R13 ] ;恢复标准 DPP 机制

注意 : EXTP和 EXTS禁止中断的情况和 ATOMIC相同。

(3 ) 对扩展专用寄存器区的短寻址

短寻址方式只能用于对专用寄存器寻址。对扩展专用寄存器的寻址必须使用长寻址

方式。如果使用 EXT R 指令 ,它对紧随其后的 1~4 条指令中的扩展专用寄存器使用了

短寻址方式。

EXTPR 和 EXTSR 指令将 DPP 替代和扩展专用寄存器短寻址结合起来。EXT R,

EXTPR , EXTSR 与 A TOMIC 指令相同 ,也禁止了中断和 A类异常处理。

(4 ) 扩展寻址指令的递归使用

A TOMIC 指令和所有 EXT 扩展指令都只对紧随其后的 1~4 条指令有效。当执行

这类指令时 ,一个内部“扩展指令计数器”开始对有效的指令计数。如果在当前有效的指

令序列中 ,又出现了扩展寻址指令 ,则该计数器会根据新的扩展寻址指令重新开始计数。

因此 ,扩展寻址指令的递归使用可以实现多于 4 条的有效指令作用。

8 .内部程序存储区

C164 单片机的掩膜 ROM , OTP以及 Flash 版本都提供片上程序存储空间。该程序

存储区的低 32KB 叫做内部 ROM 区。该内部 ROM 区的使用可通过软件方式在复位期

间设置 , ROM区可以映射到段 0、段 1 或是禁用。

注意 : 无论实际的掩膜 ROM , OTP 或 Flash 为多大 , 内部 ROM 区都占用 32KB 的

寻址空间。

(1 ) 复位时设置内部 ROM

输入引脚EA的状态决定了复位后的第一条指令是从内部 ROM 读入还是从外部程

序区读入。如果EA在复位期间为低 ,将禁止使用内部 ROM ,第一条指令从外部程序区开

始。若EA在复位期间为高 ,则内部 ROM 有效 ,第一条指令从内部 ROM 开始。

对无内部 ROM 的器件 ,不能使用内部程序启动方式。

(2 ) 内部 ROM 映射

亿恒 C164CI 16 位单片机

Page 172: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

161

复位后 ,内部 ROM 区自动映射到段 0 ,缺省值为系统段 ( 000000 H~007F FF H )。这

样 ,复位后的第一条指令从 000000 H 开始执行。如果将 PSW 中的标志位 ROMS1 置

“1”,内部 ROM区就映射到段 1 (010000H~017FFF H )。此时 ,对内部 ROM 区的寻址是

对段 1 的低端寻址 ,而对段 0 的寻址在外部程序区进行。这种工作方式增加了系统软件

的灵活性。这时位于 000000 H~0001FF H 的中断向量表就处在外部空间中 ,可以根据当

前系统的具体情况 ,改变中断向量。而内部 ROM 用来保存诸如 I/ O 驱动、数学运算、常

数表等固定的软件。

(3 ) 复位后使用或禁用内部 ROM

如果在内部 ROM 中没有适当的启动程序 ,系统可以从外部程序启动 ,然后再使用内

部 ROM。如果在内部 ROM 中仅含有启动程序、测试程序 ,则系统从内部 ROM 启动后 ,

可以将其禁用。在用软件切换到从外部存储器执行程序时 ,释放内部的程序区地址给外

部程序区。

(4 ) 使用内部 ROM 时的注意事项

使用内部 ROM 可增强系统的性能和灵活性 ,但要特别注意内部 ROM 的使用问题 ,

以防止系统崩溃。因此需注意以下几个方面 :

1) 程序从内部 ROM 启动。

如果要从内部 ROM 启动系统 ,需要保证芯片含有内部程序存储器 ,并且内部 ROM

中储存了有效的启动程序。

2) 将内部 ROM 映射到段 1。

一旦一条语句更新了内部或外部 ROM 对段的映射 ,对紧随该条指令的下一条指令

更新就已生效。因此 ,为了保证正确寻址到相应的 ROM 区 ,数据页指针要重新加载正确

的值。

在将内部 ROM 区重新映射到段 0 时 ,同样需进行这样的处理。

3) 复位后再对内部 ROM 使能。

如果系统从外部程序空间启动后 ,再对内部 ROM 使能 ,此时 CPU 将使用当前的程

序段偏移量访问内部 ROM ,而不是访问外部 ROM。

4) 复位后禁用内部 ROM。

如果系统从内部 ROM 启动后 ,再禁用内部 ROM ,当程序运行到执行段 0 的语句时 ,

将对外部程序区寻址。

5) 凡是对内部程序区进行配置的指令都应在外部程序区或是片上 RAM 中执行。

一旦内部程序区被禁止、使能或是重新映射 , DPP指针都要重新加载一个正确的值。

3 .4 .5 初始化例程

目标程序必须根据相应的硬件设计对 CPU 进行初始化。本节给出一段用汇编程序

编写的 C164 的初始化程序。

初始化程序在系统复位后被立即执行 ,它执行以下的操作 :

(1 ) 对 SYSCON 和 BUSCON 进行初始化。

第 3 章 指 令 系 统

Page 173: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

162

(2 ) 对 ADDRSELx 和 BUSCONx 进行初始化。

(3 ) 保留硬件堆栈 ,对堆栈上溢和下溢寄存器初始化。

(4 ) 设置 DPP0~DPP3 ,以及 CP寄存器 ,用于存储器和寄存器寻址。

(5 ) 保留用户定义的堆栈 ,并初始化堆栈指针 R0。

(6 ) 对数据存储器清零。

(7 ) 对 C源程序中初始化的变量进行初始化。

(8 ) 将控制传递给 main C函数。

下面是一个 C164CI 单片机只使用内部存储器工作的初始化例程。对于其他情况 ,

程序员可以根据要求进行相应的修改。

$MOD167 ;定义 C167 模式

$CASE

;------------------------------------------------------------------------------------------

;初始化 BUSCON0 和 SYSCON 寄存器

;------------------------------------------------------------------------------------------

NAME ? C_STARTUP

PUBLIC ? C_ST ART UP

;

EXT ERN main : NEAR ;main 为近程区的外部过程

;

PUBLIC ? C_ USRSTKBO T

? C_USERSTACK SECTION DA TA PUBLIC′NDATA′

? C_USRST KBOT :

DS 0200 H ;设置用户堆栈大小

? C_USERSTKT OP :

? C_USERSTACK ENDS

;

? C_MAINREGIST ERS REGDEF R0-R15

;在内部 RAM 中定义寄存器组

;

? C_SYSSTACK SECTION DA TA PUBLIC ′NDAT A′

_TOS EQU 0FC00H ;设置系统堆栈上限为 FC00 H

_BOS EQU _TOS-(512 ) ;复位时系统堆栈大小为 256 个字

? C_SYSSTACK ENDS

;

PUBLIC ? C_SYSST KBOT

? C_SYSSTKBO T EQU_BOS

;

? C_START UP_CODE SECTION CODE′ICODE′

SYSCON DEFR 0FF12 H ;定义专用寄存器

BUSCON0 DEFR 0FF0CH

亿恒 C164CI 16 位单片机

Page 174: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

163

SP DEFR 0FE12 H

STKOV DEFR 0FE14 H

STKUN DEFR 0FE16H

;

? C_RESE T PROC T ASK C_START UP IN TNO RESE T = 0

;定义一个复位初始化过程

? C_START UP : LABEL NEAR ;定义一个近程标号

;

DISWDT ;禁止监视定时器工作

BFLDH BUSCON0 , # 0D2 H , # 00 H ;无外部总线

BFLDL BUSCON0 , # 3FH , # 2E H

BFLDH SYSCON , # 0EFH , # 00 H ;保持复位状态 ,内部 ROM 映射到段 0

;系统堆栈取为 256个字

BFLDL SYSCON , # 6FH , # 00 H ;振荡器看门狗使能

MOV DPP0 , # 0000 H ;设置数据页寄存器

MOV DPP1 , # 0001 H

MOV DPP2 , # 0003 H

MOV CP, # 0FC00 H

EINIT

MOV R0 , # ? C_USERSTK TOP ; R0 用作用户堆栈指针

;------------------------------------------------------------------------------

;在启动程序中对内部 RAM 清零初始化

;------------------------------------------------------------------------------

EXTRN ? C_CLRMEMSECSTART : WORD

;以 ? C_CLRMEMSECST ART 起始的数据结构说明对内部 RAM 清零的情况。

;若第一个字的内容为“0000 H”,表示不对内部 RAM 清零。

;若第一个字的最高两位为“00”,剩余的 14 位表示连续清零的位数 ,第二个字表示

;开始清除的第一位的位地址。

;若第一个字的最高两位为“01”,表示对近地址字节的清零。第一个字剩余的 14 位

;表示连续清除的字节数。第二个字表示开始清除的第一个字节的地址。

;若第一个字的最高两位为“10”,表示对远地址字节的清零。第一个字剩余的 14 位

;表示连续清除的字节数。第二个字表示开始清除的第一个字节的页地址。第三个

;字表示开始清除的第一个字节的页内地址 ,第三个字的最高两位必须为“11”。

;对内部 RAM 区清零只需要用近地址清零方式。

;举例说明如下 :

;如对位地址 3~18 的位清零 ;再对位地址 0X30 H~0X60 H 的位清零 ;

;对近地址 0XFC20H~0XFC2FH的字节清零。为完成此任务 ,从 C_CLRMEMSECSTART

;起始的字节的内容依次为

第 3 章 指 令 系 统

Page 175: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

164

0X0010 0X0003 0X0031 0X0030 0X4010 0XFC20 0X0000

;最后一个字节为 0X0000 ,表示清零结束。

Clr_Me ory:

MOV R8, # ? C_CLRMEMSECSTART ;如取 R8 为 5000 H

JMPR cc_Z , EndClear

RepeatClear :

SRVWDT ;监视定时器重新赋值

MOV R5, # 0 ; R5 设为“0”

MOV R2, [ R8 + ] ;读第一个字

JMPR cc_Z , EndClear ;为“0”则结束清零过程

MOV R3, R2

MOV R4, [ R8 + ] ;读第二个字

JBC R2 .14 ,ClearNear ;次高位为“1”,进行字节的清零

ClearBit :

MOV R3, R4 ;计算该位所在字节的地址

SHR R3 , # 3

BCLR R3 . 0

ADD R3, # 0FD00 H ;位地址区从 FD00 H 开始

MOV R5, # 1 ;计算该位在字节中的位置

SHL R5 , R4

CPL R5

AND R5, [ R3] ;对该位清零

MOV [ R3 ] , R5

ADD R4, # 1 ;计算下一位的位地址

SUB R2 , # 1

JMPR cc_NZ, ClearBit ;清零的位数到了否

JMPR cc_UC, RepeatClear ;位清零结束

Clear Near :

SRVWDT

MOVB [ R4 ] , RL5 ;字节清零

ADD R4, # 1

SUB R2 , # 1

JMPR cc_NN ,ClearNear ;清零的字节数到了否

JMPR cc_UC, RepeatClear ;字节清零结束

EndClear :

;------------------------------------------------------------------------------

;C 程序变量初始化

;------------------------------------------------------------------------------

EXTRN ? C_INITSECSTART : WORD

;以 ? C_INITSECSTAR T 起始的数据结构由若干数据块组成 ,用来说明对位于

亿恒 C164CI 16 位单片机

Page 176: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

165

; RAM 区的变量作初始化。

;若数据块第一个字的内容为“0000 H”,则表示对变量的初始化结束。

;若数据块第一个字的最高位为“1”,表示进行一次位的设置。它只包含一个字节。

;其低位字节的低 7 位表示该位所在字的地址相对 FD00 H 的偏移量。

;其高位字节的低 7 位表示该位在字中的位序号。

;其低位字节的最高位若为“0”,则对该位清零 ;若为“1”,则对该位置“1”。

;若数据块第一个字的最高两位为“01”,则表示对近地址字节的清零。

;对字节清零的数据块由若干字节组成。

;若第一个字低 14 位不为“0”,则其值表示需设置的字节数。

;若第一个字低 14 位为“0”,则用下一个字作为需设置的字节数。

;这些字节在内部 RAM 中是连续存放的。

;接着的一个字表示字节的起始地址。接着往后的各个字节为依次需设置的值。

;总的字节数必须为偶字节 ,即设置数据块以字为单位。

;举例说明如下 :

;如对位地址 3 , 4 和位地址 0X35 的位分别设为“1”;

;并对近地址 0XFC20H~0XFC21H 的字节依次设为“0X01”,“0X10”。

;为完成此任务 ,从 C_INITSECST ART 起始的字的内容依次为

0X8300 0X8400 0X8503 0X4002 0XFC20 0X1001 0X0000

;最后一个字节为 0X0000 ,表示清零结束。

Init_ Va s :

MOV R8, # ? C_INITSECST ART ;如取 R8 为 5100 H

Repeat Init :

SRVWDT ;监视定时器重新赋值

MOV R2, [ R8 + ]

JMPR cc_Z , EndInit ;若为“0”,变量初始化结束

JBC R2 .15 , InitBit ;若为“1”,进行位的初始化

MOV R4, R2

AND R2, # 3FFF H ;得出低 14 位的值

JMPR cc_NZ, LenLoad

MOV R4, # 0

MOV R2, [ R8 + ] ;连续赋值的字节数

LenLoad:

MOV R3, [ R8 + ] ;变量字节块的起始地址

CopyInitVal :

MOVB [ R3] , [ R8 + ] ;变量的赋值

;

SRVWDT ;为避免溢出 ,对监视定时器重新赋值

ADD R3, # 1

第 3 章 指 令 系 统

Page 177: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

166

SUB R2 , # 1

JMPR cc_NZ, CopyInitVal ;字节数未到 ,继续赋值

JNB R8 .0 , RepeatInit ;使字节数为偶数

ADD R8, # 1

JMPR cc_UC ,Repea tInit ;进入下一个模块的赋值

InitBit :

MOVBZ R3 , RL2 ;确定位所在的字节地址

SHL R3 , # 1

OR R3 , # 0FD00 H

MOV R4, # 1 ;确定位在字节中的位置

MOVB RL5 , RH 2

SHL R4 , R5

JB R2 .7 , SetBit ;对位进行赋值

CPL R4

AND R4, [ R3]

JMPR cc_UC ,StoreBit

SetBit :

OR R4 , [ R3]

StoreBit :

MOV [ R3] , R4

JMPR cc_UC ,Repea tInit

EndInit :

JMP main ;转移到主程序

? C_RESE T ENDP

? C_START UP_CODE ENDS

EXT ERN ? C_ENDIN IT : WORD

END

亿恒 C164CI 16 位单片机

Page 178: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

系 统 管 理

4 .1 外 部 总 线

4 .1 .1 概述

虽然 C164CI 提供了多种片内周边电路、片上的 RAM和 ROM / OTP / Flash ,但这

些内部单元只覆盖了 16MB地址空间的一小部分。C164CI 可以通过外部总线接口访问

外部设备和外加的非易失存储器。外部总线接口有几种配置方式 ,以适应不同系统的应

用需要。图 4-1 给出了与外部总线接口有关的 SFR 和端口引脚。

图 4-1 与外部总线接口相关的 SFR 和端口引脚

对外部存储器或外部设备的访问 , 由集成在片内的外部总线控制器 ( EBC )执行。

EBC的功能通过系统控制寄存器 ( SYSCON )、总线模式控制寄存器 ( BUSCONx )与地址

范围选择寄存器 ( ASSRSELx)进行控制。寄存器 BUSCONx 规定了外部总线周期的数

据宽度 (16 位/ 8 位 )、片选信号和等待状态/ ALE/ RW 延时长度。这些参量用于由寄存器

ADDRSELx定义的特定地址区域的访问。

Page 179: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

168

BUSCON1/ ADDRSEL1~BUSCON4/ ADDRESL4 这 4 对寄存器可定义 4 个独立的

地址窗 ,所有超出这些窗口的外部访问都由寄存器 BUSCON0 控制。

在复位时 ,如引脚 EA为高电平 ,则进入单片模式。这种情况下 , 寄存器 BU SCON0

初始化为 0000 H ,总线激活控制位 BUSACT0 也清零 ,所以外部总线不能使用。

单片模式下 , C164CI仅使用内部资源工作 ,未设置外部总线 ,不能访问外设及外部存

储区 ,端口也不会被总线接口占用。但在单片模式下运行时 ,可通过软件设置外部总线 ,

对外部访问使能 ,进入外部总线模式。单片模式允许 C164CI 从内部程序存储区 ( Mask-

ROM , OTP 或 Flash 存储器 )启动程序执行。

若在单片模式下对外部存储区空间进行任何访问 ,都会产生硬件陷阱 ILLBUS。

4 .1 .2 外部总线模式

当对外部总线接口使能 (位 BUSACT x = 1 ) ,且对位域 BTYP进行设置后 , C164CI 使

用一部分端口和控制线构成外部总线。所用的数据总线宽度和外部地址总线模式如表

4-1 所示。

表 4-1 外部总线模式与 BTYP 的关系

BTYP 编码 外部数据总线宽度 外部地址总线模式

00 8位数据 分离的多总线地址

01 8位数据 复用总线地址

10 16 位数据 分离的多总线地址

11 16 位数据 复用总线地址

用于地址窗 ( BU SCON4~BUSCON1 )的总线类型域 ( BTYP)一般是通过软件在系统

初始化的时候选定的。

复位时 ,如果引脚EA为低电平 ,缺省的地址范围对应的寄存器 BUSCON0 的总线类

型域 ( BTYP)由引脚 P0L .7 和 P0L .6 设定。寄存器 BU SCON0 也可以像其他 BUSCON

寄存器那样用软件设置。

C164CI 的 16MB地址空间划分为 256 段 ,每段 64KB。16 位的段内地址从 P0 口输

出。当分段禁止时 ,只有一个 64KB的段可以使用和访问。分段使能时 ,附加地址线可在

P4 口输出 (最大为 4MB) ,并且用几根片选线来选择不同的存储区和外设。这些功能是

在复位时分别通过寄存器 RP0 H 中的两个位域 SALSEL和 CSSEL 选择的。

注意 : 进入中断时是否保存寄存器 CSP,由寄存器 SYSCON 中的位 SGTDIS规定。

分段情况下 ,该位为“0”时 ,把寄存器 CSP压入堆栈 ;不分段时 ,该位为“1”,不压栈。

1 .复用总线模式

在复用总线模式中 , 16 位段内地址和数据一样使用 P0 口。地址和数据时分复用 ,地

址必须在外部锁存 ,所需锁存器的宽度决定于所选数据总线的宽度。例如 , 8 位数据线需

要一字节锁存器 ( P0H 的地址位 A15~A8 不变 , P0L传送地址和数据 ) , 16 位数据线需要

亿恒 C164CI 16 位单片机

Page 180: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

169

一个字长的锁存器 ,最低位的地址线 A0 和字的存取无关。高位地址线 ( An~A16 )总是

从 P4 口输出 (如果分段模式使能 ) ,并且不需要锁存器。

EBC通过一个地址锁存使能信号 ( ALE )把一个地址送到总线上 , 开始一次外部访

问。ALE信号的下降沿触发外部锁存器锁定地址。地址锁存并经过一段时间后 ,将这个

地址从总线上移去。这时 EBC 激活相应的命令信号 ( RD, WR, WRL , WR H ) , 数据由

EBC(写周期 )或外部存储器/ 外部设备 (读周期 )加到总线。经过一段时间后 ,数据有效 ,

这个时间由存储器/ 外设的访问时间确定。

复用总线的读写时序如图 4-2 所示。

图 4-2 复用总线周期

读周期 : 输入数据锁存 ,并解除命令信号。被访问的设备从总线上移走数据 ,使总线

重又进入三态。

写周期 : 命令信号解除时 ,总线上的数据仍然有效 ,直到下一个外部总线周期开始。

2 .分离的多总线模式

在分离的多总线模式中 , 16 位段内地址固定地由 P1 口输出 ,而数据使用 P0 口 ( 16

位数据 )或 P0 口的低 8 位 ( 8 位数据 )。高位地址线固定由 P4 口输出 (复位期间通过

SALSEL 选择 ) ,不需要锁存地址。

EBC把一个地址送到地址总线上 ,开始一次外部访问。在一个可编程的时间间隔

内 , EBC 激活相应的命令信号 ( RD, WR , WR L, WR H ) ,数据由 EBC 送到数据总线上 (写

周期 ) ,或由外部存储器/ 周边电路放到数据总线上 (读周期 )。经过一段由存储器/ 周边电

路确定的访问时间 ,数据变为有效。

读周期 : 输入数据锁存 ,这时命令信号不再有效。被访问的设备从数据总线上撤走

数据 ,数据总线再次进入三态。

写周期 : 这时命令信号不再有效。如果继续要求外部总线周期 , EBC 把相应的地址

放到地址总线。总线上数据保持有效 ,直到下一个总线周期开始。

分离的多总线的读写时序如图 4-3 所示。

第 4 章 系 统 管 理

Page 181: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

170

图 4-3 分离的多总线周期

3 .总线模式的转换

EBC允许不同的总线模式作动态切换 ,即相继的外部总线周期可按不同方式执行。

固定的地址区域可使用 8 位、16 位总线或预先设定的等待状态。

外部总线特性的变化可用两种不同方式启动。

(1 ) 重新设置寄存器 BUSCON 和 ADDRSEL

这种设置可以改变指定的地址窗的总线模式 ,也可以改变使用某一总线模式的地址

窗的大小。重新设置方式允许使用比寄存器 BUSCON 个数要多的各种不同的地址窗 ,

代价是需写寄存器和在程序中放一个适当大小的表格。

(2 ) 预设的地址窗间的切换

切换时会自动选择与各个窗相关的总线模式。允许预设地址窗使用不同的总线模

式 ,不需要其他开销 ,但其数量受到 BUSCON的个数的限制。所有未被这些窗覆盖的地

址区域由寄存器 BUSCON0 控制 ,可使用 BU SCON0 的总线模式。

注意 : 不要改变当前正在供指令流使用的地址区域的配置。这是因为对于内部流水

线处理 ,很难确定使用新的配置所提取的第一个指令 ,因此 ,只能改变当前未被访问的地

址区的配置。这同样适用于寄存器 ADDRSEL。

寄存器 BUSCON和 ADDRSEL 的使用通过“配给地址”控制。当一个访问 (取指令

或数据 )开始时 ,会产生相应的物理地址。如果访问是在片内进行的 ,则使用 ADDRSEL4~

ADDRSEL1 定义的一个地址窗 , 或使用 BUSCON0 的缺省配置。在工作寄存器初始化

后 ,通过翻译物理地址对它们自动进行选择和识别。在运行期间不需附加的转换或选择 ,

除非要使用 4 个地址窗和缺省地址范围之外的单元。

(3 ) 分离多总线到复用总线的切换

分离多总线到复用总线的切换是一种特殊情况。如有其他任何一个寄存器

BUSCON选择分离的多总线 ,在总线周期开始时 ,激活 ALE ,地址像通常那样送到 P4 口

和 P1 口。但是在复用总线模式 , P0 口也需要加上地址。对这种特殊情况 , P0 口上的地

亿恒 C164CI 16 位单片机

Page 182: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

171

址会延迟一个 CPU 时钟周期 ,它使终了的 (复用 )总线周期延迟 ,并延伸相应的 ALE 信

号 (见图 4-4 )。这个额外的时间要求用来释放先前由分离的多总线周期所选设备的

数据。

图 4-4 从分离的多总线到复用总线的切换

(4 ) 外部资源间的切换

在不同的外部资源 (如周边电路 )之间进行切换时 ,如果先前访问的资源需要一些时

间切换其输出驱动器 (在读操作后 ) ,并且该资源需要非常快地对其输出驱动器作另一次

切换 ,可能会引发一些问题。当系统运行在较高的频率时 ,这将导致总线冲突 (关断延迟

的时间通常与时钟频率无关 )。

在这种情况下 ,当下一个周期访问不同的窗口时 ,会自动插入一个附加的等待状态。

这种等待的控制方式和从分离的多总线切换到复用总线时所加的等待相同 ,见图 4-4。

BUSCON 切换等待由寄存器 BU SCON 的位 BSWCx 使能。自动 BU SCON 切换等

待使能 ( BSWCx =“1”)后 ,系统的性能不会因外部总线访问同一个地址窗而受到影响 ,只

是在下一个周期访问不同的地址窗时 ,在先前窗访问的最后一个周期和新窗访问的第一

个周期之间插入一个等待。复位后 ,选择无 BUSCON 切换等待。

4 .外部数据总线宽度

EBC可以对 8 位或 16 位外部存储器和设备进行操作。16 位数据总线使用 P0 口 ,而

8 位数据总线仅使用 P0 口的低位字节 P0L。8 位总线用增加传送时间为代价 ,节省了地

址锁存器、总线收发器、总线路由器和存储器的成本。EBC 可在 8 位数据总线上管理字

的存取 ,也可在 16 位数据总线上管理字节的存取。表 4-2 给出了两种总线宽度的特点。

在 8 位数据总线上 ,字的存取自动分为两个相继字节的存取 ,先存取低字节 ,然后是

高字节。字节到字的组合和字到字节的拆分由 EBC 处理 ,不需要 CPU 和程序员干预。

在 16 位数据总线上 ,字节的存取要求存储器的高字节和低字节可以分别访问。在这

种情况下 ,高字节由BH E信号选取 ,而低字节由 A0 信号选择。因此 ,存储区的两个字节

可分别使能 ,也可在进行字的访问时一起使能。

第 4 章 系 统 管 理

Page 183: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

172

当出现有一个CS输入端 ,但有两个WR使能输入端 (对应两个字节 )的 16 位外部设备

写入字节时 , EBC 可以直接产生两个写入控制信号 ,不再需要在外部对WR信号与 A0 或

BH E进行组合。在这种情况下 ,引脚WR用作WRL (写入低字节 ) ,引脚B HE用作WR H

(写入高字节 )。寄存器 SYSCON中的位 WRCFG 选择引脚WR和BH E的工作方式 ,相应

字节将由数据总线的两半部分去写。

从外部的 16 位设备读入字节时 ,将读入整个字 , C164CI 自动选择要输入的字节 ,并

丢弃另一个字节。但是 ,必须注意那些在读入时状态会发生变化的设备 , 如 FIFO ,中断

状态寄存器等 ,此时应使用BHE和 A0 选择单独的字节。

表 4-2 各类总线模式的性能

总 线 模 式传送速率 (字节/ 字/ 双字

的速度因子 )系 统 要 求 空闲的 I/ O 口线

8 位复用 非常低 (1. 5/ 3/ 6 ) 低 (8 位锁存 ,字节总线 ) P1 H , P1L

8 位分离 低 (1/ 2/ 4) 非常低(无锁存 ,字节总线) P0 H

16 位复用 高 (1. 5/ 1.5/ 3 ) 高 (16位锁存 ,字总线 ) P1 H , P1L

16 位分离 高 (1/ 1/ 2) 低 (无锁存 ,字总线 ) —

注 : 当无寄存器 BU SCO N 选择分离多总线模式时 , P1 口可用于一般 I/ O 口。

5 .引脚BHE禁止/使能的控制

寄存器 SYSCON中的位 BY TDIS用来对引脚BHE使能。如果位 BYTDIS为“0”,则

引脚BH E使能 ;若该位为“1”,则禁止 ,这时此引脚可用作一般的输入输出。B HE引脚由

外部总线控制器隐含地用于选取两个字节存储器芯片中的一个 ,这两个芯片通过 16 位的

外部数据总线连接到 C164CI。

如果复位期间选择 16 位数据总线 ,则在复位后 , BH E的功能自动使能 (位 BYTDIS

为“0”)。当不需要对 16 位存储器作字节的存取时 ,可设位 BYTDIS为“1”,禁止BHE信

号产生。当复位期间选择 8 位数据总线时 ,则在复位后 , BH E的功能由位 BYTDIS禁止。

6 .段地址产生

外部访问期间 , EBC 在 P4 口生成一定数量的地址线 (可编程的 ) ,对 P0 口输出的 16

位地址进行扩展 ,从而增大了可存取的地址空间。在复位时 ,引脚 P0H .4 和 P0 H .3 的状

态写入寄存器 RP0 H 的位域 SALSEL。段地址线的数量由位域 SALSEL 设置并进行选

择 ,如表 4-3 所示。

表 4-3 段地址线的选择

SALSEL 段 地 址 线 可直接存取的地址空间

11 2 根 : A17~A16 256 KB(无下拉时缺省值 )

10 6 根 : A21~A16 4MB(最大值)

01 无 64KB(最小值 )

00 4 根 : A19~A16 1MB

亿恒 C164CI 16 位单片机

Page 184: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

173

7 . CS信号的产生

外部访问期间 , EBC 在 P4 口生成一定数量的CS线 (可编程的 ) ,这样 ,不用外部译码

器就可直接选择外部设备和存储区。在复位时 ,引脚 P0 H .2 和 P0 H .1 的状态写入寄存

器 RP0 H 的位域 CSSEL。CS线的数量由位域 CSSEL 进行设置 ,如表 4-4 所示。

表 4-4 片选线的选择

CSSE L 片 选 线 注 释

11 4 根 : CS3~CS0 缺省值 (无下拉)

10 无

01 2 根 : CS1~CS0

00 3 根 : CS2~CS0

CSx输出和寄存器 BUSCONx 有关 ,对任何寄存器 BUSCONx 规定的地址窗的访问 ,

都会使与其对应的片选线激活 (变低 )。而对任何规定的地址窗外的访问 ,都会使相应的

CSx信号禁止 (变高 )。在每一个外部总线周期的开始 ,相应的CS信号有效 ,同时所有其他

CS线被禁止 (变高 )。

CSx信号不会被任何内部地址区的访问所更新 (即在无外部总线周期开始时 ) ,即使

这个区域被相应的 ADDRSELx 寄存器覆盖。

对片上 XBU S周边电路的访问 ,会禁止所有的外部CS信号。

对任一不在CS线指定的地址窗内的访问 ,所有的CS线都不激活。

芯片选择信号允许以 4 种不同的方式工作 ,通过其对应的寄存器 BUSCONx 中的位

CSWENx和 CSR ENx 来选择 ,如表 4-5 所示。

表 4-5 片选模式的选择

CSWENx CSRE Nx 片 选 模 式

0 0 地址片选 (复位时缺省值 )

0 1 读片选

1 0 写片选

1 1 读/ 写片选

读或写的片选信号只有在相关的控制信号 ( RD和WR )有效时才激活。可编程的读

写延时也是这样。读片选只在读周期内激活 ,写片选只在写周期内激活 ,读/ 写片选在读

写周期内都激活 (若为写周期 ,信号WR H或WRL都可激活 )。当访问像锁存器或驱动器

那些只有单个使能输入的外部设备时 ,使用这些模式可以节省外加的组合逻辑电路。

地址片选信号在整个总线周期内保持有效。地址片选信号有两种产生方式 ,可通过

寄存器 SYSCON 的位 CSCFG选择。

(1 ) 锁存的地址片选信号 ( CSCFG =“0”)。用 ALE 的下降沿激活 ,并在外部总线周

期开始访问一个不同的地址窗时关闭。片选线上不会产生毛刺 ,在访问同一地址窗的内

部存储区单元时 (XBUS周边电路和 XRAM 除外 )也不会发生变化。

第 4 章 系 统 管 理

Page 185: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

174

(2 ) 提早的地址片选信号 ( CSCFG =“1”)。它随地址和BH E(如果使能的话 )一起激

活 ,并在当前总线周期结束前一直工作。提早的地址片选信号不在内部锁存 ,当地址改变

时可立即跟着改变。

注意 : 在复位后 (单片模式除外 )取第一个指令时 ,由CS0提供一个锁存的地址片选

信号。

内部上拉电路在复位时使所有CS线保持为高电平。复位序列结束后 ,断开上拉电

路 ,由引脚驱动电路控制选定的CS线的电平。未被选择的CS线将进入高阻状态 ,并可用

作一般的输入输出。

8 .段地址与片选的关系

C164CI 的外部总线接口可有多种配置来支持外部存储器。通过增加段地址线的数

量 , C164CI可以管理 256KB、1MB或 4MB的线性地址空间 , 实现大块的连续地址空间 ,

通过外部译码器可以访问大量的外部设备。通过增加CS线的数量 , C164CI 可以不用外

加逻辑电路进行存储器组和外设的访问。

如果设定的段地址线和CS线有冲突 (如 A19~A16 和CS1~CS0 ) , 段地址线有优

先权。

4 .1 .3 总线的时序特性

外部总线接口的时序特性是用户可编程的 ,通过编程可以使其适应宽范围的不同外

部总线和不同结构类型的存储器和外设。

外部总线周期的下列参量是可编程的 :

� ALE 控制 定义 ALE 信号的长度和下降沿后的地址保持时间。

� 存储周期 定义允许访问的时间 ,可延伸 1~15 个等待状态。

� 存储器三态时间 定义数据驱动线悬浮的时间 ,可延伸 1 个等待状态。

� 读写延时 定义 ALE下降沿至读写命令激活的时间。

注意 : 内部访问是以最大速度执行的 ,所以是不可编程的。而外部访问在复位后是

使用最慢的总线周期 ,总线周期的时序可以通过初始化程序进行优化。

图 4-5 给出了外部总线周期的时序。

1 . ALE长度的控制

ALE 信号的长度和下降沿后的地址保持时间由寄存器 BUSCON的位 ALEC TLx 来

控制。当位 ALEC TL设置为“1”时 ,外部总线周期对相应地址窗的访问将使 ALE 信号

延长半个 CPU 时钟。同样 , ALE下降沿后的地址保持时间也延长半个 CP U 时钟。所以

在总线周期中 , 数据传送和 CLKOU T 沿的关系和通常一样 , 只是数据传送延长了一个

CP U时钟 (见图 4-6 )。这为地址锁存提供了较多的时间。

注意 : 复位后 , ALEC TL0 为“1”,选择最慢的总线周期 ,其余的 ALEC TLx 在复位后

为“0”。

亿恒 C164CI 16 位单片机

Page 186: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

175

图 4-5 可编程外部总线周期

图 4-6 ALE 长度控制

2 .可编程的存储周期

C164CI 允许用户按照各存储器或外设的存取时间分别调整外部总线周期的时序。

第 4 章 系 统 管 理

Page 187: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

176

存取时间是将数据传送至目的地所需的全部时间 ,是指控制器的信号不变的那段时间。

对不能和控制器最大速度同步的存储器或外设 , C164CI的外部总线周期采用访问过

程中加入等待状态 (见图 4-7 )的方法进行延伸。如果执行当前指令需用这种访问 ,则在

这些存储周期的等待状态时 , CP U 处在空闲状态。

图 4-7 存储周期时间

存储周期的等待状态可通过对寄存器 BUSCON 的位域 MCT C编程 ,以一个 CP U 时

钟为增量进行调整 ,范围为 0~15 个 CP U 时钟。复位后的缺省值是 15 ,即插入长度为 15

个 CPU 时钟的等待状态。

3 .可编程存储器的三态时间

C164CI 允许用户调整两个相继的外部访问的时间 ,以解决外部设备的三态时间。三

态时间定义为 : 当外设在读命令RD不起作用后 ,总线被释放的那段时间。

对需要更多的总线驱动断开时间的存储器或外设 ,外部总线用在前一个总线周期中

加入等待状态 (见图 4-8 )来推迟下一个地址的输出。在存储器三态时间等待状态中 ,

CP U并不是处于空闲状态 ,所以如果下一个指令周期中接着有从外部提取指令或数据的

操作 , CP U 只是延时运行而已。

图 4-8 存储器三态时间

存储器三态时间的等待状态需要一个 CP U 时钟 , 通过寄存器 BUSCON 的位

M T TCx 进行控制。如果位 M TT Cx为“0”(复位后的缺省值 ) ,将插入一个等待状态。

亿恒 C164CI 16 位单片机

Page 188: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

177

注意 : 复用总线模式下的外部总线周期除了有可编程的 MT TC 等待状态外 ,还隐含

有加入一个三态时间的等待状态。

4 .读写信号延时

C164CI 允许用户根据外设的时序要求调整读写命令的时序。读写延时用来控制

ALE下降沿和命令下降沿之间的时间。对无读写延时情况 , ALE 的下降沿和命令是同

时发生的 (不考虑信号传播的延时 )。延时使能后 , 命令在 ALE 下降沿之后经过半个

CP U时钟处开始工作 (见图 4-9 )。

图 4-9 读写延时

在图 4-9 中 ,当RD信号变为有效时 ,来自前面总线周期的数据输出应该禁止。

读写延时不延长存储周期的时间 ,一般也不使控制器放慢工作。但在复用总线模式

下 ,当使用提早的RD信号时 ,外部设备的数据驱动有可能和 C164CI 的地址发生冲突。因

此 ,对复用总线周期总是编程为使用读写延时。

读写延时通过寄存器 BUSCON的位 RWDCx 控制。如果 RWDCx 为“0”(复位后的

缺省值 ) ,则读写命令延时。

5 . WR信号提早释放

外部写访问的持续时间可以缩短 1 个 TCL。WR信号以标准方式激活 (拉到低 ) ,但

是可以比标准时序的规定早 1 个 TCL 释放 (拉到高 ) ,这时数据输出也将早 1 个 TCL 释

放。这是非常有用的 ,特别是在以较高的 CP U 时钟频率工作的系统中 ,以及应用外部模

块 (存储器、周边电路等 )的情况。这些模块在响应诸如片选信号时 ,需要极快地接通它们

自己的数据驱动器 ,而 C164CI 和外部接口电路的输出驱动器之间的冲突可以通过选择

提早的WR得以避免。

注意 : 要确认缩短WR的低电平时间符合外部接口电路/ 存储器的要求。

WR的提早释放是通过寄存器 BUSCON 的位 EWENx 控制的。如果 E WENx 为

“1”, WR 信号将缩短 (复位后的缺省值是标准的WR信号 ,即 EWENx 为“0”)。

第 4 章 系 统 管 理

Page 189: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

178

4 .1 .4 外部总线的控制

EBC的功能由一组寄存器控制 ,如接口引脚 ( WR, BHE )的使用、分段和内部 ROM

映射等一般特性可通过寄存器 SYSCON 来控制 ,寄存器 SYSCON 的组成和各位的作用

参见 2 .3 .4“CP U 专用寄存器”一节 ;而如片选模式、ALE 长度、外部总线模式、读写延时

及等待状态等有关总线周期的特性 ,则由寄存器 BUSCON4~BUSCON0 进行控制 ,其中

4 个寄存器 ( BUSCON4~BUSCON1 )有对应的地址范围选择寄存器 ( ADDRSEL4~

ADDRSEL1) ,它们用来指定最多 4 个地址区及这些区内各自的总线特性。

1 .寄存器 BUSCONx

5 个 BU SCON 寄存器的结构是相同的。寄存器 BUSCON4~BUSCON1 控制选定

的地址窗 ,完全由软件管理。而寄存器 BU SCON0 用于复位后最初的代码访问 ,可部分

地由硬件控制 ,即在复位序列期间由 P0 口引脚初始化。这种硬件控制允许为系统定义

适当的外部总线 ,而不必使用内部的程序存储器。

亿恒 C164CI 16 位单片机

Page 190: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

179

位 功 能

存储周期的控制 (存储周期的等待状态的个数 )

MCTC0000 : 15 个等待状态 (15 - < MCTC > )

1111 : 无等待状态

BUSCONx的读/ 写延时控制

RWDCx 0 : 有读/ 写延时 , ALE下降沿后经过 1 个 TCL激活命令

1 : 无读/ 写延时 ,在 ALE下降沿处激活命令

存储器三态时间控制

MT TCx 0 : 1 个等待状态

1 : 无等待状态

外部总线配置

00: 保留

BT YP01: 8位复用总线

10: 保留

11: 16 位复用总线

注 : BUSCON0 的 BTYP 在复位期间通过 P0 口设定

提早写使能

EW ENx 0 : 正常的WR信号

1 : 提早写。提早 1 个 T LC释放WR信号 ,写数据变为三态

AL E延伸控制

ALECT Lx 0 : 正常的 AL E信号

1 : 延伸的 AL E信号

总线激活控制

BUSACTx 0 : 外部总线禁止

1 : 外部总线使能 (在各自的地址窗内 ,参见 ADDRSE L)

BUSCON 切换控制

BSWCx0 : 地址窗立即切换

1 : 如果下一个总线周期访问不同的地址窗 ,不是由这个 BUSCON 控制的窗 ,插入一个

三态等待①

读片选使能位

CSREN x 0 : CS信号与读命令RD无关

1 : CS信号在读命令期间产生

写片选使能位

CSW ENx 0 : CS信号与写命令 ( WR , WRL , WRH )无关

1 : CS信号在写命令期间产生

① BUSCON 切换等待由要离开地址窗的位 BUSCONx .BSWCx 使能

若引脚EA在复位时为高电平 ,则 BU SCON0 初始化为 0000 H。如果引脚EA在复位

时为低电平 ,位 BUSAC T0 和位 ALEACT0 置为“1”,位域 BTYP 则通过 P0 口加载 ,确定

总线配置。

第 4 章 系 统 管 理

Page 191: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

180

2 .地址范围选择寄存器 ADDRSELx

位 功 能

RGSZ 访问范围大小的选择

定义由各个寄存器对 BUSCONx/ ADDRSELx控制的地址区大小

RGSAD 访问范围起始的选择

定义各个地址区起始地址的高几位 ( A23⋯ )

寄存器 ADDRSEL0 是不需要的 , 因为寄存器 BUSCON0 控制除 BUSCON4~

BUSCON1 的 4 个地址窗外整个地址空间的外部访问。

(1 ) 地址区域的定义

四对寄存器 BUSCON4/ ADDRSEL4~BUSCON1/ ADDRSEL1 可以在 C164CI 的地

址空间内定义 4 个独立的地址区。每个寄存器 ADDRSELx 开辟一个地址窗 ,对此窗内

的外部访问 ,其总线模式由对应的寄存器 BUSCONx 指定。这个窗口的起始地址所使用

的高位地址如表 4-6 所示。对给定的窗口 , 起始地址的高位地址位由标记为“R”的位确

定 ,标记为“×”的低位地址被忽略。

(2 ) 地址窗的仲裁

在 C164CI 地址空间内定义的地址窗可能会有部分相互重叠。特别是在段 0 内 ,为

了更有效地使用外部资源 ,可能会从较大的窗中挖出几个小块。

每一次访问 EBC,都会把当前地址和所有地址选择寄存器 (可编程的 ADDRSELx 和

硬件的 XADRSx)进行比较。

亿恒 C164CI 16 位单片机

Page 192: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

181

表4-6 地址窗高位地址线的设定

位域 RGSZ 窗口大小 与起始地址有关的位 ( A23~A12)

0000 4KB R R R R R R R R R R R R R

0001 8KB R R R R R R R R R R R R ×

0010 16KB R R R R R R R R R R R × ×

0011 32KB R R R R R R R R R R × × ×

0100 64KB R R R R R R R R R × × × ×

0101 128 KB R R R R R R R R × × × × ×

0110 256 KB R R R R R R R × × × × × ×

0111 512 KB R R R R R R × × × × × × ×

1000 1MB R R R R R × × × × × × × ×

1001 2MB R R R R × × × × × × × × ×

1010 4MB R R R × × × × × × × × × ×

1011 8MB R R × × × × × × × × × × ×

11×× 保留 R × × × × × × × × × × × ×

首先 ,和硬件寄存器 XADRSx 比较。若和这些寄存器中的一个匹配 ,将访问由相应

的寄存器 XBCONx 所控制的 XBUS周边电路 ,忽略所有其他的 ADDRSELx 寄存器。

其次 ,再与寄存器 ADDRSEL2 和 ADDRSEL4 比较 ,若和这些寄存器之一匹配 ,将访

问使用相应寄存器 BUSCONx的外部区域 ,而忽略寄存器 ADDRSEL1/ 3(参见图 4-10 )。

图 4-10 地址窗仲裁

再次 ,和寄存器 ADDRSEL1 或 ADDRSEL3 相比 ,若匹配 ,将访问使用相应寄存器

BUSCONx 的外部区域。

最后 ,如果没有任何 XADRSx 或 ADDRSELx 寄存器与之匹配 ,则外部总线访问使

用寄存器 BUSCON0。

注意 : 只能使用已经指定的重叠方式。所有其他重叠方式都会导致总线周期出错。

例如 , ADDRSEL4 不可以与 ADDRSEL2 或 ADDRSEL1 重叠。硬件寄存器 XADRSx 规

定为不可被覆盖。

3 .系统启动配置寄存器 RP0H

RP0H 不能通过软件改变 ,但允许检查当前的设置。

第 4 章 系 统 管 理

Page 193: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

182

位 功 能

写配置

WRC 0: 引脚WR和BH E用作WRL和WRH信号

1: 引脚WR和BH E用作WR和BH E信号

片选线选择(激活的CS线 )

00 : 3 根CS线 ,CS2~CS0

CSSEL 01 : 2 根CS线 ,CS1~CS0

10 : 完全不用CS线

11 : 4 根CS线 ,CS3~CS0(无下拉时缺省值 )

段地址线选择(激活的段地址输出线 )

00 : 4 位段地址 , A19~A16

SALSEL 01 : 不用段地址线

10 : 6 位段地址 , A21~A16

11 : 2 位段地址 , A17~A16 (无下拉时缺省值 )

时钟生成模式配置

CLKCFG 这些引脚定义时钟生成模式

即规定内部的 CPU 时钟如何由加到 XTAL1 端的外部时钟生成

注意事项和应用提示 :

(1 ) 只要有一个寄存器 BUSCON 的位 BUSACT 置“1”,外部总线接口就激活。

(2 ) 不是所有通过寄存器 ADDRSELx 定义的地址窗都可以覆盖其他窗。若发生不

可以覆盖情况 , EBC 的操作将不可预测。

(3 ) 通过寄存器 ADDRSELx 定义的地址窗可以覆盖内部地址区域 ,在这种状况下执

行内部访问。

(4 ) 对任何内部地址区的访问 , EBC保持为不激活状态。

4 .1 .5 EBC的空闲状态

当外部总线接口使能 ,但未进行外部访问时 , EBC 处于空闲状态。只要 IRAM , G PR

或 SFR 之类的内部资源 (从体系结构的角度区分 )被使用 ,外部总线接口就保持不变。

对片上 XBU S周边电路的访问也由 EBC 控制。然而 , 虽然片上 XBUS 周边电路对

控制器来说类似于一个外设 ,但相应的访问不产生有效的外部总线周期。

由于时序的约束 , XBUS周期的地址和写入数据会反映在外部总线接口上。包括 P4

口、BHE和 ALE ,它们在 XBUS周期中也会有脉冲产生 (见表 4-7)。由于 EBC 连接到内

亿恒 C164CI 16 位单片机

Page 194: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

183

部的XCS信号 ,所以外部CS信号不激活 (电平为高 )。

表 4-7 EBC空闲状态期间外部总线接口的状态

引 脚 只作内部访问 XBUS 访问

P0口 三态 (悬浮 )对读操作为三态 (悬浮)

对写操作为 XBUS 写数据

P1口最后使用的外部总线

(如果用于总线接口 )

最后使用的 XBUS 地址

(如果用于总线接口)

P4口最后用于外部的段地址(选择的引脚) 最后用于 XBUS 段地址 (选择的引脚 )

按最后使用的地址激活的外部CS信号 选择的CS信号不激活 (高)

BH E 取最后外部访问时的电平 取最后 XBUS 访问时的电平

ALE 不激活 (低 ) XBUS 周边电路定义的脉冲

RD 不激活 (高 ) 不激活(高 )

WR/ WRL 不激活 (高 ) 不激活(高 )

WRH 不激活 (高 ) 不激活(高 )

4 .1 .6 XBUS接口

C164CI 提供一个片上 XBU S接口 ,允许将集成的专用周边电路连接到标准的 CP U

核。XBU S是外部总线接口的内部体现 ,即它以与外部总线接口相同的方式工作。

接到 XBU S上的每个周边电路 (XBUS周边电路 )都有一个独立的地址窗 ,它是通过

与寄存器对 BUSCON和 ADDRSEL 类似的硬件寄存器对进行控制的。由于在很多情况

下 ,周边电路的接口只需用少数几个寄存器表示 ,因此 ,寄存器常选择比标准 ADDRSEL

寄存器地址窗要小的地址窗。由于该寄存器对所控制的是集成的周边电路 ,不是外接的

周边电路 ,故它们是由掩码设定的 ,不是由用户编程的。

C164CI 对 XBU S周边电路的访问提供和对外部访问一样的选择 , 这些周边电路可

以是字节的 ,也可以是字的 ,可以有也可以没有独立的地址总线。对集成 XBUS 周边电

路还提供有中断节点。

XBU S周边电路的使能方法为 : 复位后 ,所有片上的周边电路被禁止 ,为使 XBUS 周

边电路变为可用 ,必须对寄存器 SYSCON 的全局使能位 XPEN 使能。

表 4-8 摘要列出了 XBUS周边电路和访问相应周边电路所用的等待周期数。

表4-8 C164的 XBUS周边电路

相关的 XBUS周边电路 等待周期数

CAN 2

XRAM 2KB 0

数据 Flash/ EE PROM 4 KB 0

第 4 章 系 统 管 理

Page 195: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

184

4 .2 系 统 复 位

4 .2 .1 概述

复位可由于在引脚RSTIN (硬件复位输入 )上出现硬件复位信号 ,或者执行了 SRST

指令 (软件复位 ) ,或者由监视定时器 ( watchdog timer ,简称 WDT )的溢出产生。

无论是哪一种情况 ,单片机将启动一个内部复位序列 ,进入到预先指定的默认状态。

复位开始时 ,将取消挂起的内部保持状态 ,完成当前的内部访问周期 (如果有的话 )。外部

总线周期终止 ,但 WDT 复位除外 (见下文说明 )。此后 ,总线引脚和 I/ O引脚的驱动将被

断开 (处于三态 )。由复位源决定RSTOU T是否有效。

内部复位序列需要 516 个 CPU 时钟周期完成。内部复位序列期间 ,内部复位条件保

持有效。当内部复位序列完成后 ,若RST IN输入不再有效 ,且 PLL 已经锁定时 ,退出内部

复位 ,由 P0 口及RD设定复位配置 ,然后将引脚 ALE , RD及WR驱动到无效电平。

当内部复位条件取消后 ,复位配置根据 P0 口、RD和 ALE 锁定 ,确定起始的工作模

式。然后将 ALE , RD和WR置到无效电平。

注意 : 位 ADP(选择适配模式 )是用RSTIN的上升沿锁定。这时 ,单片机将从外部或

内部存储器开始执行程序 ,或进入自举模式。例如 , CP U 可从段 0 的 000000 H 地址处开

始执行程序 ,在这个启动位置通常包含一条跳转语句 ,转到一个初始化例程 ,对周边电路

和 CPU 的特殊功能寄存器进行适当的设置。

下面分别介绍各种复位工作情况。

1 .硬件复位

在复位输入RSTIN被拉到低电平时触发硬件复位。为确保复位信号能正确地被识

别到 ,它必须在低电平状态保持至少 2 个 CPU 时钟周期。短暂的RSTIN脉冲如果恰好

在锁存采样点出现 ,也可能触发一次内部复位。复位脉冲的最小持续时间由当前的 CP U

时钟生成方式确定。最慢的情况是使用最大分频因子的慢速分频器来产生 CP U 时钟 ,

这时配置的基本模式使用预分频器 , fCP U = f OSC/ 64。

在复位序列完成后 ,再次对引脚RSTIN进行采样。如果此时复位输入信号无效 , 则

终止内部复位 (呈现为短硬件复位 )。如果复位输入信号仍然有效 ,为低电平 ,则内部复位

状态将延伸到RSTIN变到高电平为止 (呈现为长硬件复位 )。

在硬件复位期间 ,用做复位配置的 P0 口、RD和 ALE 等端口 ,需要一些时间来建立所

需的电平 ,特别是在硬件复位终止一个从外部设备“读”的情况。在建立时间内 ,配置有可

能短暂出错。在发生复位后的内部序列复位期间 ,配置锁存器是不透明的 ,也即新的配置

最早要在复位序列完成后才会变为有效。通常这已超过了建立时间。

当基本时钟是由 PLL 产生时 ,内部复位自动延伸到片上 PLL被锁定为止。

RSTIN输入端有一个内部上拉驱动电路 ,等效于 50kΩ~150kΩ的电阻 (其最低值确

亿恒 C164CI 16 位单片机

Page 196: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

185

定了最小复位时间 )。简单地外接一个电容即可以实现上电自动复位 (见图 4-11 ( b) )。

RSTIN也可连接到一个逻辑门的输出 (见图 4-11( a) ) ,参看“双向复位”一节。

图 4-11 外部复位电路

上电复位信号在时钟稳定后 (使片上晶振稳定约需 10~50ms) ,需在长度为两倍复位

序列的时间 (1036 个 CP U时钟周期 )有效。

2 .软件复位

复位序列可在任何时候通过保护指令 SRST (软件复位 )触发。这条指令可安排在程

序中适当地方执行 ,例如 ,离开自举装载模式 ,或遇到由系统失效产生的硬件陷阱。

注意 : 软件复位仅仅锁存来自 P0 口的总线接口的配置 ( SALSEL , CSSEL , WRC,

BUSTYP)。双向复位使能时 ,软件复位执行情况类似长硬件复位。

3 . WDT复位

若监视定时器在初始化或程序正常运行中未被禁止 ,当它溢出时将触发复位序列。

与硬件及软件复位有所不同 , WDT 复位将先完成正在进行的外部总线周期 ,然后启动内

部复位序列。

注意 : WDT 复位同样只锁存来自 P0 口的总线接口的配置 ( SALSEL , CSSEL ,

WRC, BUSTYP)。双向复位使能时 , WDT 复位执行情况也类似长硬件复位。

4 .双向复位

在特殊的双向复位模式下 , C164CI的引脚RSTIN(通常为输入 )可以由片上的逻辑电

路驱动输出一个有效电平 ,支持外部器件 (如闪速存储器 )的启动要求。双向复位工作的

电路原理图如图 4-12 所示。

双向复位工作时 ,将内部复位资源 (软件 , Watchdog )反映到引脚RSTIN ,且将硬件复

位的短脉冲转换为内部复位序列的最短持续时间。双向复位通过对寄存器 SYSCON 中

的位 BDRST EN 置“1”使能 ,它使RSTIN从纯输入端变为一个漏极开路的输出端。在内

部复位序列期间 ,内部驱动电路将引脚RSTIN拉到低电平。内部复位结束后 ,此引脚被

释放 ,变为由外部电路单独控制的输入端。

第 4 章 系 统 管 理

Page 197: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

186

图 4-12 双向复位工作

双向复位功能用于那些要求有一个确定的复位信号 ,但使用RSTOUT信号又不合适

的外部设备。如外部闪速存储器 ,它必须在通过指令 EINI T 使RSTOU T无效之前离开

复位 ,并将代码准确送出。

具体使用双向复位时 ,必须注意下述特性 :

� 寄存器 SYSCON 中的位 BDRSTEN ,在指令 EINIT 之后将不能改变。

� 在复位之后 ,位 BDRSTEN 清零。

� 复位指示标志总是呈现为长硬件复位情况。

� 对端口 P0 配置的处理与硬件复位时相同 , 特别是当 P0L .4 为低电平时 , 自举装

载可被激活。

� 引脚RSTIN只能按漏极开路输出方式与外部复位电路相连。

� 短硬件复位在内部复位序列期间被延伸。

4 .2 .2 复位后的状态

1 .各个引脚的状态

复位后 , C164CI 各组引脚按它们的功能处在不同的激活状态。总线和控制信号在复

位序列后 ,根据 P0 口进行配置 ,立即进入激活状态 ,或是进行外部访问 ,或是使外部控制

信号无效。通用的 I/ O 口的引脚保持为输入方式 (高阻 ) , 直到由软件重新进行设置为

止。引脚RSTOU T保持有效状态 (低电平 ) ,直到初始化程序结束 (见图 4-13 中说明 )。

2 .复位输出端

引脚RSTOUT专门用作系统中除控制器外的其他部件的复位信号。RSTOU T在复

位序列开始时被驱动到低电平 (有效状态 )。RSTOUT在复位序列结束后仍然保持有效

(低电平 ) ,直到表示初始化结束的保护指令 EINIT 执行 (见图 4-13 )。这样 ,就可在系统

外设的复位信号释放之前 ,完成控制器及片内周边电路单元的全部设置。

注意 : 当选择仿真模式或适配模式时 , RSTOU T将处于悬浮状态。

3 .各寄存器的复位初始值

在复位序列期间 , C164CI的寄存器将预置为缺省值。大部分 SFR,包括系统寄存器

及周边电路控制寄存器以及数据寄存器均将清零。因此 ,所有周边电路和中断系统在复

位之后处于关闭或空闲状态。只有一小部分有初始值 ,它们或是为一固定值 ,或是由输入

亿恒 C164CI 16 位单片机

Page 198: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

187

1 ) 当前总线周期完成或终止。

2 ) 随RSTIN异步切换。与软件复位和 WDT 复位同步。

3 ) 复位在此结束 , C164CI 启动程序执行。

4 ) 输入输出引脚的激活由软件控制。

5 ) 执行 EI NIT 指令。

6 ) 阴影区为内部复位序列 ,与R STIN同步后开始。

7 ) 在双向复位模式中 ,一个短暂的硬件复位延伸到复位序列结束。

8 ) 在双向复位模式中 ,软件复位和 W DT 复位激活RSTIN输出。

图 4-13 复位的输入和输出信号

引脚控制。

DPP1: 0001 H (指向数据页 1)

DPP2: 0002 H (指向数据页 2)

DPP3: 0003 H (指向数据页 3)

CP : FC00 H

STKUN : FC00 H

FTKOV : FA00 H

SP: FC00 H

WDTCON : 00XXH (其值由复位源决定)

S0 RBUF : XXH (未定义 )

SSCRB: XXXXH (未定义 )

SYSCON : 0XX0 H (由复位配置决定其值)

BUSCON0: 0XX0 H (由复位配置决定其值)

RP0H : XXH (P0H 的复位电平 )

ONES: FFFFH (固定值)

4 .内部 RAM

系统复位不会对内部 RAM 的内容产生影响。然而 ,在上电复位之后 ,内部 RAM 的

第 4 章 系 统 管 理

Page 199: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

188

内容是不确定的。这隐含表明 GPR( R15~R0)和映射到内部 RAM 的 PEC 源指针及目

的指针 (SRCP7~SRCP0 , DSTP7~DSTP0 )在一次热复位、软件复位或 WDT 复位后仍

然是不变的 ,但在上电复位之后将是不确定的。

5 .扩展 RAM

系统复位也不会对扩展 RAM 的内容产生影响。但在上电复位之后 ,扩展 RAM 的

内容是不确定的。

6 .复位期间端口及外部总线配置

在内部复位序列期间 ,所有 C164CI 端口设置为输入模式 ,与引脚对应的方向控制寄

存器清零 ,引脚切换到高阻状态。这将确保同一个引脚不至于被 C164CI 和外部器件拉

向不同的电平。引脚 ALE 通过内部下拉电路保持为低电平 , 引脚RD , WR和READY将

通过内部上拉电路保持为高电平。选作CS输出的引脚也将被拉到高电平。

寄存器 SYSCON 和 BU SCON0 将按照 P0 口选择的设置来决定其初始状态。当选

取外部启动时 (引脚EA为“0”) ,这两个寄存器的初始状态为 :

� 寄存器 BUSCON0 的总线类型域 ( BYTP)根据 P0L .7 和 P0L .6 进行初始化。

� 寄存器 BUSCON0 的位 BUSACT0 置为“1”。

� 寄存器 BUSCON0 的位 ALEC TL0 置为“1”。

� 寄存器 SYSCON 的位 ROMEN 将清零。

� 寄存器 SYSCON的位 BYTDIS根据数据总线的宽度设置(若是 8 位 ,则置为“1”)。

� 寄存器 SYSCON 的位 WRCF G根据引脚 P0 H .0 ( WRC)设置。

当选择内部启动时 (引脚EA为“1”) ,这两个寄存器的初始状态为 :

� 寄存器 BUSCON0 置为 0000 H。

� 寄存器 SYSCON 的位 ROMEN 将置为“1”。

� 寄存器 SYSCON 的位 BYTDIS置“1”, BH E被禁止。

� 寄存器 SYSCON 的位 WRCF G根据引脚 P0 H .0 ( WRC)设置。

寄存器 BUSCON0 的其余各位及其他 BUSCONx 寄存器清零。这些缺省的初始化

选择使用最慢的外部总线访问。

当内部复位完成后 , P0 口、P1 口、P4 口和BHE信号的配置将取决于复位期间所选择

的总线类型。如果在复位期间选择了任何一种外部总线模式 , P0 口将按选择的总线模式

工作。P4 口一部分将按选择的数目用于段地址输出 (复位后输出全为“0”) ,并且驱动选

定的CS线 ( CS0线为“0”,而其他有效的CS线为“1”)。当没有 64KB 以上的存储器访问时 ,

可以不分段。

当片上的自举装载在复位期间有效时 ,引脚 T xD0 ( P3 .10 的替换功能 )在接收到全

零字节后 ,将切换到输出模式。

所有其他引脚保持为高阻抗状态。直到有软件或周边电路对它们作出改变为止。

7 .复位后的监视定时器

监视定时器在内部复位结束后开始运行。它将用内部系统时钟的二分频作为计时时

亿恒 C164CI 16 位单片机

Page 200: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

189

钟 ,它装载的缺省值为 00H。因此 ,监视定时器将在内部复位完成后经过 131072 个 CP U

时钟周期 ( fCP U = 20M Hz时为 6.55ms )产生溢出 ,除非在此期间它被禁止工作或被重新

设置。当系统复位是由监视定时器溢出引起时 , 寄存器 WDT CON 中的 WDT R 标志

( WDT 复位指示 )将置为“1”,为软件初始化程序提供内部复位产生的原因。WDT R 可通

过一次硬件复位 ,或通过对监视定时器的服务 ,或在 EINIT 之后置为“0”。

在内部复位完成之后 ,可通过指令 DISWDT 来禁止监视定时器工作。这条指令以保

护指令的方式执行。为了更加安全 ,它只能在复位之后 ,在 SRVWDT 指令 ( Watchdog 定

时器服务 )或 EINIT 指令执行之前的一段时期内执行。此后 , DISWDT 指令将不再

有效。

4 .2 .3 初始化设置

复位后 ,必须对 C164CI 的各个模块进行初始化 ,使其满足适当的应用需要。初始化

与 C164CI 担当的任务和系统的特性 (工作频率、连接的外部电路等 )有关。

在运行具体的应用程序之前 ,要做的典型的初始化操作如下所述。

1 .存储器区

外部复位后 ,外部总线接口可能要重新配置 ,因为寄存器 BU SCON0 初始化为最慢

的总线周期配置情况。为了适合各种不同的存储器和周边电路的总线周期特性 ,要对可

编程的地址窗使能。在单片模式复位后 ,还要对外部总线接口进行使能和配置。

如果使用内部存储器 ,在外部复位后为了使用片内资源 ,要对内部存储器进行使能和

映射。在单片模式复位后 ,可对内部存储器重新映射或完全禁止 ,以使用外部存储器 (部

分或全部 )。

对可编程的程序存储器 ,可以用从串行通道接收一组数据进行编程。

注意 : 对 Flash 或 OTP的编程 ,通过自举装载模式会更好用。

2 .系统堆栈

系统堆栈的缺省设置 (大小、堆栈指针、上限和下限寄存器 )可以按应用要求调整为指

定值。复位后 ,寄存器 SP 和 STKUN 含有同样的复位值 00FC00 H ,寄存器 ST KOV 的内

容为 00FA00 H。缺省的复位初始化情况为使用 256 个字的系统堆栈 ,由堆栈指针确定从

00FBFE H 向低地址生长。

注意 : 内部复位完成后 ,被禁止的中断系统在 SP 被初始化前应保持为禁止。陷阱

(包括NMI)即使在中断系统禁止时 ,仍可发生。

3 .寄存器组

寄存器组的位置由上下文指针规定 ,在使用通用寄存器之前 ,可以调整到按使用要求

确定的组。复位后 ,寄存器 CP 的值为 00FC00H ,由 CP 选定的寄存器组从 00FC00 H 向

高地址生长。

第 4 章 系 统 管 理

Page 201: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

190

4 .片内 RAM

按照应用要求 ,用户可能想在正常程序执行之前 ,对一部分内部的可写的存储器

( IRAM/ XRAM )进行初始化设置。一旦寄存器组由寄存器 CP指定 ,可很容易地通过间

接寻址方式进行初始化。

5 .中断系统

复位后 ,单个的中断节点和全局的中断都被禁止。为了对某个中断节点使能 ,必须指

定它的优先级 ,并对它使能 ,设置好相应的向量地址。中断系统还必须通过寄存器 PSW

中的位 IEN 进行全局使能。在初始化完成前 ,中断系统不得使能 ,以避免发生因使用未

初始化的堆栈指针进行堆栈操作而引起内部存储器定位的错乱。

6 .监视定时器

复位后 ,监视定时器工作 ,按缺省的周期进行计数。如果使监视定时器仍保持激活状

态 ,应选择适当的预分频值和重加载值对计数周期进行编程 ;或者在执行指令 EINIT 之

前 ,将监视定时器禁止 ,使其不再工作。

7 .各个端口

C164CI 的各个端口复位后 ,一般切换到输入状态。但有些引脚可以按情况自动进行

设定 ,如用于外部启动的总线接口引脚、自举模式中的引脚 T xD等。用于一般 I/ O口的

引脚必须用软件初始化 ,所需的工作方式 (输入/ 输出、漏极开路/ 推挽方式、输入门限等 )

与指定引脚要完成的功能有关。

8 .周边电路

复位后 , C164CI 的各个周边电路进入规定的缺省状态 (参见下面各章关于周边电路

的说明 ) ,且一般不工作。为了使用某个周边电路 ,必须按应用的要求进行初始化。

初始化包括选择工作模式 (计数器/ 定时器 )、工作参数 (如波特率 )、对接口引脚使能

(如需使用 ) ,以及为中断节点指定相应的优先级等。

在完成这些标准的初始化操作后 ,还需按应用情况做一些特定的操作 ,如使输出引脚

给出某种电平、通过接口发送代码、锁定输入电平等。

9 .初始化的结束

软件初始化例程应该用指令 EINIT 作为结束。这条指令将以保护指令的方式执行。

指令 EINIT 执行后将产生如下结果 :

(1 ) 禁止指令 DISWDT 的运行。

(2 ) 禁止对寄存器 SYSCON 进行写操作 ,因此 ,所有与寄存器 SYSCON 有关的配置

(如 CLKOUT 使能 ,堆栈大小等 )必须在执行 EINIT 之前完成。

(3 ) 禁止对寄存器 SYSCON2 和 SYSCON3 进行写操作 , 若要对寄存器 SYSCON2

亿恒 C164CI 16 位单片机

Page 202: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

191

及 SYSCON3 再次进行写操作 ,必须通过专门的解锁机制才能执行。

(4 ) 清除寄存器 WDTCON 中的复位资源检测位。

(5 ) 使引脚RSTOU T变为“高”电平 (这个信号可用来指示初始化例程的结束 ,以及

关于外部硬件所进行的特定操作的结束 )。

4 .2 .4 系统的启动配置

虽然大部分 C164CI 的可编程特性是在初始化过程中选择 ,或是在程序执行时再次

设置 ,但也有一些特性必须更早地选定 ,因为它们是在执行程序作第一次访问时就要用到

的 (例如 ,由EA选择是从内部还是外部启动 )。

这些选择由一些锁存在引脚上的逻辑电平进行设置 ,它们将在内部复位序列结束时

读入。在复位期间 ,接到引脚的内部上拉/ 下拉器件有效。于是无外部驱动的引脚保持为

无效/ 缺省电平。而外部的上拉/ 下拉器件可以覆盖缺省电平 ,选取特定的配置。因此 ,很

多配置可通过外部电路的编码进行设置。

注意 : 用于配置的那些引脚上的负载必须足够小 ,使内部上拉/ 下拉器件能满足缺省

电平的要求 ,或是外部的上拉/ 下拉器件能保证所要的电平。而那些需要覆盖掉缺省电平

的引脚必须由外部拉到“高”或“低”。要确认复位序列结束时能达到有效的目标电平。

1 .外部工作复位时系统的启动配置

对外部工作复位 ( EA = 0 ) , 使用 P0 口和引脚RD作启动配置。P0 口的高位字节

( P0H )在复位时将被锁存到寄存器 RP0H , 低位字节 ( P0L ) 将直接作用于寄存器

BUSCON0 (总线模式 )和 C164CI的内部控制逻辑。

对内部控制逻辑进行控制操作的引脚、时钟的配置和保留引脚 ,只在硬件触发的复位

序列期间起作用。而影响 C164CI 配置的引脚在任何复位序列期间均有效 , 包括软件及

WDT 所触发的复位。

P0 H 的设置锁存在寄存器 RP0H 中 ,以便软件接着使用。

图 4-14 给出了 P0 口各位所对应的设置。

图 4-14 复位期间 P0 口的配置

第 4 章 系 统 管 理

Page 203: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

192

下面说明可供选择的复位配置。缺省模式为引脚为“高”,无下拉器件。

(1 ) 仿真模式

若引脚 P0L .0( EMU)在复位期间为低电平 ,则选择仿真模式。这种模式用在仿真和

测试的特殊情况 ,是一种次要的应用 ,所以一般 P0L .0 应保持为高。

仿真模式通过 C164CI 的外部总线接口访问 (方向相反 )集成的 XBUS 周边功能电

路。CP U和一般的周边电路被禁止 ,通过 XBU S连接的模块被激活。

表 4-9 给出了仿真模式情况下各个引脚的功能。

表 4-9 复位配置中专用工作模式的设定

引 脚 功 能 说 明

P4口、P1 口 正常启动 复位时配置的段地址线 ,必须外部驱动

P0口 数据输入/ 输出

RD , WR 控制信号输入

ALE 未使用的输入 保持为低

CLKOU T CLK 时钟输出 自动使能

RST OU T 复位输入 XBUS周边电路复位的外部驱动

RSTIN 复位输入 整个器件的标准复位

P6口 中断输出 发送 XBUS周边电路中断请求(如到仿真系统)

复位时 ,缺省设置为仿真模式关闭。注意 ,仿真模式下引脚 P0 .15( P0 H .7)电平的反

转 ,也即在仿真模式下配置“111”是选择直接驱动。

(2 ) 适配模式

引脚 P0L .1( ADP)在复位期间为低电平时 ,选择适配模式。

在这种模式下 , C164CI进入一种被动状态 ,与它在复位期间的状态类似。C164CI 的

引脚通过内部上拉/ 下拉器件悬浮为三态或置为无效状态。另外 ,引脚RSTOUT悬浮为

三态 ,而不是置为低电平 ,并且片上的振荡器被关闭。

这种模式把装在电路板上的 C164CI 切换到虚拟断开状态 ,这样就可由仿真器来控

制板上的电路。原有的 C164CI 经过一次 P0L .1 保持高电平的复位后 ,仍可恢复其对电

路板的控制。请注意 : 适配模式不理睬 P0 口的配置。

复位时 ,缺省设置为适配模式关闭。

注意 : 当外部时钟发生器经由 XTAL1 输入时 (同时 XTAL2 处于断开状态 ) ,这个时

钟信号也可用来驱动仿真器中的器件。但是如果使用石英晶体时 ,仿真器只能使用这个

石英晶体。这时至少要使原有器件的 XTAL2 端与电路断开 (在适配模式中 XTAL2 输

出为高 )。

适配模式只在外部工作的复位情况下 ( EA = 0 )激活 ,在单片工作情况 ( EA = 1 )下对

引脚 P0L .1 不予考虑。

(3 ) 专用工作模式

引脚 P0L .5~P0L .2 (SMOD)用来在复位期间选择专用工作模式 (见表 4-10 )。为了

保证 C164CI 正常工作 ,要确认选择了有效的配置。

亿恒 C164CI 16 位单片机

Page 204: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

193

片上自举装载允许通过串行接口 ASC0 把启动代码送到 C164CI 的内部 RAM 中。

C164CI 将继续保持自举装载模式 ,直到做一次不选择自举装载模式的硬件复位或软件

复位。

复位时 ,缺省设置为 C164CI 从地址为 000000H 处开始读取代码 ,自举装载关闭。

表 4-10 复位配置中专用工作模式的设定

P0L .5~P0L .2 专用工作模式 说 明

1111 正常启动 缺省配置 ,用引脚EA定义执行的起点

1110 保留 不选用这种配置

1101 保留 不选用这种配置

1100 保留 不选用这种配置

1011 标准的自举装载 通过接口 ASC0 装载自举程序

1010 保留 不选用这种配置

1001 替换的装载 还未定义 ,不能使用

1000 保留 不选用这种配置

0111 不是仿真模式情况的替换启动 还未定义 ,不能使用

0110 保留 不选用这种配置

0101 保留 不选用这种配置

0100 保留 不选用这种配置

00×× 保留 不选用这种配置

(4 ) 外部总线类型

如果引脚EA选择外部启动 ,则引脚 P0L .7 和 P0L .6 ( BU STY P)在复位期间将选择

外部总线类型 (参见表 4-1)。这种设置对复位后第一次代码读取亦是有效的。这两位将

复制到寄存器 BUSCON0 的位域 BTYP 内。P0L .7 控制数据总线宽度 ,而 P0L .6 控制地

址的输出。如有需要 ,可在复位后由软件改变。

如果通过引脚EA选择了内部启动 ,这两个引脚将被忽略 ,且寄存器 BUSCON0 的位

域 BTYP 清零。

复位时 ,缺省设置为 16 位数据总线 ,地址复用。

(5 ) 写操作配置

引脚 P0 H .0 ( WRC)在复位期间选择控制引脚WR和BHE的初始化操作。当其为

“高”电平时 ,此引脚选择标准功能 ,即WR和B HE。当其为“低”电平时 ,则选择替换的配

置 ,即WR H和WRL。因此 ,即使是复位后的第一次存储器访问 ,也可由WRH和WRL进

行控制。这一位锁存到寄存器 RP0 H , 且它的“反”将被复制到寄存器 SYSCON 的位

WRCFG中。

复位时 ,缺省设置为标准功能 ( WR和BH E)。

(6 ) 片选线配置

引脚 P0H .2 和引脚 P0 H .1( CSSEL)在复位期间定义了有效的片选信号的个数。这

样 , P4 口的一些引脚用做外部片选信号CS的驱动 , 另一些引脚用于通用 I/ O 接口 (参见

第 4 章 系 统 管 理

Page 205: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

194

表 4-4 )。这两位被锁存在寄存器 RP0H 内。

在复位后 ,不能通过软件改变选作CS信号的引脚数量。如果一个 P4 口的引脚被同

时用做CS和段地址功能 ,则段地址信号优先。

复位时 ,缺省设置为 4 个片选线都有效 ( CS0~CS3)。

注意 : CS信号个数的选取 ,可通过软件在复位后改变 (参见 4 .2 .5“系统配置的更

改”)。

(7 ) 段地址线配置

引脚 P0H .4 和 P0 H .3( SALSEL)在复位期间定义了有效的段地址线的个数。这样 ,

就选定了 P4 口的一些引脚用于地址线的驱动 ,另一些引脚用做通用 I/ O 接口。这两位

也锁存在寄存器 RP0 H 内。

所需的地址空间的选择和在启动时可以访问的地址空间由系统的体系结构决定 ,因

此 ,在初始化程序中可以直接访问所有地址空间而不需要先对此编程。P4 口中要用到的

引脚将自动切换到地址输出模式。

即使不是所有 P4 口的段地址线都使能 , C164CI 内部仍使用整个 24 位寻址机制。这

样 ,当从全部地址线的某些线输出CS驱动信号时 ,对有效地址总线的宽度也就作了限制。

复位时 ,缺省设置为 2 位段地址 ( A17~A16) ,允许访问 256KB。

注意 : 选择的段地址线个数 ,可通过软件在复位后改变 (参见 4 .2 .5“系统配置的更

改”)。

(8 ) 振荡器监视器的控制

片上振荡器监视器 ( OWD)在复位时可通过硬件将RD线拉到低以禁止其工作 ,此方

法和标准复位配置时通过 P0 口进行设置的情况类似。在复位结束时 ,寄存器 SYSCON

中的位 OWDDIS的内容与此时引脚RD的电平相反。在执行 EINIT 之前 ,可通过软件对

位 OWDDIS清零重新使振荡器监视器工作。

注意 : 如果选用直接驱动或预分频操作为基本时钟生成模式 ,任何时候 ,无论是通过

软件或是通过硬件设置 ,只要对位 OWDDIS置“1”, PLL就关闭。

2 .单片模式复位时系统的启动配置

对单片模式复位 ( EA = 1) ,通过 P0 口的配置是用一个固定的配置代替。这时 P0 口

上不接外部电路 (上拉/ 下拉 ) ,且内部配置的上拉器件也不工作。

所需的启动模式是通过引脚RD和 ALE 配置的。

每次长复位后激活固定的缺省配置 ,并选取安全的最慢运行情况的配置。表 4-11 给

出了对应缺省配置所选取的值以及用软件修改的位域。

表 4-11 单片模式复位时的缺省配置

参 数 缺 省 值 外部配置 ① 软 件 ②

CLKCFG: 001B P0 .15~P0 .13 RSTCON .15~RSTCON .13

基本时钟生成模式 预分频工作 ,即 fCPU = fOSC/ 2

亿恒 C164CI 16 位单片机

Page 206: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

195

续表

参 数 缺 省 值 外部配置 ① 软 件 ②

SALSEL : 01B P0 .12~P0 .11 RSTCON .12~RSTCON .11

有效段地址线个数 无段地址线

CSSEL : 10B P0 .10~P0 .9 RSTCON .10~RSTCON .9

有效CS线个数 无片选线

WRC: SYSCON .WRCFG = 0B P0 .8 SYSCON .WRCFG

写信号编码 即WR和BHE

BT YP : BUSCON0 .BTYP = 11B P0 .7~P0 .6 BUSCON0 .BTYP

缺省总线类型 即 16 位复用总线

SMOD : 通过RD和 ALE 选择启动模式 P0 .5~P0 .2 ———

(启动/ 自举模式)

ADP: 适配模式 不可用 P0 .1 ———

EMU : 仿真模式 不可用 P0 .0 ———

OWD: 禁止SYSCON .OWDDIS = 0B RD SYSCON .OWDDIS

即 OWD 工作

① 用缺省值代替与配置有关的引脚。

② 通过这些位域可用软件更改缺省值。

注意 : 给出的这些缺省值使寄存器 RP0 H 的复位值为 XX2BH。

单片模式复位后的工作方式可在复位期间配置 ,用引脚RD和 ALE 选择。引脚RD选

择启动或自举方式 ,对每种方式又有两种方式可选 , 用引脚 ALE 选择其中之一 (见表

4-12)。

表 4-12 单片模式复位时启动方式的配置

RD ALE 启动工作方式 说 明

1 0 标准的启动 从用户存储器 000000 H 单元开始执行

1 1 替换的启动 还未定义 ,不能使用

0 0 标准的自举装载 通过 ASC0 装载 32 个字节

0 1 替换的自举模式 还未定义 ,不能使用

4 .2 .5 系统配置的更改

复位后 ,由硬件选择的系统配置可以用软件通过特殊的代码序列改变。相应的控制

位位于寄存器 SYSCON , BU SCONx 和 RSTCON 中。寄存器 SYSCON 只能在执行指令

EINIT 之前修改 ,而寄存器 BUSCONx 和 RSTCON 使用专门的序列可在任何时候进行

修改。

时钟生成方式 ( CLKCFG)、段地址宽度 (SALSEL)和片选线的个数 ( CSSEL)由寄存

器 RP0 H 控制。RP0 H 按选定的复位模式初始化。如果位 S UE 为“1”,相应配置的位域

在进入 SDD模式时 ,从 RSTCON进行复制。

第 4 章 系 统 管 理

Page 207: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

196

为了改变当前的配置 ,可采取下列步骤 :

(1 ) 把所要的配置值写到寄存器 RSTCON 中。

(2 ) 进入 SDD模式。

(3 ) 返回到基本时钟模式。

改变时钟配置的程序如下。

CH ANG_CLOCK_CONFI URA TION : ;注意 :“RSTCON”是使用存储器地址 ,

;不是 SFR

MOV R15 , # 11100001xxxxxxxxB ;用目标值加载到 GPR

MOV RSTCON , R15 ;对 PLL因子 4 的修改使能

EXTR # 2 ;ESFR 访问

MOV SYSCON2 , # 0500 H ;进入 SDD 模式 ,接通 PLL ,因子为 2

;RSTCON .15~9 是复制到 RP0 H .15~9

MOV SYSCON2 , # 0400 H ;切换到基本时钟模式

;系统现在以锁相环方式运行 ,因子为 4

注意 : 这个例子假定软件是在 EINIT 之前执行。否则 , 在每次访问 RST CON/

SYSCON2 之前 ,必须执行解锁序列。

暂时进入 SDD模式 ,可保证在时钟生成方式 (如 PLL 因子 )改变的情况下时钟信号

的正确同步。

系统配置值的软件修改通过下列特性得到保护。

(1 ) SYSCON在指令 EINI T 后被锁定。

(2 ) RST CON 在指令 EINIT 后需要解锁序列才能更改。

(3 ) 从 RSTCON 到 RP0H 的复制 ,必须用对位 SUE 置“1”进行使能。

注意 : RST CON 只能用长地址方式进行访问。

位 功 能

复位长度控制 (到发生下一个复位序列的持续时间 ) ①

00: 1024TCL ,标准的持续时间

RST LEN 01: 2048TCL ,扩展的持续时间

10: 保留

11: 保留

软件修改使能

SUE 0 : 不能用软件改变配置

1 : 软件修改配置使能

片选线选择 (激活的 CS 线根数 )

CSSEL 00: 3根CS线 , CS2~CS0

01: 2根CS线 , CS1~CS0

亿恒 C164CI 16 位单片机

Page 208: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

197

续表

位 功 能

10: 完全不用CS线

11: 4根CS线 , CS3~CS0 (无下拉时缺省值)

段地址线选择 (激活的段地址输出线根数 )

00 : 4位段地址 , A19~A16

SALSEL 01: 不用段地址线

10: 最多的段地址 , Axx~A16

11: 2位段地址 , A17~A16(无下拉时缺省值 )

时钟生成模式配置

这些引脚定义时钟生成模式 ,即规定内部的 CPU 时钟如何由加到 XTAL1 端的外

部时钟生成

CLKCFG 000 : PLL( f×2. 5) 100: PLL( f×5)

001 : 预分频 ( f/ 2 ) 101: PLL( f×2)

010 : PLL( f×1. 5) 110: PLL( f×3)

011 : 直接驱动 111: PLL( f×4)

① RS TCON 对下一个复位序列总是有效的。然而 ,初始的上电复位比任何一个配置复位序列长得多。

4 .3 电 源 管 理

4 .3 .1 概述

当一个系统中应用的单片机数量不断增长时 ,尽可能减少系统的功耗就成为一个重

要的问题 ,但同时也要考虑使系统的性能达到一定的水平。单片机功耗的减少一般可以

通过降低其工作频率和减少由时钟驱动的电路来实现。C164CI 的体系结构提供了如下

3 种用软件控制降低功耗的主要方法 (见图 4-15 所示 ) :

� 降低 CPU 的频率 ,使其工作在慢速方式 (灵活的时钟管理 )。

� 选择工作的周边电路模块 (灵活的接口管理 )。

� 特殊的管理模式使 CPU、引脚驱动和控制逻辑无效 (空闲、休眠、掉电状态 )。

应用时 ,可针对各种工作条件选择最佳的组合方式 ,以适应各种应用情况 ,如最高性

能工作、部分工作、间歇工作或者待机状态。间歇工作 (也即高性能工作和省电工作交替

进行 )由片上的 R TC(实时时钟 )产生周期性中断给予支持。

上述 3 种方法可以独立使用 ,互不影响 ,这样就为各种应用提供了最大的灵活性。

对于基本的省电模式 (空闲模式 ,掉电模式 )有专门的指令 ,同时有专用寄存器控制时

钟的产生 ( SYSCON2 )和接口的管理 ( SYSCON3 )。这两种通用的省电模式已经在

C164CI 中实现 ,可以通过软件控制进入。

在空闲模式中 , CP U 停止工作 ,已使能的周边电路继续工作。空闲模式可以用任何

的复位或中断请求终止。

在休眠模式中 , CP U 和周边电路都停止工作。实时时钟和它选择的振荡器可以选为

第 4 章 系 统 管 理

Page 209: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

198

图 4-15 可能的节省电源能耗的途径

继续保持运行。休眠模式可以用复位或中断请求来终止。对于硬件请求 ,被停止的周边

电路不能产生中断。

在掉电模式中 , CP U 和周边电路都停止工作。实时时钟和它选择的振荡器可以选为

继续保持运行。但掉电模式只能用硬件复位来终止。

在进入各种省电模式之前 ,所有外部总线的操作都已完成。另外 ,电源管理仍选用当

前的 CPU 工作频率 ,参与控制的周边电路应处在工作状态。

在慢速工作情况下 ,基本时钟产生通道被旁路 ,此时所选取的振荡器时钟信号经过可

编程的慢速分频器 (SDD)产生 CPU 时钟。

接口管理可以使片上的周边电路分别使能和禁止 ,减少时钟驱动的电路个数以及相

应的时钟驱动电路。

4 .3 .2 省电模式

1 .空闲模式

C164CI 单片机可以通过进入空闲模式来减少其电源能耗。在这种模式下 ,所有使能

的周边电路 ,包括 Watchdog 时钟 ,都保持正常工作 ,只是 CP U 的工作被停止 ,同时片内

的存储模块停用。当然 ,那些通过软件禁止的周边电路在进入空闲模式后继续保持禁止

状态。

空闲模式是在 IDLE 指令已执行 ,且它之前的那一条指令已完成后进入的 (寄存器

SYSCON1 的位域 SLEEPCON 必须是 00B)。为避免无意间进入空闲模式 , IDLE 指令是

一个 32 位的保护指令。

空闲模式可以通过任一有效的中断源的中断请求来终止。这些中断源各自的中断允

亿恒 C164CI 16 位单片机

Page 210: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

199

许标志在进入空闲模式之前应被设置 ,不用考虑全局使能位 IEN 的情况。

对一个 CPU 中断服务的请求 , 如果该中断申请源的优先级高于当前 CP U 的优先

级 ,而且中断系统已全局使能 , 则进入相应的中断服务程序。在中断服务程序的 RE TI

(中断返回 )指令被执行之后 , CP U 将继续执行跟着 IDLE 指令后的那条指令。如果中断

请求因为优先级过低 ,或因为中断系统被全局禁止而无法得到响应 ,则 CP U 立刻恢复正

常的程序执行 ,去执行 IDLE 指令后面的指令。

对一个编程为进行 PEC 服务的请求 ,如果请求的优先级高于当前 CP U 的优先级 ,而

且中断系统为全局使能 , 则会执行 PEC 的数据传送。在 PEC 数据传送执行完成之后 ,

CP U继续保持空闲模式。如果 PEC 请求因为优先级过低 , 或因中断系统为全局禁止而

无法得到响应 , CP U 将不再保持空闲模式 ,而是继续执行紧接着 IDLE指令后的指令。

空闲状态也可以被引脚NMI上电平从高到低的跳变所引起不可屏蔽的中断结束。

当空闲模式被中断或NMI请求终止之后 ,中断系统查询所有的优先级 ,以确定最高优先

级的请求。在有NMI请求的情况下 ,总是进入NMI陷阱程序。

图 4-16 给出了空闲模式和激活模式之间的转换关系。

图 4-16 空闲模式和激活模式之间的转换

在进入空闲模式之前已被设置为允许中断的任何中断请求都可以终止空闲状态 ,而

无需考虑 CP U 的优先级。当检测到 CP U 的中断请求时 , CPU 不再回到空闲状态 ,即使

对那些因优先级过低 ,或因中断系统全局禁止 ( IEN = 0)而无法得到服务的中断请求也一

样。当中断系统为全局使能 ,且一个优先级高于当前 CP U 优先级的 PEC 服务被请求并

执行后 , CP U 回到空闲状态。

一个被单独使能且被指定优先级为 0 的中断请求将终止空闲状态 ,但相应的中断向

量不会被访问。

监视定时器可以用来监控空闲模式。如果在监视定时器溢出之前没有中断或NMI

请求 ,则它溢出时会产生一个内部的复位。为了防止监视定时器在空闲模式中的溢出 ,在

进入空闲状态之前 ,应该为它设置一个合理的时间间隔。

2 .休眠模式

为进一步减少电源的能耗 ,单片机可以工作在休眠模式。此时 ,送到所有内部模块的

时钟都停止工作 ( R TC 及其所选用的振荡器是否工作可选择 ) ,而内部 RAM 的内容通过

加到引脚 VDD的电源得以保存 ,监视定时器停止工作。

休眠模式是通过寄存器 SYSCON1 的位域 SLEEPCON 选择的。在执行指令 IDLE

后 ,且指令 IDLE 之前的指令完成时 ,进入休眠模式。

第 4 章 系 统 管 理

Page 211: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

200

休眠模式用任何可用中断源的中断请求终止 ,这些中断的允许标志在进入休眠模式

前已置位 ,与位 IEN 无关。这些中断主要是外部中断和实时时钟 ( R TC)中断。

注意 : 除 R TC 外 ,所有的周边电路停止工作 ,因此不能产生中断请求。

R TC 在休眠模式中可以保持运行 ,以得到加上电源后系统的工作时间 , 这使系统能

够确定当前的时间和关闭多长一段时间。这种情况下的供电电流可低于 1mA。

在休眠模式中 ,加到 VDD 的电压可低到 2 .7V, 而 RT C 和它选用的振荡器将保持运

行 ,内部 RAM 中的内容仍能保持。当 R TC 不工作时 ,电压降低到 2.5V ,内部 RAM 仍

不会丢失数据。

注意 : 当电源电压减少时 ,要考虑此时可用的最大 CP U 时钟频率。要保证唤醒 (输

入沿的识别和 CPU 的启动 )电压必须在规定范围之内。

休眠模式时的总功耗与激活的电路有关 (即和 R TC 是否接通有关 ) , 且和通过口驱

动器的电流有关。各个口驱动器可通过将它们配置为输入来禁止。

总线接口的引脚可以通过释放外部总线 (对位 BU SACT 清零 ,禁止所有的地址窗 )

和把口切换为输入分别禁止。当然 ,这时必须从内部存储器执行所需的程序。

位 功 能

休眠模式配置位 (用 IDLE 指令进入 )

00 : 通常的休眠模式

SLE EPCON 01 : 休眠模式 , RTC 运行

10 : 保留

11 : 休眠模式 , RTC 和振荡器停止工作

3 .掉电模式

要减少电源的能耗 ,单片机还可以设置成掉电模式。其工作情况与休眠模式类似。

同样 ,此时送到所有内部模块的时钟都停止工作 ( R TC 及其所选用的振荡器是否工作可

选择 ) ,而内部 RAM 的内容通过引脚 VDD提供的电源得以保存。

在掉电模式中 ,监视定时器也停止工作。这种模式只有通过外部的硬件复位才能够

终止 ,也即引脚RSTIN应为低电平。这种复位使所有的 SFR 和端口恢复到它们的缺省状

态 ,但并不改变内部 RAM 的内容。

有两级保护措施来防止无意间进入掉电模式。首先 ,用于进入这种模式的 PWRDN

(电源关闭 )指令是一个 32 位保护指令。其次 ,当执行 PWRDN 指令的时候 ,只有引脚

NMI(不可屏蔽的中断 )被外部设置为低电平时 ,该指令才能生效。当 PWRDN 指令完成

后 ,单片机将进入掉电模式。

这一特性可与外部电源丢失信号结合使用。当电源丢失即将发生的时候 ,让外部电

亿恒 C164CI 16 位单片机

Page 212: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

201

源的丢失信号把引脚NMI拉到低电平 ,微处理器就会进入NMI陷阱程序 ,将内部的状态

保存到 RAM 中去。在内部的状态被保存之后 ,陷阱程序就去执行 PWRDN 指令。如果

这时引脚 NMI 仍为低电平 ,将会进入掉电模式 ,否则程序会继续运行。

复位时执行初始化程序 ,可以检测寄存器 WDTCON中的复位识别标志 ,以决定控制

器是初始上电接通 ,还是从掉电模式重新启动。

实时时钟 ( R TC )在掉电模式下可以保持运行 ,只要有电源供给 ,维持系统时间有效。

这样就使系统在关闭时可以确定当前的时间和持续的时间 (通过比较当前时间和进入掉

电模式时的时间标记 )。这种情况下 ,所需的保持电流低于 1mA。

在掉电期间 ,引脚 VDD上的电压可以低于 2.7V ,而 RT C和它选用的振荡器将仍保持

运行 ,而且内部 RAM 中的内容仍被保留。

当 RT C(以及振荡器 )被禁止时 ,内部 RAM会被保持 ,电压可降低到 2.5V。

注意 : 在掉电模式中 ,当 RT C保持有效的时候 ,产生 RT C时钟信号的振荡器也需保

持运行。

在掉电模式下的总功耗取决于激活的电路 (即 R TC 是开还是关 ) ,以及流过引脚的

驱动电流。为了使电流达到最小 , R TC 和所有的引脚驱动可以通过寄存器 SYSCON2 中

的一些位禁止 (使引脚处于三态 )。如果应用中需要保留一个或几个引脚驱动在掉电模式

下有效 ,可以通过把单个引脚驱动配置成输入来使它们无效。

总线接口引脚可以单独用释放外部总线 (通过清除 BUSACT x 各位使所有的地址窗

口禁止 )和将端口引脚切换成输入 (如果需要的话 )禁止。当然 ,在这种情况下所要的软件

必须是从内部存储器执行。

4 .输出引脚的状态

在空闲模式中 , CP U 的时钟被关掉 ,但所有的周边电路仍继续正常工作。因此 ,所有

设置成一般输出的引脚 ,都将输出最后写到其输出锁存器中的数据。如果引脚使用一个

周边电路的替换输出功能 ,引脚的状态将由周边电路的工作情况决定。

用作总线控制功能的引脚将会进入其功能无效的状态 (如WR引脚为高电平 ) ,或者

进入最后一次总线访问所规定的状态 (如B HE )。用作外部地址或数据总线的引脚在进

入空闲模式前 ,将按下列情况保持最后一次外部存储器访问中输出的数据或地址 :

(1 ) 如果使用 8 位数据的复用总线模式 , P0H 将输出最后地址的高字节 ;否则 P0H

悬浮。P0L 在空闲模式中总处于三态。

(2 ) P4 口在那些复位时选定的引脚上输出最后一次访问的段地址和片选 ( CS)信号 ,

其他的输出引脚输出口输出锁存器中的数据。

(3 ) 在休眠模式中 ,振荡器 (用于 R TC 的振荡器除外 )及加到 CP U 和周边电路的时

钟都被关闭。和空闲模式类似 ,所有设置成一般输出的引脚 ,都将输出最后一个写入其口

输出锁存器中的值。当周边电路使用一个口的替换输出功能时 ,这个引脚的状态由时钟

关断前的周边电路的最后一个动作确定。

(4 ) 在掉电模式中 ,振荡器工作情况和休眠模式类似 ,所有设置成一般输出的引脚 ,

第 4 章 系 统 管 理

Page 213: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

202

都将输出最后一个写入其口输出锁存器中的数据。

(5 ) 当引脚使用一个周边电路的替换输出功能时 ,引脚的状态将取决于时钟关闭前

的周边电路的工作。

注意 : 所有引脚驱动电路在进入掉电模式前 , 都可以通过选择端口禁止功能关断。

所有设置成一般输出的引脚 ,都将输出最后一个写入其口输出锁存器中的数据。

当供电电压较低时 ,掉电模式中输出引脚的高电平电压将相应减少。

表 4-13 列出了空闲模式和掉电模式中各个引脚所处的状态。

表4-13 空闲模式和掉电模式中引脚的状态

C164CI

输出脚

外部总线使能 无外部总线

空闲模式 休眠和掉电模式 空闲模式 休眠和掉电模式

CLKOU T 工作 高 工作 高

FOU T 工作 保持 (高或低 ) 工作 保持 (高或低)①

ALE 低 低

RD , WR 高 高

P0L 悬浮 口锁存数据

P0 H A15~A8①/ 悬浮 口锁存数据

P1口 最后的地址/ 口锁存数据 ② 口锁存数据

P4口 口锁存数据/ 最后的段地址 口锁存数据

BH E 最后的值 最后的值 口锁存数据

CSx 最后的值 ③ 口锁存数据

RST OU T 如果在进入空闲模式或掉电模式之前 ,指令 EINIT 已执行 ,引脚为“高”。否则为低。

其他端口

输出引脚口锁存数据/ 替换功能

① 用作 8 位数据复用总线。

② 用于分离的多总线。

③ 与最后地址对应的CS信号保持有效状态 (低电平 ) ,而所有其他使能的CS信号保持无效状态 (高电平 )。在进

入掉电模式之前 ,对片上 XBU S 周边电路的访问 ,所有的外部CS信号无效。

4 .3 .3 慢速工作

可以为慢速工作模式选择一个单独的时钟通道 ,而不使用正常工作时的基本时钟通

道。可编程的慢速分频器 ( SDD ) 对振荡器频率做 1~ 32 分频 , 分频比在寄存器

SYSCON2 的位域 CLKREL 中设定 (分频比为 < CLKREL + 1 > )。在 SDD工作过程中 ,

对位域 CLKREL写入时 ,在产生新的频率之前重装载计数器将会以原有的频率输出一

个或多个时钟脉冲 ,以在内部重新同步。

慢速分频器的工作情况如图 4-17 所示。

如使用 5MHz输入时钟 ,片上逻辑可以在低至 156.25k Hz 的频率下运行 ,而不用改

亿恒 C164CI 16 位单片机

Page 214: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

203

变外部的硬件。在这种情况下 ,正在执行的 PLL可以关闭 ,也可以保持运行 ,这将取决于

应用程序的需要 (见表 4-14 )。

表 4-14 慢速工作模式中的 PLL 工作情况

优 点 缺 点 振荡器监视器

PLL运行 快速切换回到主时钟 PLL 增加功耗 如果未通过位 OWDDIS

禁止 ,处在激活状态

PLL关闭 PLL 不引起附加的功耗 切换回主时钟前 , PLL 必须

锁定 (若 PLL用作主时钟 ) 禁止

注意 : 在慢速工作期间 ,所有的设备 (包括总线接口和 CLKOU T/ F OU T 信号的产

生 )用不对称的 SDD时钟驱动 (见图 4-17 )。

图 4-17 慢速分频器的操作

所有这些时钟通过寄存器 SYSCON2 中的位域 CLKCON 进行选择。有一个状态机

管理此切换机构 ,并确保一个连续的无毛刺的时钟信号加到片上的逻辑部件。这一点在

PLL 暂时关掉而又要切换回 PLL 频率的时候尤为重要。这时 ,可以用两种方法把时钟

源切换回来 ,一是等 PLL自动重新锁定之后 (由寄存器 SYSCON2 中的位域 CLKLOCK

表明 )进行切换 ;二是在位 CLKLOCK 变成“1”之后用软件进行控制。如果应用程序要求

在规定的地点改变频率 ,则后一种方法更好。

切换到慢速工作模式会影响对频率敏感的周边电路 ,如串行接口、定时器、PWM 等。

如果要这些单元在慢速工作模式下正常工作 ,必须改变它们预分频值或重装载值。减小

的 CPU 频率会降低定时器的分辨率和增加波特率生成的步长。在这种情况下 ,振荡器

的频率应适当选择以满足分辨率和波特率的要求。

第 4 章 系 统 管 理

Page 215: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

204

位 功 能

SYSRLSSYSCON 释放功能(解锁域)

为了执行解锁序列 ,必须按指定的方式写入

掉电控制 (在掉电模式期间)

00 : RTC 接通 ,相应端口接通 (复位时的缺省值 )

PDCON 01 : RTC 接通 ,相应端口关断

10 : RTC 关断 ,相应端口接通

11 : RTC 关断 ,相应端口关断

RTC时钟源 (不受复位影响 )

RCS 0: 主时钟

1: 保留

SDD 时钟源(不受复位影响 )

SCS 0: 主时钟

1: 保留

时钟状态控制

00 : 按配置的基本频率运行

CLKCON 01 : 按慢速频率运行 ,如果有 PLL ,将其接通

10 : 按慢速频率运行 ,如果有 PLL ,将其关断

11 : 保留 ,不使用

CLKREL 用于降速分频器的重装载计数值

时钟信号状态位

CLKLOCK0: 主振荡器不稳定或 PLL未锁定 (如果有 PLL)

1: 主振荡器稳定或 PLL锁定 (如果有 PLL)

如果无 PLL ,总是假定为已锁定

注 : SY SCON2 (位域 SYSR LS 除外 )在执行完 EI NIT 之后是写保护的 ,除非通过解锁序列释放。

图 4-18 给出了时钟切换的状态图。表 4-15 给出了各个时钟状态的说明。

图 4-18 时钟切换状态的机制

当 PLL 是基本时钟源 ,并且在 SDD 的工作期间及 PLL 关闭情况下发生复位时 ,则

内部复位条件会继续保持一段时间 ,从而使 PLL在执行开始之前可以锁定。如果没有检

测到稳定的振荡器时钟 ,复位的条件就提早结束。这样就保证了在失去输入时钟信号的

情况下设备的可操作性。

亿恒 C164CI 16 位单片机

Page 216: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

205

表 4-15 时钟切换状态说明

状态号 PLL 状态 fCPU源 CLKCON 注 释

1 锁定 ① 基本 00 基本频率的标准工作状态。

2 锁定 ① SDD 01 PLL 接通 , SDD工作状态 ① 。快速 (无延时 )

或手动从状态 5 回到基本时钟频率。

3 暂态 ① SDD (00) 暂态 ,再转到状态 1

4 暂态 ① SDD (01) 暂态 ,再转到状态 2

5 关断 SDD 10 PLL 关断 , SDD工作状态。减小功耗。

① 如果 PL L选为基本时钟源 ,只可以应用指定的 PLL 状态。如果基本时钟源是直接驱动或预分频器 , PLL 将

不锁定。如果振荡器监视器禁止 ( O WDDIS =“1”) ,则 PL L关断。

4 .3 .4 灵活的接口管理

C164CI 消耗的功率还与激活的逻辑部件的数量有关。接口管理使系统设计者可以

禁止在给定的系统状态中不需要的片内周边电路的工作。所有保持工作的模块仍保持通

常的功能。如果所有的由周边电路时钟驱动器 ( PCD)供给的模块都被禁止 ,并且也没有

要求由 PCD提供其他功能 ,那么 ,这个时钟驱动器本身也可以停止工作 ,以节省额外的电

源消耗。

这种灵活性可以通过把 CPU 时钟分配到几个能单独控制的更小范围的时钟驱动器

来实现。见图 4-19。

图 4-19 CPU 时钟的分配

注意 : 实时时钟 ( R TC)是由一个独立的时钟驱动供给的 ,所以即使在掉电模式下 ,它

也可以保持运行 ,而其他的所有电路与这个时钟不连接。

一般的周边电路的寄存器即使在各自的模块被禁止的情况下 ,只要 PCD 还在运行 ,

就仍可进行访问 (和 ICD相连的周边电路寄存器在这种情况下也同样可以访问 )。而对

XBU S周边电路寄存器 ,如果相应的模块被禁止 ,则不能再访问。

当一个周边电路被禁止时 ,它的输出引脚保持它禁止时的状态。

第 4 章 系 统 管 理

Page 217: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

206

1 .系统控制寄存器 SYSCON3

这种灵活的接口管理的软件控制是通过寄存器 SYSCON3 实现的 ,此寄存器的每一

个控制位都和片内的一个周边功能模块相联系。

注意 : 寄存器 SYSCON3 中的周边电路禁止位的分配是根据器件专门规定的 ,其他

衍生产品的设置可能和 C164CI 不同。

位 功能(相关的周边电路模块 )

ADCDIS A/ D 转换器

ASC0DIS USART ASC0

SSCDIS 同步串行通道 SSC

GPTDIS 通用定时器块 GP T1

DFMDIS 片内数据 Flash 存储器模块 ①

PFMDIS 片内程序 Flash 存储器模块 ①

CC2DIS CAPCOM2

CC6DIS CAPCOM6

CAN1DIS 片上 CAN 模块②

PCDDIS 周边电路时钟驱动器 (还有 XBUS周边电路 )

① 位 P F MDIS 和 D FMDIS 只能在空闲模式期间评测 ,即 Fl ash 模块只在进入空闲模式时关闭 ,在终止空闲模式

时释放。

② 当位 CAN xDI S 清零时 , CAN 模块由内部复位信号释放 ,并必须重新进行配置 ,使其进入合适的工作方式。

注 : S YSCO N3 在执行完指令 EIN IT 之后是写保护的 ,除非是由解锁序列进行释放。

当周边电路时钟驱动器 ( PCD)被禁止时 ,应该注意以下几点 :

(1 ) 所有接到周边电路的时钟信号被停止 ,确保在禁止 PCD之前所有周边电路都进

入了安全可靠的状态。

(2 ) 输出信号 CLKOUT 将保持高电平。

(3 ) 即使在 PCD被禁止的时候 ,中断申请依旧能被识别。

(4 ) 没有新的输出信号经过口输出锁存器加到输出引脚 ,也没有从输入引脚来的新

的输入信号要锁存。

(5 ) 对一般的周边电路没有寄存器可以访问 (对被禁止的一般周边电路个别的寄存

器可以访问 ,对被禁止的 XBUS周边电路没有一个寄存器可以访问 )。

2 .安全机制

对功率管理寄存器的设置具有安全保护机制。

亿恒 C164CI 16 位单片机

Page 218: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

207

功率管理寄存器 SYSCON2 和 SYSCON3 控制着对 C164CI 的工作来说十分重要的

功能和模式。它们在执行完指令 EINIT 之后 ,就像寄存器 SYSCON 一样被锁定了 (寄存

器 SYSCON2 中的位域 SYSRLS除外 )。这是因为这些紧要的系统功能不允许由于发生

无意的软件错误而被修改。但是这些寄存器又与功率管理有关 ,需要在工作中修改 ,以选

择适用的工作模式。系统控制软件可以通过一种特殊的解锁序列对它们进行访问。当解

锁序列正确执行时 ,允许对寄存器 SYSCON2 或 SYSCON3 做一次写操作 ,这样就提供了

最大的安全性。当然 ,对 SYSCON2 和 SYSCON3 进行读操作在任何时候都不受限制。

解锁序列可通过使用规定的指令 (见表 4-16 ) ,向位域 SYSRLS 中写入指定的值执

行。解锁序列的指令 (包括将要进行的写操作 )必须用指令 EXT R 加以保护 (切换至

ESFR 空间 ,并且锁住中断 )。

注意 : 解锁序列不提供对寄存器 SYSCON 的写操作。

表 4-16 SYSCON2/ SYSCON3解锁序列

步 骤 SYSRLS 指 令 注 释

⋯ 0000B① ⋯ 释放序列前的状态

1 1001B BFLDL , OR, ORB ② , XOR ,XORB ② 读-修改-写操作

2 0011B MOV , MOVB ② , MOVBS ② , MOVBZ ② 写操作

3 0111BBSE T ,BMOV ② , BMOVN ② ,

BOR ② , BXOR ①

读-修改-写操作

位指令

4 ⋯ ⋯ 对 SYSCON2 或 SYSCON3 的

单次 (读-修改-写 )操作

⋯ 0000B③ ⋯ 释放序列后的状态

① 如果使用 OR 命令 ,则 S YSRLS 在执行第一步之前应设置为 0000B。

② 对专用寄存器通常不应使用字节的访问。

③ 如果解锁序列和写操作被成功执行 , SYSR LS 就清零。否则 , SYSR LS 显示最后写入的内容。

下面给出几个程序实例 ,显示如何在应用程序中实现对 SYSCON2 或 SYSCON3 的

访问。

(1 ) PLL 保持运行时的例子。

ENT ER_SLOW OWN : ;当前以主时钟频率运行

EXTR # 4 H ;切换到 ESFR 空间 ,锁定序列

BFLDL SYSCON2 , # 0FH , # 09 H ;解锁序列 ,步骤 1(1001B)

MOV SYSCON2 , # 0003 H ;解锁序列 ,步骤 2(0011B)

BSET SYSCON2 .2 ;解锁序列 ,步骤 3(0111B)

;单次访问 SYSCON2/ SYSCON3

BFLDH SYSCON2 , # 03 H , # 01 H ; CLKCON = 01B ‥ > SDD频率 , PL L接通

EXIT_SLOWDOWN : ;当前以 SDD频率运行

EXTR # 4 H ;切换到 ESFR 空间 ,锁定序列

BFLDL SYSCON2 , # 0FH , # 09 H ;解锁序列 ,步骤 1 ( 1001B)

MOV SYSCON2 , # 0003 H ;解锁序列 ,步骤 2 ( 0011B)

第 4 章 系 统 管 理

Page 219: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

208

BSET SYSCON2 .2 ;解锁序列 ,步骤 3 ( 0111B)

;单次访问 SYSCON2/ SYSCON3

BFLDH SYSCON2 , # 03 H , # 00 H ; CLKCON = 00B ‥ > 主时钟频率

(2 ) PLL 停止运行时的例子。

ENT ER_SLOWDOWN : ;当前以主时钟频率运行

EXTR # 1 H ;下一次访问 ESFR 空间

BCLR ISNC .2 ; PLLIE =“0”,即 PLL 中断禁止

EXTR # 4 H ;切换到 ESFR 空间 ,锁定序列

BFLDL SYSCON2 , # 0FH , # 09 H ;解锁序列 ,步骤 1 ( 1001B)

MOV SYSCON2 , # 0003 H ;解锁序列 ,步骤 2 ( 0011B)

BSET SYSCON2 .2 ;解锁序列 ,步骤 3 ( 0111B)

;单次访问 SYSCON2/ SYSCON3

BFLDH SYSCON2 , # 03 H , # 02 H ; CLKCON = 10B ‥ > SDD频率 , PL L关断

SDD_EXIT_ AU TO : ;当前以 SDD频率运行

EXTR # 4 H ;切换到 ESFR 空间 ,锁定序列

BFLDL SYSCON2 , # 0FH , # 09 H ;解锁序列 ,步骤 1 ( 1001B)

MOV SYSCON2 , # 0003 H ;解锁序列 ,步骤 2 ( 0011B)

BSET SYSCON2 .2 ;解锁序列 ,步骤 3 ( 0111B)

;单次访问 SYSCON2/ SYSCON3

BFLDH SYSCON2 , # 03 H , # 00 H ; CLKCON = 00B ‥ > 主时钟频率/ 启动 PLL

EXTR # 1 H ;下一次访问 ESFR 空间

BSET ISNC .2 ; PLLIE =“1”,即 PLL 中断使能

SDD_EXIT_MANUAL: ;当前以 SDD频率运行

EXTR # 4 H ;切换到 ESFR 空间 ,锁定序列

BFLDL SYSCON2 , # 0FH , # 09 H ;解锁序列 ,步骤 1 ( 1001B)

MOV SYSCON2 , # 0003 H ;解锁序列 ,步骤 2 ( 0011B)

BSET SYSCON2 .2 ;解锁序列 ,步骤 3 ( 0111B)

;单次访问 SYSCON2/ SYSCON3

BFLDH SYSCON2 , # 03 H , # 01 H ; CLKCON = 01B ‥ > 停在 SDD/ 启动 PL L

USER_CODE: ;在切换回主时钟之前任何用户程序必须

;是处在能执行的地址空间

CLOCK_ON :

EXTR # 1 H ;下一次访问 ESFR 空间

JNB SYSCON2 .15 , CLOCK_OK ;等到 CLKLOCK =“1”

EXTR # 4 H ;切换到 ESFR 空间 ,锁定序列

亿恒 C164CI 16 位单片机

Page 220: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

209

BFLDL SYSCON2 , # 0FH , # 09 H ;解锁序列 ,步骤 1 ( 1001B)

MOV SYSCON2 , # 0003 H ;解锁序列 ,步骤 2 ( 0011B)

BSET SYSCON2 .2 ;解锁序列 ,步骤 3 ( 0111B)

;单次访问 SYSCON2/ SYSCON3

BFLDH SYSCON2 , # 03 H , # 00 H ; CLKCON = 00B ‥ > 主时钟频率

EXTR # 1 H ;下一次访问 ESFR 空间

BSET ISNC .2 ; PLLIE =“1”,即 PLL 中断使能

4 .3 .5 可编程的频率输出信号

系统时钟输出 ( CLKOU T)可以被可编程频率输出信号 f OU T代替。这个信号是通过

软件控制的 ,与 CLKOUT 不同 ,它可以去适应外部电路的要求。这种可编程特性也使功

率管理延伸到系统量级上。因为 C164CI 的外部接口电路也受到影响 ,所以可使它们按

所选择的频率运行 ,或是暂时完全不工作。

时钟信号是通过重装载计数器生成的 ,输出频率可以选取小的步长 ,可用一个双稳态

触发器得到 50%占空比的时钟信号。

f OU T信号总是给出一个完整的输出周期。

� 当 f OU T开始时 ( FOEN 变为“1”) , FOCNT 从 FORV装载。

� 当 f OU T停止时 ( FOEN 变为“0”) , FOCNT 是在 fOU T达到或为“0”时停止。

f OU T信号是独立的 , 与周边电路的时钟驱动器 PCD 无关。当 PCD 禁止时 ,

CLKOUT 将停止 ,而 f OU T继续工作。于是外部电路可以独立进行控制 ,与片内周边电路

无关。

注意 : 计数器 FOCNT 由 CP U 时钟信号 fCP U驱动 (见图 4-20) ,因此将会受到 SDD

工作的影响。

图 4-20 时钟输出信号的生成

频率输出控制寄存器 FOCON 给出与产生输出信号有关的控制 (频率、波形、激活 ) ,

以及状态信息 (计数值、F OT L)。

第 4 章 系 统 管 理

Page 221: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

210

位 功 能

FOCNT 频率输出计数器

FOT L 频率输出双稳态触发器 ,在 FOCNT 每次溢出时反转一次

FORV 频率输出重装载值 ,在 FOCNT 每次溢出时复制到 FOCNT

频率输出信号选择位

FOSS 0: 双稳态触发器输出 ,占空比为 50%

1: 重装载计数器输出 ,占空比由 FORV 决定

频率输出使能位

FOEN 0: 当 fOU T达到或为“0”时 ,频率输出停止

1: FOCN T工作 , fOUT选通输出在 0到 1 跳变后首先进行重装载

注 : 不要去写 FOCNT 位域 ,特别是计数器正在运行时。在计数器启动后 ,对 FOCNT 写是毫无作用的 ,因为它

将立即从 F ORV 重装载。在工作期间写 F OCN T 可能产生不想要的计数值。

C164CI 中的 f OU T信号是一种替换输出功能 ,它与 CLKOUT 信号共用一个引脚。

共享引脚的优先级由其功能决定 (见表 4-17 )。

表 4-17 共享引脚的优先级

优先级 功 能 控 制

1 CLKOU T CLKEN =“1”, FOEN =“X”

2 FOU T CLKEN =“0”, FOEN =“1”

3 一般 I/ O 口 CLKEN =“0”, FOEN =“0”

注意 : 用来产生 fOU T的引脚必须切换为输出 ,即 DP13.5 =“1”。当 f OU T禁止时 ,引

脚由口锁存器控制。为了维持引脚上 f OU T不工作的电平 , P3 .15 口锁存器必须为“0”(见

图 4-21)。

图 4-21 口的逻辑功能

图 4-22 给出了 f OU T信号的波形。

注意 : 当 F OSS =“1”,对所有 FORV > 0 重装载值 , 输出信号为“高”, 且持续一个

fC PU周期。对所有 F ORV = 0 ,输出信号与 fCP U对应。

输出频率可以按公式 f OU T = fCP U/ ( ( FORV + 1 )×2( 1 - F OSS) )进行计算。因此有

fOU T min = fCP U/ 128( FORV = 3F H , FOSS =“0”)

亿恒 C164CI 16 位单片机

Page 222: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

211

图 4-22 fOU T信号的波形

f OU T max = fCP U/ 1( FORV = 00 H , F OSS =“1”)

表 4-18 fOUT可选用的频率范围

fOUT/ M Hz当 FORV = XXH , FOSS = 1/ 0 时 , fOU T的值/ k Hz FORV ( fOUT = 1MHz)

00 H 01 H 02 H 3E H 3FH FOSS = 0 FOSS = 1

44000

2000

2000

1000

1333. 33

666. 667

63. 492

31. 746

62. 5

31. 2501 H 03H

1010000

5000

5000

2500

3333. 33

1666. 667

158. 73

79. 365

156. 25

78. 12504 H 09H

1212000

6000

6000

3000

4000

2000

190. 476

95. 238

187. 5

93. 7505 H 0BH

1616000

8000

8000

4000

5333. 33

2666. 667

253. 968

126. 984

250

12507 H 0FH

2020000

10000

10000

5000

6666. 667

3333. 33

317. 46

158. 73

312. 5

156. 2509 H 13H

2525000

12500

12500

6250

8333. 33

4166. 667

396. 825

198. 4126

390. 625

195. 3125

0CH

( 1. 04167)17H

4 .4 自 举 装 载

C164CI 内置有自举装载电路 ( Bootst rap loader ,简称 BSL )。BSL 提供了一种在复

位后执行的通过串行接口加载自举程序的机制。在这种情况下 ,从地址 000000 H 开始的

初始化代码不需要放在外部存储器或内部的 ROM , OTP或 Flash 中。

自举装载电路将代码和数据移进内部 RAM ,其工作过程如图 4-23 所示。还可以利

第 4 章 系 统 管 理

Page 223: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

212

用二级装载程序 ,通过串行接口将数据传送到外部 RAM。ROM 存储器 (内部或外部 )虽

不是非要不可 ,但是它可以用于查表或提供“核心代码”,即一组通用的子程序 ,如 I/ O 操

作、计数、系统的初始化等等。

1) 在 fCPU = 20 MH z时 , BSL 初始化时间 > 2μs。

2) 宿主机发送的“零”字节 (1 个起始位 , 8 个“0”数据位 , 1 个停止位 )。

3) 由 C164CI 发送的识别字节。

4) 由宿主机发送的 32 个代码/ 数据字节。

5) 注意 : T xD0 只能在“零”字节接收后确定的时间驱动 (在 fCPU = 20 MH z时为 2 .5μs )。

6) 内部 Boot-ROM。

图 4-23 自举装载时序

自举装载电路可以用来把完整的应用程序软件装载到没有 ROM 的系统中 ,可以对

已完成系统装入的临时软件进行测试和校准 ,也可以装入对闪速存储器编程的程序。

自举装载机制可以用于标准系统的启动 ,也可以只用于一些特殊场合 ,如系统维护

(固件更新 )、逐行的程序调试或测试。

1 .进入自举装载模式

C164CI 在硬件复位的最后 , 当采样到引脚 P0L .4 为低电平时 ,进入自举装载模式。

这时 ,内置自举装载电路有效 ,而与选择的总线模式无关。自举装载的代码存储在特殊的

Boot-ROM 中 ,而不是存储在标准掩模 ROM , OTP 或闪速存储器的某一部分。

在进入自举装载模式和完成相应的初始化之后 , C164CI 检查 RxD0 线 ,接收一个

“零”字节 ,即一个开始位、8 个“0”数据位和一个停止位。根据“零”字节的持续时间 ,可以

计算出在当前 CPU 时钟下的波特率因子 ,初始化串行口 ASC0 ,并将引脚 TxD0 设置成

输出模式。使用这个波特率 ,返回一个识别字节到提供加载数据的宿主机。

识别字节用来识别被装载的器件 ,识别字节的定义如下 :

55 H 8xC166。

A5H 先前版本的 C167 (现已不用 )。

B5 H C165。

亿恒 C164CI 16 位单片机

Page 224: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

213

C5H C167 的衍生单片机。

D5 H 配备识别寄存器的所有单片机。

注意 : 识别字节 D5H 不直接识别出一个具体的单片机。这时 ,这个信息可以从识别

寄存器获得。

当 C164CI 进入自举装载模式之后 ,就会自动建立下面的配置 (与正常复位值不同的

值用斜体标注 )。

监视定时器 : 禁止 寄存器 STKUN : FF40H

上下文指针 CP: FA00H 寄存器 STKOV : FF0CH 0 < - > C

堆栈指针 SP : FA40H 寄存器 BUSCON0 : 启动配置

寄存器 S0CON : 8011 H P3 .10/ TXD0: “ 1”

寄存器 S0BG : 内容取为“0” DP3 .10: “ 1”

与普通的复位不同 ,监视定时器是无效的 ,所以自举装载序列没有时间的限制。引脚

T xD0 配置成输出引脚 ,所以 C164CI 可以回送识别字节。

这时 ,即使内部的 ROM/ OTP/ Flash 有效 ,代码也不能在 Boot-ROM 之外执行。

在复位期间使自举装载有效的硬件 ,可以是一个接在 P0L .4 的下拉电阻。对临时使

用一次的自举装载电路 ,也可以换用另一种方法 (如通过跳线或外部信号 )。图 4-24 给出

了使自举装载有效的硬件电路。

图 4-24 使 BSL 有效的硬件装置

发送完识别字节之后 , ASC0 接收器有效 , 并准备从宿主机接收初始的 32 个字节。

因此半双工的连接就足够自举装载使用了。

注意 : 为了正确地进入自举装载状态 , 不仅需要将引脚 P0L .4 拉低 , 而且引脚

P0L .2、P0L .3 和 P0L .5 都要接收到规定的电平 (参见 4 .2“系统复位”一节 )。

2 .复位后的存储器配置

在自举装载模式下 ,复位后的 C164CI 的内存区域配置与标准的情况不同。在选择

自举装载模式情况下 ,不管引脚EA的状态如何 ,对内部代码存储器的访问有一部分要重

新定向 (见表 4-19 ) , 这时 C164CI 进入 BSL 模式 , 所有代码提取都使用特殊的 Boot-

ROM ,而数据从内部的代码存储区中读取。对没有 ROM 的器件 ,访问数据时会返回一

个不确定的值。

第 4 章 系 统 管 理

Page 225: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

214

表 4-19 自举装载模式下对内部代码存储器的访问

BSL 模式激活 Yes (P0L .4 =“0”) Yes (P0L .4 =“0”) No(P0L .4 =“1”)

引脚 EA 高 低 由应用规定

从内部 ROM

提取的代码Boot-ROM 访问 Boot-ROM 访问 用户 ROM 访问

从内部 ROM

提取的数据用户 ROM 访问 用户 ROM 访问 用户 ROM 访问

注意 : Boot-ROM 中的代码并不是 C164CI 不变的特征。当内部 ROM 区映射到段 1

时 , Boot-ROM 也移到了段 1。

3 .装载启动代码

在发送完识别字节之后 ,自举装载进入通过 ASC0 接收 32 个字节的循环 ,这些字节

依次存入内部 RAM 的 00F A40 H~00FA5F H 地址区域 ,最多有 16 条指令可放到 RAM

区。然后自举装载跳转到地址 00FA40 H ,即最先装载的指令 ,去执行这些代码。此时自

举装载序列结束 ,但 C164CI 仍保持在自举装载的状态。很可能初始化装载程序会装载

更多的代码或数据 ,因为应用程序的平均大小实际上要多于 16 条的指令。第二次接收过

程可以直接使用预初始化接口 ASC0 来接收数据 ,并把它们存储到任意的由用户规定的

地址。

第二级装载的代码可以是最后应用的程序代码 ,也可以是另一个更复杂的装载程序 ,

其中增加了为提高装载数据或代码完整性的传输协议 ,还可能包含有一个改变系统配置

和对总线接口使能的代码序列 ,以便把接收到的数据传送到外部存储器中。

装载过程可能要经过几次反复 ,也可能直接执行最终的应用程序。无论哪种情况 ,

C164CI 都运行在自举装载状态 ,这时监视定时器无效 ,且对内部代码存储区域的访问有

限制。所有从内部 ROM 区 ( 000000 H~ 007FFF H , 在映射到段 1 时为 010000H ~

017FFF H )提取的代码都要重定位到 Boot-ROM。如果含有可用的 ROM , 获取数据时

可以访问 C164CI 的内部代码存储区 ,但对于没有 ROM 的器件 , 将会返回一个不定的

数据。

亿恒 C164CI 16 位单片机

Page 226: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

215

4 .退出自举装载模式

为了按正常模式执行程序 ,必须首先结束自举装载模式。C164CI 依靠软件的复位

(忽略 P0L .4 上的电平 )或硬件的复位 (这时 P0L .4 必须是高电平 )离开自举装载模式。

复位之后 , C164CI从内部 ROM 的 000000H 或者外部存储器开始执行 ,这取决于引脚EA

的设置。

5 .自举装载的波特率选择

ASC0 串行波特率以它所接收到的第一个“零”字节的长度进行计算。C164CI 的启

动程序装载电路允许在一个很宽的波特率范围内工作。但为了确保数据的正确传输 ,仍

然存在最高和最低波特率的限制。波特率 B的计算公式为 :

BC164 CI =fCP U

32· (S0BRL + 1)

式中 S0BRL 是波特率生成器中重装载寄存器的内容 (参见 6 .1 .5“ASC0 波特率生成”一

节 )。

C164CI 用定时器 T3 来测定初始“零”字节的长度。这种方法计数的不准确性意味

着与真实的波特率之间的偏差 ,进一步的偏差是对来自定时器内容的 S0BRL 重载载值的

计算造成的。下面的公式说明了其关系 :

S0BRL =( T3 - 18)

36, T3 =

94·

fC PU

Bhost

对于从宿主机到 C164CI 之间的正确的数据传输来说 ,用于 ASC0 的内部初始化的波特

率 Bco nt r与宿主机的实际波特率 Bhost 之间的最大偏差应小于 2.5%。这个偏差 FB (百分

数 )可以用下面的公式计算 :

FB =Bco nt r - Bhost

Bcon t r·100% , FB ≤ 2.5%

注意 : 计算 FB时 ,没有考虑振荡器的误差以及其他支持串行通讯的设备的偏差。

波特率的偏差是一个与 CPU 时钟和宿主机波特率有关的非线性函数。由于较小的

波特率预分频因子和隐含的较高的量化误差 (见图 4-25 ) ,函数 FB的最大值随宿主机的波

特率的增加而增加。

图 4-25 主机与 C164CI 之间的波特率偏差

(1 ) 最小波特率 (图中 Blow )取决于测量“零”字节时定时器 T3 的最大计数值 ,也取决

第 4 章 系 统 管 理

Page 227: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

216

于 CPU 的时钟。在公式中使用的 T3 最大计数值为 216

,当 CPU 频率为 20MHz时 ,最小

波特率为 343 波特。如果这样 ,最低的标准波特率为 600 波特。波特率低于最小波特率

将会导致 T3 的溢出 ,这样 ASC0 就不能进行合适的初始化。

(2 ) 最大波特率 (图中 Bhig h )是没有超出误差的最大波特率 ,即所有处于最高和最低

波特率之间的波特率都低于偏离的限制。满足这个要求的最大波特率为 19200 波特。

(3 ) 更高的波特率 ,只要实际的偏离没有超出限制 ,应该都可以使用。一种波特率

(图 4-25 中标为Ⅰ处 )可能超出了偏离的限制 ,而另一种更高的波特率 (图 4-25 中标为Ⅱ

处 )却很好的低于这一限制 ,这取决于主机的接口。任何可供自举装载使用的波特率必须

满足下面的 3 个必备条件 :

� 波特率是在 ASC0 指定的工作范围内。

� 外部宿主机能够使用此波特率。

� 计算得到的偏离误差小于规定值。

表 4-20 自举装载的波特率范围

fCPU/ M Hz 10 12 16 20 25

Bmax/ 波特 312500 375000 500000 625000 781250

Bhigh/ 波特 9600 19200 19200 19200 38400

BSTDmin/ 波特 600 600 600 600 600

Blow/ 波特 172 206 275 343 429

亿恒 C164CI 16 位单片机

Page 228: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

定时器及捕获/比较器

5 .1 通用定时器单元

通用定时器单元 GPT1 是一个灵活的多功能定时器 ,它可以用于定时、计数、脉冲宽

度测量、脉冲产生、倍频等等。

GPT1 的方框图如图 5-1 所示 ,它包含 3 个定时器/ 计数器 ( T2 , T3 , T4 ) ,最大分辨

率为 16 T CL。每一个定时器可以在不同方式下独立地运行 ,例如门控定时器方式、计

数方式 ,或与同一单元中的其他定时器级联工作。GPT1 的辅助定时器对核心定时器

来说 ,可以任意地配置为重装载或捕获寄存器。GPT1 使用替换的输入/ 输出功能和专

门的中断。

图 5-1 GPT1 的方框图

Page 229: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

218

5 .1 .1 定时器模块 GPT1

从程序员的角度来看 , G PT1 模块由如图 5-2 所示的一组 SFRs 组成。图中用阴影表

示的那部分端口和方向寄存器可用于 GPT1 模块功能。

图 5-2 GP T1 定时器模块相关的 SFRs 和引脚

GPT1 模块的 3 个定时器都具有 4 种基本工作模式 ,即定时方式、门控定时器方式、

计数方式和增量接口方式 ,并且全部定时器均可以进行加计数或减计数。每个定时器有

一个替换输入功能引脚 ( T xIN) ,其工作方式与定时器的工作模式有关 ,如门控定时器方

式的门控端或计数方式的计数输入引脚。计数方向 (加/ 减 )可以通过软件编程控制 ,或者

按照外部控制输入脚的信号动态改变。核心定时器 T3 的每一次溢出都被锁存到触发器

T3OTL中。辅助定时器 T2 和 T4 可以连接到核心定时器 ,或者作为核心定时器的捕获

或重装载寄存器来使用。

每一个定时器的内容都可以通过访问相应的定时器寄存器 T2 , T3 或 T4 ,由 CP U 读

出或修改。它们位于不能进行位地址访问的 SFR 区域。当在定时器加 1、减 1、重装载或

捕获前的瞬间 ,若有 CP U 对定时器的任何寄存器的写操作 ,则 CPU 的写操作具有更高

的优先权 ,以保证得到正确的结果。

5 .1 .2 GPT1的核心定时器 T3

核心定时器 T3的配置和控制是通过可位寻址控制寄存器 T3CON进行的 (见表 5-1)。

亿恒 C164CI 16 位单片机

Page 230: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

219

表 5-1 核心定时器 T3的配置

位 功 能

T3I 定时器 T3 输入选择。取决于其工作方式 ,参见相关章节

定时器 T3 的模式控制 (基本工作模式 )

000: 定时方式

001: 计数方式

010: 门控定时器方式 ,低电平有效

T3M 011: 门控定时器方式 ,高电平有效

100: 保留 ,没有使用

101: 保留 ,没有使用

110: 增量接口方式

111: 保留

定时器 T3 运行控制位

T3R T3R =“0”: 定时器/ 计数器 T3 停止

T3R =“1”: 定时器/ 计数器 T3 启动

T3UD 定时器 T3 加计数/ 减计数控制①

T3UDE 定时器 T3 外部加/ 减计数使能①

T3OT L定时器 T3 输出触发锁存器

在 T3 每次上溢/ 下溢时翻转。可以由软件来进行置位和复位

① 对于位 T 3 UD 和 T3 U DE 的作用 ,请参考表 5-2 中的说明。

1 .定时器 T3的运行控制位

软件通过位 T3R 来控制定时器的启动或者停止。如果 T3R 为“0”,则定时器停止 ;

若将 T3R 设为“1”,则定时器启动。

在门控定时器方式下 ,如果 T3R 为“1”,并且门是打开的 (是高电平还是低电平激活 ,

由程序设定 ) ,定时器处于运行状态。

2 .计数方向控制

核心定时器的计数方向可以由程序或由外部输入引脚 T3EUD (定时器 T3 的外部

加/ 减计数控制输入 )来控制 ,引脚 T3EUD就是具有替换输入功能的端口引脚 P3 .4。这

个选择由控制寄存器 T3CON 中的位 T3UD 和位 T3UDE 决定。当加/ 减控制使用软件

设置时 ( T3UDE =“ 0”) , 计数方向可以通过对位 T3UD 置位或清零进行改变。当

T3UDE =“1”时 ,引脚 T3EUD被选为计数方向的控制源 ,而位 T3UD仍旧用来改变实际

的计数方向 ,如表 5-2 所示。如果 T3UD =“0”,且引脚 T3EUD处于低电平 ,则定时器进

行加计数 ; 若 T3EUD 为高电平 , 则定时器将进行减计数。如果 T3UD =“1”, 引脚

T3EUD为高电平 ,则定时器作加计数 ,否则为减计数。不管计数器是否正在运行 ,其计

数方向都可以改变。

当使用引脚 T3EUD/ P3 .4 作为外部计数方向控制输入时 ,必须将它设置为输入 ,其

相应的方向控制位 DP3 .4 必须被设为“0”。

第 5 章 定时器及捕获/ 比较器

Page 231: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

220

表 5-2 GPT1核心定时器 T3的计数方向控制

引脚 TxE UD TxUDE位 TxUD位 计数方向

× 0 0 加计数

× 0 1 减计数

0 1 0 加计数

1 1 0 减计数

0 1 1 减计数

1 1 1 加计数

注意 : 核心定时器 T 3 和辅助定时器 T2 和 T4 的方向控制是完全一样的 ,所以引脚和位都以 T x⋯命名。

3 .定时器 T3输出触发锁存器

定时器 T3 上溢或下溢时 , 将使控制寄存器 T3CON 中的触发器位 T3OTL 翻转。

T3OTL可以由软件来置位和清零。此外 , T3OTL 也能够在定时器上溢/ 下溢时用作计

数功能的一个输入 ,或者是用作辅助定时器 T2 和 T4 重装载功能的触发源。

4 .定时器 T3的定时方式

当寄存器 T3CON 的位域 T3M 设置为“000B”时 ,核心定时器 T3 选择定时方式 ,其

方框图如图 5-3 所示。在这种工作方式下 , T3 的时钟是由内部系统时钟 ( CP U 时钟 )通

过可编程分频器得到的 ,预分频系数 X 由 T3I 决定。定时器 T3 的输入频率 fT 3 及其分

辨率 rT 3是由时钟频率 fCP U标定的 ,如下面的公式所示 :

f T3 =fCP U

8 * 2< T 3 I > rT 3 = 8 * 2

< T 3 I >

fCP U

图 5-3 核心定时器 T3在定时方式下的方框图

定时器的输入频率、分辨率和周期 ,与选定的分频比之间的关系如表 5-3 所示。这个

表同样也适用于 T3 的门控定时器方式和辅助定时器 T2 和 T4 的定时方式与门控定时器

方式。注意 ,其中有一些数据可达到 3 位有效数字。

亿恒 C164CI 16 位单片机

Page 232: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

221

表 5-3 GPT1定时器的输入频率、分辨率和周期

fCPU = 20MH z定时器的输入选择

000B 001B 010B 011B 100B 101B 110B 111B

预分频系数 8 16 32 64 128 256 512 1024

输入频率 2 .5MHz 1 .25MHz 625k Hz 312 .5k Hz 156 .25k Hz 78 .125kHz 39 .06k Hz 19 .53k Hz

分辨率 400ns 800ns 1 .6μs 3 .2μs 6 .4μs 12 .8μs 25 .6μs 51 .2μs

周期 26ms 52 .5ms 105ms 210ms 420ms 840ms 1 .68s 3 .36s

5 .定时器 T3的门控定时器方式

将寄存器 T3CON 的位域 T3M 设置为“010B”或者是“011B”,则核心定时器 T3 选

为门控定时器方式 ,位 T3M .0( T3CON .3 ) 选择门控输入的激活电平。在门控定时器方

式下 ,输入频率的选择与定时方式的选择相同。但是这时定时器的输入时钟是用外部输

入引脚 T3IN(定时器 T3 外部输入 )选通的。为了使这种操作使能 ,引脚 T3IN必须设置

为输入 ,即相应的方向控制位 DPx .y 必须设置为“0”。

核心定时器 T3 在门控定时器方式下的方框图如图 5-4 所示。

图 5-4 核心定时器 T3 在门控定时器方式下的方框图

如果 T3M .0 =“0”,则 T3IN为低电平时 ,定时器才能定时 ;若引脚 T3IN 为高电平 ,

则定时器将停止工作。如果 T3M .0 =“1”,为了使定时器工作 ,引脚 T3IN 必须设置为高

电平。另外 ,定时器可以通过运行控制位 T3R 来打开和关闭。只有在 T3R =“1”,且门打

开状态下 ,定时器才工作。如果 T3R =“0”,或者门未打开 ,定时器将停止工作。

注意 : 引脚 T3IN 门控信号的变化不产生中断请求。

6 .定时器 T3的计数方式

核心定时器 T3 的计数方式的选择是通过将寄存器 T3CON 的位域 T3M 设置为

“001B”实现的 , 其方框图如图 5-5 所示。在计数方式下 ,定时器 T3 的时钟是由外部输入

引脚 T3IN 上的电平变化来决定的。定时器加 1、减 1 可以是由这个引脚的上升沿或下降

沿引起 ,或是不论上升沿和下降沿都可以引起。控制寄存器 T3CON 中的位域 T3I 用来

第 5 章 定时器及捕获/ 比较器

Page 233: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

222

选择触发沿 (见表 5-4)。

图 5-5 核心定时器 T3 的计数方式的方框图

表 5-4 GPT1核心定时器 T3(计数方式 )输入沿选择

T3I 计数器加/ 减计数的触发沿选择

000 计数器 T3 被禁止

001 T3IN 上的正跳变(上升沿)

010 T3IN 上的负跳变(下降沿)

011 T3IN 上的任何跳变 (上升沿或下降沿 )

1XX 保留。没有定义

引脚 T3IN 用于计数操作时 ,必须设置为输入 ,即对应的方向控制位 DPx .y 必须设

为“0”。计数方式下允许的最高输入频率是 fCPU / 16。为了确保 T3IN 引脚上的计数信号

能得到正确的识别 ,它的电平在变化前 ,必须保持“高”或“低”至少 8 个 fCP U周期。

7 .定时器 T3的增量接口方式

核心定时器 T3 的增量接口方式是通过将寄存器 T3CON 的位域 T3M 设置为

“110B”来选择的 ,其方框图如图 5-6 所示。在增量接口方式下 , 定时器 T3 的两个输入

( T3IN和 T3EUD)用作增量编码器的接口。T3 由一个或两个外部输入引脚上的跳变沿

驱动 ,给出的分辨率为编码器输入的 1/ 2 或者 1/ 4。

图 5-6 核心定时器 T3 增量接口方式的方框图

亿恒 C164CI 16 位单片机

Page 234: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

223

控制寄存器 T3CON 中的 T3I 用来选择触发跳变沿 (见表 5-5 )。在这种工作方式下 ,

根据两个输入信号的跳变沿的顺序 ,产生计数脉冲和计数方向信号。因此 , T3 将按照增

量编码器的速度和方向自动改变 ,它的内容总是代表编码器的当前位置。

表 5-5 GPT1核心定时器 T3(增量接口方式)的输入沿选择

T3I 计数器加/ 减计数的触发沿选择

000 计数器 T3 被禁止

001 T3IN 上的任何跳变 (上升沿或下降沿 )

010 T3EUD 上的任何跳变 (上升沿或下降沿 )

011 T3 任一输入端 ( T3IN 或 T3EUD)上的任何跳变 (上升沿或下降沿 )

1×× 保留。没有定义

增量编码器可以直接连接到 C164CI,不需要外部接口逻辑电路。然而 ,在一个标准

系统中 ,将用比较器把编码器的差分输出 (例如 A 或珡A )转换为数字信号 ,这将大大提高

它的抗噪声能力。图 5-7 给出了编码器与 C164CI 的连接。

图 5-7 编码器与 C164CI的连接

注意 : 编码器的第 3 个输出 TOP0 用来指示机械零位置 ,它可以连接到一个外部的

中断输入和使定时器 T3 复位 (例如 ,通过 PEC 使其变为零 )。

为使增量接口工作 ,必须满足下列条件 :

� T3M 位必须设置为“110B”。

� T3IN 和 T3EUD引脚必须设置为输入 ,即各自的方向控制位必须设为“0”。

� T3EUD位必须为“1”,对计数方向自动控制使能。

在增量接口方式下 ,允许的最高输入频率为 fCP U/ 16。为了确保引脚上的计数信号

能正确的识别 ,它的电平在变化以前必须保持“高”或“低”至少 8 个 fCPU周期。

增量接口方式中 ,计数方向是自动从输入信号变化的顺序中得到的 ,它与所接的传感

器的旋转方向相对应。表 5-6 中总结了可能有的组合。

表5-6 GPT1核心定时器 T3(增量接口方式 )的计数方向

其他输入对应的电平T3I N 输入 T3EUD 输入

上升沿 下降沿 上升沿 下降沿

高电平 减计数 加计数 加计数 减计数

低电平 加计数 减计数 减计数 加计数

第 5 章 定时器及捕获/ 比较器

Page 235: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

224

图 5-8 和图 5-9 给出了在假定的计数信号和方向控制情况下 T3 的工作实例。它还

示出了传感器计数由增加到减少的转换过程中 ,对可能发生的输入抖动是如何补偿的。

图 5-8 增量编码器信号的计算

图 5-9 增量编码器信号的计算

图 5-8 给出了假定 T3 定时器对任何输入的跳变做加计数时的变化过程 , 即 T3I =

“011B”。

图 5-9 给出了假定 T3 定时器对输入 T3IN 的跳变做加计数时的变化过程 ,即 T3I =

“001B”。

注意 : 工作在增量接口方式下的定时器 T3 ,自动地提供传感器当前位置的信息。动

态的信息 (速度、加速度、减速度 )也可以通过测量输入信号的周期得到。

5 .1 .3 GPT1的辅助定时器 T2和 T4

两个辅助定时器 T2 和 T4 具有完全一样的功能。它们可以设置为定时、门控定时

器、计数或增量接口方式 ,定时器频率和计数信号的选择项与核心定时器 T3 一样。除了

这 4 种计数方式外 ,辅助定时器还可以与核心定时器级联起来使用 ,在级联方式中 ,它们

可用作重装载或捕获寄存器。

亿恒 C164CI 16 位单片机

Page 236: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

225

定时器 T2 和 T4 的设置由可位寻址控制寄存器 T2CON 和 T4CON 确定 ,它们的结

构是相同的 (见表 5-7)。

表 5-7 辅助定时器 T2,T4设置

位 功 能

TxI定时器 x 输入选择

取决于工作模式 ,参见相关的章节

定时器 x 方式控制(基本工作模式)

000: 定时方式

001: 计数方式

010: 门控定时器方式 ,低电平有效

TxM 011: 门控定时器方式 ,高电平有效

100: 重装载方式

101: 捕获方式

110: 增量接口方式

111: 保留 ,没有使用

定时器 x 运行控制位

TxR TxR =“0”: 定时器/ 计数器 x停止

TxR =“1”: 定时器/ 计数器 x启动

TxUD 定时器 x 加/ 减计数控制①

TxUDE 定时器 x 外部加/ 减计数使能①

① 位 T xU D 和 T x UDE 的作用 ,请参考计数方向表 (见定时器 T 3 一节 )。

注意 : 模块 GPT1 的 3 个定时器所提供的功能是由各自专用的控制寄存器中同样的

位和以同样的方式控制的。

注意 : 辅助定时器没有输出触发锁存器和替换输出功能。

1 .辅助定时器的计数方向控制

辅助定时器的计数方向控制和核心定时器 T3 一样。关于 T3 的描述和表格同样适

用于辅助定时器。

第 5 章 定时器及捕获/ 比较器

Page 237: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

226

2 .定时器 T2和 T4的定时方式或门控定时器方式

当辅助定时器 T2 和 T4 由程序设定为定时方式或门控定时器方式时 ,它们的操作与

前面所述的核心定时器 T3 是一样的。除了 T2 和 T4 没有输出触发器锁存以外 , T3 的描

述、图和表格同样适用于 T2 和 T4。

3 .定时器 T2和 T4的增量接口方式

当辅助定时器 T2 和 T4 由程序设定为增量接口方式时 ,它们的操作与前面所述的核

心定时器 T3 一样。因此 , T3 的描述、图和表格同样也适用于 T2 和 T4。

4 .定时器 T2和 T4的计数方式

辅助定时器 T2 和 T4 的计数方式的选择是通过将各自的寄存器 TxCON 的位域

T xM 设置为“001B”而实现的。在计数方式下 , T2 和 T4 的时钟都可以由各自的外部输

入引脚 TxIN 上的跳变来提供 ,或者由定时器 T3 输出触发锁存器 T3OTL 的跳变提供。

图 5-10 辅助定时器计数方式的方框图

定时器加 1、减 1 是由各自对应的输入引脚或触发锁存器 T3OT L 上的正跳变、负跳

变或者任何跳变 (上升沿或下降沿 )引起。控制寄存器 TxCON的 TxI 选择触发的跳变沿

(见表 5-8)。

表 5-8 GPT1辅助定时器 (计数方式 )输入跳变沿的选择

T2I/ T4I 计数器加/ 减计数的触发沿

×00 计数器 Tx 被禁止

001 TxIN 的正跳变 (上升沿 )

010 TxIN 的负跳变 (下降沿 )

011 TxIN 的任何跳变 (上升沿或下降沿)

101 输出触发锁存器 T3OTL 的正跳变(上升沿)

110 输出触发锁存器 T3OTL 的负跳变(下降沿)

111 输出触发锁存器 T3OTL 的任何跳变 (上升沿或下降沿 )

亿恒 C164CI 16 位单片机

Page 238: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

227

注意 : 只有 T3 的上溢或者下溢导致的 T3OTL 的状态转变才会触发 T2 或 T4 的计

数功能。通过软件修改 T3OT L将不会触发 T2 或 T4 的计数功能。

对于计数操作 ,引脚 TxIN 必须设置为输入 ,即各自对应的方向控制位必须设置为

“0”。计数方式所允许的最高输入频率为 fCPU / 16。为了确保 TxIN上任何输入信号的跳

变沿能正确识别 ,跳变前 T xIN 上的电平必须保持为“高”或“低”至少 8 个 fCP U周期。

5 .定时器的级联

把触发位 T3OTL 用作计数方式下辅助定时器的时钟源 ,可以将核心定时器 T3 与对

应的辅助定时器级联起来使用。其方框图如图 5-11 所示。这种级联可以构成一个 32 位

或 33 位的定时器/ 计数器 ,取多少位与选择 T3OTL 的哪种跳变沿作辅助定时器的时钟

有关。

(1 ) 32 位的定时器/ 计数器

如果 T3OTL 的正负跳变都用作辅助定时器的时钟 ,这个定时器将在核心定时器 T3

每次上溢/ 下溢时计数。于是两个定时器构成一个 32 位定时器。

(2 ) 33 位的定时器/ 计数器

如果只选择 T3OT L的正跳变或负跳变作为辅助定时器的时钟源。这个定时器将在

核心定时器每两次溢出时计数一次。这种配置将构成一个 33 位的定时器 ( 16 位的核心

定时器 + T3OTL + 16 位的辅助定时器 )。

这两个级联定时器的计数方向并不需要一致 ,这就提供了多种不同的配置方式。在

这种情况下 , T3 可以工作在定时、门控定时器或是计数方式。

图 5-11 核心定时器 T3 和辅助定时器的级联

6 .辅助定时器的重装载方式

辅助定时器 T2 和 T4 的重装载方式的选择是通过将对应的寄存器 T xCON 中位域

T xM 设置为“100B”实现的。其方框图如图 5-12 所示。在重装载工作方式下 ,核心定时

器 T3 将重装载一个辅助定时器寄存器的内容 , 并由两个不同信号中的一个来触发。触

发信号的选择与计数方式中的时钟源选择相同 (见表 5-8 ) , 即辅助定时器输入的一个跳

第 5 章 定时器及捕获/ 比较器

Page 239: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

228

变沿或输出触发锁存器 T3OT L的跳变沿均可以触发重装载。

图 5-12 GPT1 的辅助定时器的重装载方式

注意 : 当程序设定为重装载方式时 ,相应的辅助定时器 ( T2 或 T4 )将停止运行 ,与它

们的运行标志位 T2R 或 T4R 无关。

当触发信号来到时 , T3 用对应的定时器寄存器 ( T2 或 T4 )的内容重新装载 ,同时对

中断请求标志位 ( T2IR 或者是 T4IR )置位。

注意 : 当选用 T3OTL 的跳变沿作触发信号时 ,中断请求标志位 T3IR 在触发时也会

因触发置位 ,以表示 T3 的上溢或下溢。而通过软件修改 T3OTL 将不会触发 T2 或 T4

的计数功能。

由 T3OT L触发的重装载工作方式可以有几种不同的结构。按选择的跳变沿的不

同 ,将会有下列的功能 :

(1 ) 如果 T3OTL 的正、负跳变沿都选用来触发重装载 ,核心定时器将在它每次上溢

或下溢时 ,重新装载辅助定时器的内容。这是标准的重装载工作方式 (在上溢/ 下溢时重

装载 )。

(2 ) 如果 T3OTL 的正跳变沿或负跳变沿选用来触发重装载 ,核心定时器将在每两

次上溢或下溢时 , 重新装载辅助定时器的内容。

(3 ) 对两个辅助定时器使用这种“单跳变”工作方式 ,将可以得到一种非常灵活的脉

冲宽度调制 ( PWM)。辅助定时器中的一个由程序设定为在 T3OT L 的正跳变沿时对核

心定时器重装载 ,另外一个辅助定时器在 T3OTL 的负跳变沿时对核心定时器重装载。

使用这种组合方式 ,核心定时器将交替的从两个辅助定时器重装载。

注意 : 应尽可能避免对两个辅助定时器选择同样的重装载触发事件。在这种情况

下 ,两个重装载寄存器将试图同时装载到核心定时器。如果选择了这种组合 , T2 将被放

弃 , T4 的内容将用来重装载。

7 .辅助定时器的捕获方式

辅助定时器 T2 和 T4 的捕获工作方式的选择是通过将对应的寄存器 TxCON 的位

域 TxM 设置为“101B”而实现的。其方框图如图 5-13 所示。在捕获方式下 ,对应的辅助

定时器将对外部输入引脚 TxIN 的信号跳变作出响应 ,把核心定时器的内容锁存到辅助

亿恒 C164CI 16 位单片机

Page 240: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

229

定时器寄存器中。捕获触发信号可以是正跳变、负跳变或任何跳变沿。

图 5-13 GP T1 的辅助定时器的捕获工作方式

T xI 中最低两位用来选择有效的跳变沿 (参见表 5-4 ) ,而高位 TxI .2 与捕获工作方式

无关。建议使这一位保持为“零”( TxI .2 =“0”)。

注意 : 当程序设定为捕获工作方式时 ,对应的辅助定时器 ( T2 或 T4)将停止运行 ,与

它们的运行标志位 T2R 或 T4R 无关。

当相应的输入引脚 T xIN 上有触发 (选择的跳变沿 )时 ,核心定时器的内容将被装载

到辅助定时器寄存器中 ,且相应的中断请求标志 T xIR 置位。

注意 : T2IN 和 T4IN 的方向控制位必须设置为“0”,并且为了保证边沿检测正确 ,捕

获触发信号的电平变化前 ,其“高”电平或“低”电平至少要保持 8 个 fCPU周期。

8 . GPT1定时器的中断控制

当定时器发生从 FF FF H 到 0000H 的上溢时 (加计数 ) ,或者是从 0000 H 到 FF FF H

下溢时 (减计数 ) ,寄存器 T xIC 中的中断请求标志 ( T2IR , T3IR 或 T4I R)将置位。如果

第 5 章 定时器及捕获/ 比较器

Page 241: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

230

对应的中断允许标志位 (寄存器 T xIC 中的 T2IE , T3IE , T4IE)置位 ,将引起一个中断 ,转

到各个定时器的中断向量 ( T2INT , T3INT 或 T4INT ) ,或是去触发一个 PEC 服务。3 个

定时器都有自己的中断控制寄存器。

注意 : 有关控制位的说明 ,请参考一般中断控制寄存器的描述。

5 .1 .4 程序举例

本节给出一个实例 ,是用 C164CI 的通用定时器 GPT1 产生一个 PWM 信号的子

程序。

[例 5 .1] 信号的频率为 50 Hz,周期为 20 ms;占空比为脉冲 5ms,间歇 15 ms。使用

核心定时器 T3 做减计数 ,在 T3 输出双稳态触发器的正跳变处 ,用定时器 T2 重装载定时

器 T3;在 T3 输出双稳态触发器的负跳变处 ,用定时器 T4 重装载定时器 T3。使用定时

器 T3 中断 , 并在中断服务程序里用端口 P8 .0 输出这个信号。CP U 的时钟频率

是 20M Hz。

系统初始化设置 (略 )。

定时器 T3 的初始化 :

定时方式 ,预分频比为 8 ,减计数 ,外部加减控制禁止。

定时器 T3 中断使能 ,中断优先级 ILVL = 6 ,组优先级 GLVL = 3。

定时器 T2 的初始化 :

重装载方式 ,由输出双稳态触发器 T3OTL 的上升沿触发 ,重装载计数。

定时器 T4 的初始化 :

重装载方式 ,由输出双稳态触发器 T3OTL 的下降沿触发 ,重装载计数。

端口初始化 :

P8 口用作一般的输出口 ,推挽输出 ,初始电平为“0”。

汇编程序清单如下。

main:

CALLA c_ UC, IO_vInit

CALLA cc_ UC, GT1_vInit

BSE T IEN

RET

GT1_vInit : ; GPT1 初始化子程序

MOV T3CON, # 080 H ;定时器 T3 取为减计数 ,预分频比为 8

MOV T3 , # 00 H

MOV T3IC , # 05BH ;设置定时器 T3 的中断

MOV T2CON, # 025 H ;定时器 T2 用于重装载 ,上升沿触发

MOV T2, # 030D4 H ;设置 5ms 计数溢出

MOV T4CON, # 026 H ;定时器 T4 用于重装载 ,下降沿触发

MOV T4, # 0927CH ;设置 15ms 计数溢出

BSE T T3R ;定时器 T3 开始计数

亿恒 C164CI 16 位单片机

Page 242: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

231

RET

GT1_vInit : ;定时器 T3 中断服务子程序

XORB P8 , # 00FFH ;对 P8 .0 口输出求反

RETI

IO_vIni : ; P8 口初始化子程序

EXTR # 01 H

MOV PICON , # 00 H

MOV P8 , # 00 H ; P8 口锁存器置“0”

EXTR # 01 H

MOV ODP8 , # 00 H ;推挽输出

MOV DP8 , # 01 H ; P8 .0 口输出使能

RET

图 5-14 是由 GPT1 单元产生的 PWM 信号波形。图中 10. 0kS/ s 表示每秒采集

10000 个样本。

图 5-14 GP T1 单元产生的 PWM 信号波形

5 .2 监视定时器

为了能从软件或硬件出错所进入的死循环中恢复出来 , C164CI提供了一个监视定时

器。如果在这个定时器溢出发生之前软件服务失败 ,则会产生一个内部的复位序列。这

个内部复位将会把引脚RSTOU T拉低 ,同时将那些可能造成故障的外围硬件复位。当监

第 5 章 定时器及捕获/ 比较器

Page 243: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

232

视定时器使能 ,并且软件已设计为在它溢出之前就对它进行一次服务时 ,监视定时器将监

视程序的执行。只有在程序没有正常执行 ,或者因有关硬件失效发生软件错误时 ,监视定

时器才会溢出。这可以防止控制器运行超出用户规定的时间范围。

注意 : 当双向复位使能后 ,在监视定时器复位产生的内部复位序列期间 ,引脚RSTIN

也会被拉到低。

监视定时器提供了两个寄存器 : 一个只读定时器寄存器包含当前的计数值 ,另一个

控制寄存器用于初始化和复位源的检测。图 5-15 给出了与监视定时器有关的 SFR 和端

口引脚。

图 5-15 与监视定时器有关的 SFR 和引脚

监视定时器是一个 16 位加计数的计数器 ,由 CPU 时钟 ( fCP U )的 2~256 分频来提供

时钟 , CP U 时钟的分频比如下 :

2 分频 ( WDTIN =“0”, WDTPRE =“0”) ;

4 分频 ( WDTIN =“0”, WDTPRE =“1”) ;

128 分频 ( WDTIN =“1”, WDTPRE =“0”) ;

256 分频 ( WDTIN =“1”, WDTPRE =“1”)。

这个 16 位定时器是通过两个 8 位定时器串接起来实现的 (见图 5-16 )。通过对监视

定时器服务 ,可以对监视定时器的高 8 位预设一个由用户程序规定的值 ,这样就可以改变

监视定时器计满的时间。低 8 位的计数器在每次服务访问时复位。

图 5-16 监视定时器的方框图

1 .监视定时器的工作

监视定时器的当前计数值包含在监视定时器寄存器 WDT 中 ,它是一个不能位寻址

的只读寄存器。监视定时器的工作由其可位寻址的控制寄存器 WDTCON 控制。这个寄

存器指定了定时器高字节的重装载值 ,选择输入时钟的预分频比 ,提供表示复位源的标

志位。

亿恒 C164CI 16 位单片机

Page 244: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

233

位 功 能

监视定时器的输入频率选择

WDTIN “0”: 输入频率为 fCPU/ 2

“1”: 输入频率为 fCPU/ 128

WDTR监视定时器复位标志位

由硬件复位清除或是由 SRVWDT 指令清除

SWR 软件复位的标志位

SHWR 短硬件复位的标志位

L H WR 长硬件复位的标志位

WDTPRE 监视定时器输入预分频控制 ,控制输入时钟预分频器(见表 5-9)

WDTRE L 监视定时器的重装载值 (用于 WDT 的高字节 )

注意 : 复位值取决于复位源 (见下面的描述 )。执行 EIN IT 时将清除复位标志位。

在软件复位、外部的硬件复位或监视定时器复位之后 , 监视定时器都将被使能 ,并且

以频率为 fCP U/ 2 从 0000 H 开始进行加计数。输入频率可以通过对位 WDTIN 的设置切

换到 fCP U/ 128。监视定时器可以通过禁止监视定时器指令 DISWDT 来禁止。指令

DISWDT 是一个 32 位保护指令 ,它只有在复位和 EINI T(初始化结束 )指令之间 ,或者在

复位和 SRVWDT (监视定时器服务 )指令之间才能执行。这两个指令中的任何一个都可

禁止 DISWDT 的执行。

注意 : 在激活自举装载电路的硬件复位之后 ,监视定时器将被禁止。

即使是在空闲方式 ( Idle)期间 ,若监视定时器未通过指令 DISWDT 禁止 , 它将继续

进行加计数。如果计数器的计数值到达 FF FF H 时 ,还没有通过指令 SRVWDT 进行服

务 ,监视定时器将溢出 ,并产生一个内部复位。这个复位将会把外部的复位指示引脚

RSTOU T (以及双向复位方式下的RSTIN)拉低。这时寄存器 WDTCON 中的监视定时

器复位标志位 WDTR 将被置位。

在开始内部的复位序列之前 ,如果这个总线周期在设定的等待状态之后没有使用

READY,或者是采样到READY的有效的低电平信号 ,监视定时器将完成正在运行的外

部总线周期 ,否则外部总线周期将被终止。

为了避免监视定时器溢出 ,必须由软件进行周期性的服务。监视定时器是通过指令

SRVWDT 来服务的 ,这是一个 32 位的保护指令。监视定时器的服务将清除监视定时器

寄存器的低字节 ,并且给高字节重新装载 WDT CON 寄存器的高字节 WDTR EL 中的预

置值。对监视定时器的服务还将使位 WDTR 复位。监视定时器得到服务后 , 将从

< WDT REL > * 28开始继续进行加计数。指令 SRVWDT 以这种方式编码 ,使得对监视

第 5 章 定时器及捕获/ 比较器

Page 245: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

234

定时器不可靠的服务机会 (例如 ,从一个错误的地方取指并执行一个指令 )最小化。当指

令 SRVWDT 的格式与保护指令的格式不相匹配时 ,将进入保护错误陷阱 ,而不是执行这

个指令。

监视定时器的溢出周期可以用两种方式编程。

(1 ) 输入频率 : 监视定时器可以通过寄存器 WDTCON中的位 WDTIN ,在两个频率

fC PU/ 2 或 fCP U/ 128 中选择。

(2 ) 重装载值 : 寄存器 WDTCON中的高字节 WDT REL 是可编程的。 PW D T周期为

监视定时器的服务与下一次溢出之间的时间 ,这可以由下列公式得到

PW D T =2( 1 + < W D TI N > * 6 ) * (216 - < WDT REL > * 28 )

fCP U

表 5-9 列出了在一些 CP U 时钟下监视定时器的可用的时间范围。一些数值的有效

数字为 3 位。

表 5-9 监视定时器的时间范围

CPU 时钟 fCPU

预分频器 WDTREL 的重装载值

WDT IN WDT PRE fWDT FFH 7F H 00 H

12MHz

0 0 fCPU/ 2 42 .67μs 5 .50ms 10 .92ms

0 1 fCPU/ 4 85 .33μs 11 .01ms 21 .85ms

1 0 fCPU/ 128 2 .73ms 352 .3ms 699 .1ms

1 1 fCPU/ 256 5 .46ms 704 .5ms 1398ms

16MHz

0 0 fCPU/ 2 32 .00μs 4 .13ms 8 .19ms

0 1 fCPU/ 4 64 .00μs 8 .26ms 16 .38ms

1 0 fCPU/ 128 2 .05ms 264 .2ms 524 .3ms

1 1 fCPU/ 256 4 .10ms 528 .4ms 1049ms

20MHz

0 0 fCPU/ 2 25 .6μs 3 .30ms 6 .55ms

0 1 fCPU/ 4 51 .20μs 6 .61ms 13 .11ms

1 0 fCPU/ 128 1 .64ms 211 .4ms 419 .4ms

1 1 fCPU/ 256 3 .28ms 422 .7ms 838 .9ms

25MHz

0 0 fCPU/ 2 20 .48μs 2 .64ms 5 .24ms

0 1 fCPU/ 4 40 .96μs 5 .28ms 10 .49ms

1 0 fCPU/ 128 1 .31ms 169 .1ms 335 .5ms

1 1 fCPU/ 256 2 .62ms 338 .2ms 671 .1ms

注意 : 为了安全 ,建议用户在每次监视定时器服务之前重写 WDTCON。

2 .复位源的指示

寄存器 WDTCON 中的复位指示标志位提供了有关最近一次复位源的信息。

C164CI 在任何一种复位之后都从地址 000000 H 开始执行。为了判定最近的复位是由外

部的硬件信号 (通过RST IN)、软件本身还是由监视定时器的溢出触发的 ,可以由初始化

软件对这些标志位进行检测。于是单片机系统的初始化 (也包括以后的操作 )可以适应各

自的环境。例如 ,在监视定时器复位之后 ,可以用一段特殊的程序来校验软件程序的完

亿恒 C164CI 16 位单片机

Page 246: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

235

整性。

复位指示标志位并不互相排斥 ,即可以有超过一个以上的标志位在复位后被置位 ,这

取决于它的源。表 5-10 总结了可能有的组合。

表 5-10 复位指示标志的组合

复位指示标志*

事件 L HWR SHWR SWR WDTR

长硬件复位 1 1 1 0

短硬件复位 * 1 1 0

软件复位 * * 1 —

监视定时器复位 * * 1 1

EINIT 指令 0 0 0 —

SRVWDT 指令 — — — 0

* 双向复位模式使能时 ,这些标志位在发生相应的复位时也会置位。此时 W DT CON 的复位值将与表中的值

不同。

注意 : 所列出的 WDTCON 复位值 ,假定保留位为“0”。

长硬件复位是指在由硬件触发的内部复位序列的最后 ,仍采到RSTIN输入端为有效

的低电平。

短硬件复位是指在由硬件触发的内部复位序列的最后 ,采到RSTIN输入端为无效的

高电平。

软件复位是指执行指令 SRST 后触发的复位。

监视定时器复位是由于监视定时器的溢出所触发的复位。

注意 : 双向复位模式使能时 ,对任何一种复位 ,引脚RSTIN在内部复位期间将被拉

低。因此 ,对任何复位情况都会识别出长硬件复位 ( LH WR )。

5 .3 实 时 时 钟

C164CI 的实时时钟 ( RT C)模块基本上是一个独立的时钟链 ,它直接由振荡器时钟驱

动。该模块有下列几种用途 :

(1 ) 系统时钟 ,用来决定当前的时间和日期。

(2 ) 基于中断的循环时间。

(3 ) 长时间测量的 48 位定时器。

与 RT C模块有关的 SFR 如图 5-17 所示。

R TC模块是一个由 3 个除法器组成的模块链 ,一个固定的 8∶1 分频器 ,一个可以重

装载的 16 位定时器 T14 和一个 32 位的 R TC 定时器 (通过寄存器 R TCH 和 RT CL 来访

问 )。R TC 模块的方框图如图 5-18 所示。两个定时器都进行加计数。

R TC 模块的时钟信号是直接从片上的振荡器得到的 (不是来自 CPU 时钟 ) ,由一个

第 5 章 定时器及捕获/ 比较器

Page 247: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

236

图 5-17 与实时时钟有关的 SFR

图 5-18 RTC 模块的方框图

独立的时钟驱动器供给。因此 ,它与 C164CI 所选的时钟生成方式无关 ,并且由时钟产生

电路控制。R TC 寄存器在 ESFR 地址空间中的位置见表 5-11。

表 5-11 RTC寄存器在 ESFR中的位置

寄存器名 长/ 短地址 复 位 值 注 意

T14 F0D2 H/ 69 H UU UUH预分频定时器 , 产生 RTC 寄存器和周期性中断用

的输入时钟

T14RE L F0D0 H/ 68 H UU UUH 定时器重装载寄存器

RTCH F0D6 H/ 6BH UU UUH RTC寄存器的高位字

RTCL F0D4 H/ 6 AH UU UUH RTC寄存器的低位字

注意 : R T C 寄存器不受复位的影响。在上电复位后 ,它们未被定义。

1 .系统时钟的工作

实时时钟系统可以在空闲模式或掉电模式 (可选 )下保持运行 ,表示当前的时间和日

期。R TC 不受复位的影响。

这个时钟信息的最大分辨率 (最小步长 )是由定时器 T14 的输入时钟决定的。最大

可用的时间间隔是在 T14REL用 0000H 装载 ,并且 T14 作 21 6分频时得到的。

亿恒 C164CI 16 位单片机

Page 248: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

237

2 .周期性中断的产生

每当定时器 T14 溢出时 , RT C模块就产生一个中断请求 ,并重装载。这个中断请求

常用一个与 CPU 频率无关的系统时间标记 ,不需对通用定时器装载 ,或者有规律地从空

闲模式中唤醒。中断间隔时间可以通过定时器 T14 的重装载寄存器 T14REL 来调整。

参见下面的“R TC 中断产生”一节。

3 . 48位定时器的工作

16 位重装载定时器 T14 和 32 位的 R TC 定时器串接起来 ,可以构成一个 48 位定时

器 ,它由 R TC 输入频率经过固定的预置分频后得到的时钟驱动。若要得到一个 48 位二

进制定时器 ,需将重装载寄存器 T14REL 清零。但是 ,任何其他的重装载值也可以使用。

最大可用的时间间隔是 T14 输入时钟的 248 ( = 1014 )倍 ,当晶振频率为 20M Hz时 ,它

差不多等于 100 年。

4 . RTC中断产生

R TC中断与 PLL/ OWD中断 (如可使用 )共享 XPE R3 中断节点 ,这是由中断子节点

控制寄存器 ISNC来控制的。中断管理器可以通过独立的中断请求和寄存器 ISNC 提供

的使能标志 (见图 5-19 )来确定中断请求源。

图 5-19 RTC的中断逻辑

注意 : 当只有一个中断源使能时 ,不需要额外的软件检查。

如果使用 T14 中断 ,中断节点 (XP3IE =“1”)和 T14 的子节点 ( T14IE =“1”)都必须

使能。请注意 ,当中断管理器响应节点请求位 XP3IR 时 ,会自动对 XP3IR 清零。而子节

点请求位 T14IR 必须由软件来清零。

5 . RTC的时间基准

R TC定时器的输入频率由重装载定时器 T14 决定 , 同时也确定了 R TC 的时间基准

以及 T14 的中断周期。表 5-12 中列出了在几种振荡器频率下的中断周期的范围和时间

基准为 1s 和 1ms 时的 T14 重装载值。

第 5 章 定时器及捕获/ 比较器

Page 249: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

238

表 5-12 RTC的中断周期和重装载值

振荡频率RTC 中断周期 重装载值 A 重装载值 B

最小值 最大值 T14REL 基准时间 T14REI 基准时间

32k Hz 8ms 524 s FF83 H 1 .000s — —

4M Hz 64 .0μs 4 .19s C2F7 H 1 .000s FFF0 H 1 .024ms

5M Hz 51 .2μs 3 .35s B3B5 H 0 .999s FFECH 1 .024ms

8M Hz 32 .0μs 2 .10s 85E EH 1 .000s FFE1 H 0 .992ms

10MHz 25 .6μs 1 .68s 676 AH 0 .999s FFD9 H 0 .998ms

12MHz 21 .3μs 1 .40s 48E5 H 1 .000s FFD2 H 1 .003ms

16MHz 16 .0μs 1 .05s 0BDCH 1 .000s FFC2 H 0 .992ms

6 .通过软件增加 RTC的精度

C164CI 的 RT C的精度是由振荡器的频率及它们各自的预置分频系数决定的 (包括

或不包括 T14)。由于振荡器的理想频率和实际频率有一定的误差 (该误差会随时间而积

累 ) ,还有二进制计数器会产生量化误差 (平均值为 0 ) ,从而使 R TC 的精度受到限制。对

于特殊的需要高时间精度的应用 , R TC 总精度可以通过软件修正来提高。

提高精度的核心是要精确知道振荡器的频率 ,这个频率与所期望的理想频率之间的

差别即是 RT C的偏差 ,它会导致 N 个周期内产生±1 个周期误差。因此 ,只要在每 N 个

周期内把这一个周期误差纠正过来就可以了。

这种修正可以应用于 RT C寄存器 ,也可以应用到 T14。

这种修正可以循环进行。例如 ,在 T14 的中断服务程序中 ,或是在读取 R TC 寄存器

时 ,用公式计算出来。

注意 : 对于大多数应用来说 , R TC 这种结构所提供的额定精度已足够了。

5 .4 捕获/比较单元 CAPCOM2

5 .4 .1 概述

C164CI 提供了一个与两个定时器有关的 8 通道捕获/ 比较单元 ( CA PCOM 单元 )。

此 CAPCOM 单元可以捕获特定的内部或外部事件发生时刻定时器的当前值 ,或可对定

时器的当前值与给定值进行比较 ,并在两个值相同时改变输出信号。它可用来产生和控

制最多 8 个通道的时钟序列 ,并使所用的软件开销最少。

图 5-20 给出了 CAPCOM 单元的方框图。

对程序员来说 , CAPCOM 单元是指一组与此周边电路相关的 SFR,包括用作替换功

亿恒 C164CI 16 位单片机

Page 250: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

239

图 5-20 CAPCOM 单元的方框图

能的输入或输出引脚及它们的方向控制位 (见图 5-21 )。

图 5-21 与 CAPCOM 单元相关的 SFR 和引脚

CAPCOM2 单元通常用于高速 I/ O 任务的控制 ,如脉冲及波形的产生 , 脉冲宽度调

制 ,或记录特定事件发生的时刻。它也可以用作软件定时器 ,定时器数目可多达 8 个。

第 5 章 定时器及捕获/ 比较器

Page 251: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

240

CAPCOM2 单元的最大分辨率为 8 个 CP U时钟周期。

CAPCOM2 单元包括两个 16 位定时器 ( T7/ T8 ) ,每一个定时器有各自的重装载寄存

器 ( TxREL )及一组双用途的 16 位捕获/ 比较寄存器 ( CC16~CC19 , CC24~CC27 ) ,最多

可使用 8 个。

CAPCOM2 的定时器输入时钟可在几个预先给定的 CPU 时钟值中选择 , 也可由模

块 GPT1 中的定时器 T3 的上溢/ 下溢事件驱动。 T7 也可用于计数方式 (由外部输入 ) ,

这时它可对外部事件进行计数。

每一个捕获/ 比较寄存器可独立地设置为捕获功能或比较功能 ,且每一个寄存器可分

配给任何一个定时器。每一个捕获/ 比较寄存器配备有一个端口引脚 ,在捕获功能时用作

输入引脚 ,在比较功能时用作输出引脚 ( CC24~CC27 除外 ,它们只用于捕获功能 )。捕获

功能使得当相应引脚出现一个事件 (跳变 )时 ,可以把定时器的当前值锁存到相应的捕获/

比较寄存器。比较功能是在相应的捕获/ 比较寄存器的值与定时器的当前值相等时 ,改变

相应端口引脚的输出信号。当出现一个捕获/ 比较事件或定时器溢出时 ,均会有专门的中

断请求产生 ,图 5-20 说明了 CA PCOM2 单元的基本结构。

注意 : CAPCOM2 有 8 个捕获输入 ,但只有 4 个比较输出。

5 .4 .2 CAPCOM定时器 T7/ T8

定时器 T7/ T8 的基本作用是为各个捕获/ 比较寄存器提供两个独立的时间基准 (最

大分辨率为 16 TCL)。它们也可以独立使用 ,而不用于捕获/ 比较寄存器。

两个定时器的基本结构是相同的 ,但定时器 T7 及 T8 的输入信号的选择不尽相同

(参见图 5-22 和图 5-23 )。

图 5-22 CAPCOM 定时器 T7的方框图

CAPCOM定时器的功能是由可位寻址的 16 位控制寄存器 T78CON 来控制的。

T78CON 的高字节控制 T8 , T78CON的低字节控制 T7。两个定时器的控制选项是独立

的 (外部输入除外 )。

亿恒 C164CI 16 位单片机

Page 252: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

241

图 5-23 CAPCOM 定时器 T8的方框图

位 功 能

定时器/ 计数器 x 输入选择

TxI

定时方式 ( TxM =“0”) 输入频率 = fCPU/ 2( < TxI > + 3 )

计数方式 ( TxM =“1”) 000: 通用定时器 T3的上溢/ 下溢

001: 引脚 T7IN 的上升沿*

010: 引脚 T7IN 的下降沿*

011: 引脚 T7IN 的任意沿 (上升沿/ 下降沿 ) *

1XX: 保留

TxM 定时器/ 计数器 x 方式选择

0 : 定时方式 (输入为内部时钟 )

1 : 计数方式 (外部输入或是 T3 )

TxR 定时器/ 计数器 x 运行控制

0 : 定时器/ 计数器 x 禁止

1 : 定时器/ 计数器 x 使能

* 这种选择可用于定时器 T 7;对这种选择 ,定时器 T 8 将停止工作。

定时器运行标志 T7R 和 T8R 用来对定时器使能或禁止。下面对定时器工作情况的

说明总是用于使能的定时器 ,即相应的运行标志假定为“1”。

在所有方式下 ,定时器总是进行加计数。CPU 可访问定时器寄存器 T x 得到定时器

的当前值 ,寄存器 T x是不可位寻址的 SFR。当 CP U 在相应的定时器加 1 或重装载执行

前的时刻向寄存器 T x 写入时 , CP U 写入操作具有较高的优先级 ,并且禁止加 1 或重装

载 ,以保证定时器正确的操作。

定时器 T7/ T8 的工作情况如下。

1 .定时方式

专用寄存器 T78CON的位 TxM 用来选择定时器是工作在定时方式还是计数方式。

第 5 章 定时器及捕获/ 比较器

Page 253: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

242

在定时方式 ( TxM =“0”)下 ,定时器的输入时钟由内部 CPU 时钟经过预分频器分频后得

到。每个定时器的预分频器的输入时钟可独立地通过位域 TxI 来选择。

T x的输入频率 fT X由下面的函数决定 ,在函数中 , < TxI >代表位域 TxI的值。

fT X =fCP U

2( < T x I > + 3 )

当定时器从 FF FF H 到 0000H 溢出时 , 它将重新装载存放于相应的重装载寄存器

T xREL 中的值。重装载值决定了 Tx 的两个相继溢出的时间间隔 PT X ,计算公式为

PTX =( 216 - < T xREL > ) * 2( < T xI > +3 )

fCP U

定时器的输入频率、最大分辨率和周期 , 由定时器输入选择项 TxI 决定。当使用

20M Hz的 CP U 时钟时 ,可选项所决定的值如表 5-13 所示。表中的定时器周期值是按重

装载值为 0000 H 进行计算的。

表 5-13 定时器的输入频率、最大分辨率和周期

fCPU = 20MH z定时器输入选择 TxI

000B 001B 010B 011B 100B 101B 110B 111B

对 fCPU预分频 8 16 32 64 128 256 512 1024

输入频率 2 .5MHz 1 .25MHz 625k Hz 312 .5k Hz 156 .25k Hz 78 .125kHz 39 .06k Hz 19 .53k Hz

分辨率 400ns 800ns 1 .6μs 3 .2μs 6 .4μs 12 .8μs 25 .6μs 51 .2μs

周期 26ms 52 .5ms 105ms 210ms 420ms 840ms 1 .68s 3 .36s

当定时器运行标志位 TxR 设为“1”后 ,定时器开始工作。在经过由定时器分辨率所

定义的时间间隔后发生第一次加 1 操作 ,以后每经过这样一段时间做一次加 1。

当 CAPCOM 单元的两个定时器同时要求加 1 或重装载时 , T7 总是比 T8 先一个

CP U周期得到服务。

2 .计数方式

计数方式用专用寄存器 T78CON 的位 TxM 来选择。在计数方式 ( TxM =“1”)下 ,

其输入时钟是由模块 GPT1 的定时器 T3 上溢/ 下溢时产生。此外 ,定时器 T7 还可对外

部事件进行计数。可以选择引脚 T7IN(端口输入替换功能 )的上升沿、下降沿或任何沿

(上升沿/ 下降沿 )作为引起 T7 加 1 操作的触发事件。

当 T8 运行在计数方式时 ,位域 TxI 需设置为“000B”,选用定时器 T3 的上溢/ 下溢

作为计数源 ,这是 T8 惟一可用的选择。当位域 TxI 被编程为任何其他组合时 ,定时器

T8 都将停止计数。

当 T7 运行在计数方式时 ,位域 TxI 可用来选择计数源和输入引脚上的那种跳变沿

作为计数触发 (参见 T78CON 关于可能选择项的说明 )。

注意 : 为将引脚 T7IN用作外部计数输入引脚 ,相应的端口引脚必须设置为输入 ,即相

应的方向控制位必须置“零”(DPx .y =“0”)。如果相应的端口引脚设置为输出 ,则可通过软

亿恒 C164CI 16 位单片机

Page 254: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

243

件改变端口输出锁存器 Px .y 的值来对相关的定时器进行计数 , 例如 ,用于测试时便是

如此。

T7 在计数方式下的最高的外部输入频率为 f CPU/ 16。为了确保能正确检测到定时器

输入端信号的变化 ,外部计数输入信号在变换其电平状态前至少应该保持 8 个 CP U 时钟

周期。加 1 后的计数值将在引脚 T7IN信号产生跳变后 ,经过 8 个 CPU 时钟周期呈现在

专用寄存器 T7 中。

3 .重装载

每当定时器从 FF FF H 变为 0000 H 产生溢出时 ,在定时/ 计数方式下都会进行重新

装载 ,把与此定时器对应的重装载寄存器中存放的 16 位值装载到定时器中。此时 ,定时

器不会返回到 0000 H ,而是装载为重装载寄存器 T xREL 的值。随后定时器将从此值开

始进行加 1 计数。

4 . CAPCOM定时器的中断

定时器溢出时 ,其相应定时器的中断请求标志 TxIR 将置位。在相应的中断允许位

T xIE 使能时 ,这一标志将用来产生一次中断或触发一个 PEC服务请求。

每个定时器都具有自己的中断控制寄存器 ( TxIC )和中断向量 ( TxIN T )。中断控制

寄存器 TxIC的组成与其他中断控制寄存器相同。

注 : 各控制位的具体解释 ,请参看一般中断控制寄存器的说明。

5 .4 .3 捕获/ 比较寄存器

16 位捕获/ 比较寄存器 CC16~CC19 和 CC24~CC27 用作定时器 T7 及 T8 执行捕

获或比较操作时的数据寄存器。这些捕获/ 比较寄存器不能用位寻址。

每一个 CCx 寄存器可单独设置为捕获方式或 4 种不同的比较方式之一 ( CC24~

CC27 无输出信号 ) ,且可以独立地分配给两个定时器 T7 及 T8 中的一个。在比较方式

中 ,允许出现一种特殊的组合 ,即“双寄存器”的比较方式。当某一个 CCx 寄存器被禁止

第 5 章 定时器及捕获/ 比较器

Page 255: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

244

用于捕获或比较操作时 ,它也可用作一般的变量存储。

8 个捕获/ 比较寄存器的功能是由两个可位寻址的 16 位模式控制寄存器 CCM4 和

CCM6 来控制的 ,这两个寄存器的组成是一样的。每个寄存器都包含 4 个捕获/ 比较寄存

器的方式选择位和定时器分配位。

位 功 能

CCMODx 捕获/ 比较寄存器 CCx 方式选择

可用的捕获/ 比较方式见表 5-14

捕获/ 比较寄存器 CCx 的分配位

ACCx 0 : CCx 分配给定时器 T7

1 : CCx 分配给定时器 T8

表 5-14 捕获方式和比较方式的选择

CCMODx 工作方式选择

000 禁止捕获和比较方式

各个捕获/ 比较寄存器用作一般的变量存储

001 在引脚 CCxIO的上升沿捕获

010 在引脚 CCxIO的下降沿捕获

011 在引脚 CCxIO的上升沿和下降沿都捕获

比较方式 0 : 仅产生中断

100 每个定时器周期产生若干个中断 ;对寄存器 CC24~CC27 允许双寄存器比较

方式

比较方式 1 : 每次匹配触发输出引脚翻转

101 每个定时器周期产生若干个比较事件 ;对寄存器 CC16~CC19 双寄存器比较需

要这种方式

110 比较方式 2 : 仅产生中断

每个定时器周期仅产生一次中断

111 比较方式 3 : 每次匹配输出引脚置位

在每个定时器溢出时复位输出脚 ;每个定时器周期仅产生一次中断

亿恒 C164CI 16 位单片机

Page 256: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

245

对捕获和比较方式的详细讨论 ,适用于所有捕获/ 比较通道 ,因此寄存器、位和引脚都

用通配符“x”代替。

注意 : 捕获/ 比较通道 24~27 产生中断请求 ,但不提供输出信号。由此所引起各项

例外将在下面的小节中说明。

在通道 27 中出现的一个捕获或比较事件 ,可用来触发 C164CI的 A/ D转换器的通道

注入 (如果 A/ D转换使能 )。

1 .捕获方式

当响应一个外部事件时 ,定时器 ( T7 或 T8 ,取决于分配控制位 ACCx 的状态 )的当前

值将锁存到相应的捕获寄存器 CCx 中。引起捕获的外部事件可设置为对应外部输入引

脚 CCxIO的上升沿、下降沿或是任何跳变沿。捕获方式的方框图如图 5-24 所示。

图 5-24 捕获方式的方框图

跳变沿是通过相应的 CAPCOM 方式控制寄存器中的方式控制位 CCMODx 进行选

择。在任何情况下 ,引起捕获的事件将同时使相应的中断请求标志 CCxIR 置位。在中断

使能时 ,可引起一次中断或一次 PEC服务请求。

为了把相应的端口引脚用作捕获寄存器 CCx 的捕获输入引脚 CCxIO,这些端口引脚

必须设置为输入 ,即相应的方向控制位必须设置为“0”。为了保证信号的跳变能正确地检

测到 ,外部的捕获输入信号在改变其电平之前 ,至少应当保持 8 个 CPU 时钟周期。

在此 8 个 CPU 时钟周期内 ,将对捕获输入信号依次采样。若在此段时期内 ,定时器

发生修改或加 1 ,则在当前采样序列中的剩余时段将会把新的定时器的值送入捕获寄

存器。

如果引脚 CCxIO设置为输出 ,则捕获功能可通过软件修改相应的端口输出锁存器来

触发 ,例如 ,用于测试时往往如此。

2 .比较方式

比较方式只需最小的软件开销 ,即可对事件作出响应 (中断和输出跳变信号 )。在所

有的比较方式中 ,存储在比较寄存器 CCx 中的 16 位数据 (下面称为比较值 )不断地与分

配给它的定时器中的内容 ( T7 或 T8 )进行比较。如果当前定时器的内容与比较值匹配 ,

在相应引脚 CCxIO上将产生适当的输出信号 ( CC24IO~CC27IO除外 ) ,同时相应的中断

请求标志置位 ,产生一个中断申请。

第 5 章 定时器及捕获/ 比较器

Page 257: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

246

同捕获方式一样 ,比较寄存器在比较方式下也顺次进行处理。当任意两个比较寄存

器设置成同一个比较值时 ,在定时器加 1 达到比较值之后 ,经过 8 个 CPU 时钟周期输出

选取的信号电平 ,并把它们对应的中断请求标志设置成“1”。在定时器再次加 1 或者被软

件改写之前 ,对相同比较值的比较事件将会被禁止。复位后 ,如果对应的定时器已经加 1

或被软件改写 ,且已选择了下述某种比较方式 ,于是寄存器 CCx 的比较事件将处于使能

状态。

对于一个给定的比较寄存器 CCx,不同的比较方式将通过相关的捕获/ 比较方式控

制寄存器中的方式控制位 CCMODx 进行选择。

(1 ) 比较方式 0

这是一个只产生中断的方式 ,可以用于软件计时。将相应的方式控制寄存器中的位

域 CCMODx 设置成“100B”,即可使比较寄存器 CCx 选择比较方式 0。

在这种方式中 ,每当检测到比较寄存器 CCx 和分配给它的定时器的内容匹配时 ,中

断申请标志 CCxIR 就置位。当在一个定时器周期内对寄存器 CCx 中的比较值进行更新

时 ,这种比较事件可能会发生若干次。相应的端口引脚 CCxIO 在这种方式下不受比较事

件的影响 ,可以用作一般的 I/ O 口。

如果寄存器 CC24~CC27 中的任一个设置为比较方式 0 ,且第二组相应的寄存器设

置成比较方式 1 ,则双寄存器比较方式有效 (见下面“双寄存器比较方式”一节 )。

比较方式 0 和比较方式 1 的方框图如图 5-25 所示。图 5-26 给出了一个比较方式 0

和比较方式 1 的时序示例。

图 5-25 比较方式 0 和比较方式 1 的方框图

注意 : 在比较方式 0 中 ,端口锁存器和引脚不受影响。

在下面的例子中 ,寄存器 CCx 中的比较值在比较事件 # 1 和 # 3 之后 ,从 cv1 修改为

cv2;在事件 # 2 和 # 4 之后 ,又从 cv2 修改为 cv1。这样就得到了由时钟 Ty 产生的周期

性中断请求和来自寄存器 CCx 的中断请求。后者发生的时间是由用户通过 cv1 和 cv2

来指定的。

(2 ) 比较方式 1

将相应的方式控制寄存器的位域 CCMODx 设置为“101B”,则寄存器 CCx 将选择比

较方式 1。

在这种方式中 ,当检测到寄存器 CCx 中的比较值和相应的定时器内容相等时 ,中断

亿恒 C164CI 16 位单片机

Page 258: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

247

图 5-26 比较方式 0 和比较方式 1的时序示例

请求标志 CCxIR 置“1”,同时相应的输出引脚 CCxIO(替换输出功能 )翻转。此时 ,对应端

口的输出锁存器 (不是引脚 )被读出并反相 ,然后写回到输出锁存器。

比较方式 1 允许在单个的定时器周期内存在若干个比较事件。相应的定时器的溢出

对输出引脚没有作用 ,它对往后的比较事件不禁止也不使能。

在比较方式 1 中 , 为了用对应的引脚作为比较寄存器 CCx 的比较信号输出引脚

CCxIO ,该引脚必须置为输出方式 ,也即相应的方向控制位必须置“1”。这样配置时 ,可以

对输出信号的初始状态进行编程 ,或者在任何时候用对端口输出锁存器“写”来改变其状

态。在比较方式 1 中 ,每一次比较事件 ,端口锁存器都会翻转 (见图 5-26 的时序示例 )。

注意 : 如果端口输出锁存器被软件写入 ,同时存在一次比较事件 , 那么软件写入优

先。在这种情况下 ,硬件触发无效。

如果寄存器 CC16~CC19 中的一个设置成比较方式 1 ,而与组 1 寄存器相应的寄存

器设置成比较方式 0 ,则双寄存器方式变为有效 (见“双寄存器比较方式”一节 )。

注意 : 如果端口输出锁存器被软件写入 ,同时它又由一次比较事件而被改变 ,那么软

件写入将具有优先权。在这种情况下 ,硬件触发的改变将不会有效。在通道 24~27 上 ,

比较方式 1 将会产生中断申请 ,但不提供输出功能。

(3 ) 比较方式 2

同比较方式 0 一样 ,比较方式 2 是一个只产生中断的方式 ,但每个定时器周期只产生

一个中断请求。将相应的方式控制寄存器中的位域 CCMODx 设置为“110B”,则寄存器

CCx 选择比较方式 2。比较方式 2 和比较方式 3 的方框图如图 5-27 所示。

在比较方式 2 中 ,若在一个定时器周期内第一次检测到匹配时 , 则中断请求标志

CCxIR 置“1”,相应的端口引脚不受影响 ,可以用作通用 I/ O 口。然而 ,在这种方式下 ,在

第一次匹配之后 ,同一定时器周期中的比较寄存器 CCx 的比较事件均被禁止 ,直到相应

的定时器溢出。这意味着在第一次匹配后 ,即使比较寄存器重新装载到一个比当前的定

时器值还高的数值 ,也不会有比较事件发生 ,直到进入下一个定时器周期。

图 5-28 给出了一个比较方式 2 和比较方式 3 的时序示例。在这个例子中 ,寄存器

CCx 中的比较值在比较事件 # 1 之后 ,从 cv1 修改到 cv2。比较事件 # 2 直到下一个定时

器周期 Ty 才会发生。

第 5 章 定时器及捕获/ 比较器

Page 259: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

248

图 5-27 比较方式 2 和比较方式 3 的方框图

注意 : 在比较方式 2 中 ,端口锁存器和引脚不受影响。

图 5-28 比较方式 2 和比较方式 3的时序实例

(4 ) 比较方式 3

将相应的方式控制寄存器的位域 CCMODx 设置成“111B”,则寄存器 CCx 将选择比

较方式 3。

在检测到定时器周期内的第一次匹配时 ,中断请求标志 CCxIR 置“1”,同时输出引脚

CCxIO(替换功能 )也置为“1”。当相应的定时器溢出时 ,引脚 CCxIO复位到“0”。

在这种方式下 ,如果出现寄存器 CCx 的匹配 ,则在当前定时器周期内的其余比较事

件都被禁止 ,直到相应的定时器溢出。在检测到匹配之后 , 如果比较寄存器重新装载 ,这

个新值也不会生效 ,直到进入下一个定时器周期。

在比较方式 3 中 ,端口锁存器在比较事件后置位 ,并在定时器溢出后清零。

然而 ,当一个通道的比较值和重装值相等时 ,相应的中断请求将会产生 ,只是输出信

号不改变 (在这样的情况下 ,置位和清零恰好重合 )。

(5 ) 双寄存器比较方式

在双寄存器比较方式中 ,两个比较寄存器一起工作 ,控制同一个输出引脚。这种方式

亿恒 C164CI 16 位单片机

Page 260: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

249

通过这两个寄存器的特殊的方式组合来选择。

对于双寄存器方式 , CAPCOM2 单元的 8 个捕获/ 比较寄存器分为两组 ,每组 4 个寄

存器。寄存器 CC16~CC19 构成第 1 组 ,而寄存器 CC24~CC27 构成第 2 组。对于双寄

存器方式 ,组 1 的寄存器和组 2 的寄存器构成一个寄存器对。这个寄存器对中的两个寄

存器共同对与第一组寄存器的相关引脚 (引脚 CC16IO~CC19IO)进行操作。

组 1 的寄存器与组 2 的寄存器之间的配对关系 ,以及双寄存器比较方式下的有效输

出引脚如表 5-15 所示。

表 5-15 双寄存器比较方式的寄存器对

CAPCOM2 单元

寄存器对

组 1 组 2联合输出引脚

CC16 CC24 CC16IO

CC17 CC25 CC17IO

CC18 CC26 CC18IO

CC19 CC27 CC19IO

对于每一对寄存器 ,都可以单独设置为双寄存器方式。为了使双寄存器方式有效 ,相

应的组 1 中的寄存器 (见表 5-15 )必须设置成比较方式 1 ,同时组 2 中对应的寄存器 (见表

5-15)必须设置成比较方式 0。如果第 1 组的比较寄存器被禁止或设置成其他方式 ,则相

应的第 2 组寄存器将会工作在比较方式 0(只有中断的方式 )。

下面组 2 寄存器 (设置成比较方式 0 )用 CCz表示 ,相应的组 1 寄存器 (设置成比较方

式 1 )用 CCx表示。当检测到寄存器对中的任一个寄存器匹配时 ( CCx 或 CCz) ,则相应的

中断请求标志 ( CCxIR 或 CCzIR )置“1”,同时与组 1 寄存器 CCx 对应的引脚 CCxIO 翻

转。产生的中断总是和引起匹配的寄存器一致。

注意 : 如果寄存器对的寄存器 CCx 和 CCz 同时产生匹配 ,则引脚 CCxIO 只会翻转

一次 ,但是会产生两个独立的比较中断请求 ,一个对应于向量 CCxIN T ,一个对应于向量

CCzIN T。

在双寄存器比较方式中 ,为了将相应的端口引脚用作比较寄存器 CCx 的比较信号输

出引脚 CCxIO ,端口引脚必须设置成输出方式 ,即相应的方向控制位必须置“1”。此时 ,

输出引脚与比较方式 1 中具有相同的特性。

双寄存器比较方式的方框图如图 5-29 所示。

图 5-30 给出了一个双寄存器比较方式的时序示例。在这个例子中 ,选择比较寄存器

与同一个定时器配合使用。当然 ,每一个寄存器也可以分别与 CAPCOM 单元中两个定

时器中的一个配合使用。在图 5-30 比较方式的时序示例中 ,寄存器 CCx 和 CCz 的比较

值均不改变。

注意 : 引脚 CCzIO(没有用于双寄存器比较方式时 )可以用作通用 I/ O 口。

第 5 章 定时器及捕获/ 比较器

Page 261: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

250

图 5-29 双寄存器比较方式的方框图

图 5-30 双寄存器比较方式的时序示例

(6 ) 捕获/ 比较中断

对于一个捕获或者比较事件 ,相应的捕获/ 比较寄存器 CCx 的中断请求标志 CCxIR

设置为“1”。当中断允许标志位 CCxIE 使能时 ,这一标志可以用来产生一个中断或者触

发一个 PEC 服务请求。

捕获中断可以看作是一个外部中断申请 ,它具有记录触发事件发生时间的附加功能

(见 2 .3 .8“外部中断”一节 )。

8 个捕获/ 比较寄存器中的任一个都具有它自己的可位寻址的中断控制寄存器

( CC16IC~ CC19IC, CC24IC~ CC27IC ) 和自己的中断向量 ( CC16INT ~ CC19IN T ,

CC24INT~CC27IN T)。这些寄存器组成方式与所有其他的中断控制寄存器相同。表

5-16 中给出了相应的地址。

亿恒 C164CI 16 位单片机

Page 262: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

251

表 5-16 捕获/比较单元中断控制寄存器地址

CAPCOM2 单元

寄存器 地 址 寄存器空间

CC16IC F160 H/ B0 H ESFR

CC17IC F162 H/ B1 H ESFR

CC18IC F164 H/ B2 H ESFR

CC19IC F166 H/ B3 H ESFR

CC24IC F170 H/ B8 H ESFR

CC25IC F172 H/ B9 H ESFR

CC26IC F174 H/ BAH ESFR

CC27IC F176 H/ BBH ESFR

5 .4 .4 程序举例

[例 5 .2] 本例是用捕获/ 比较单元 2 ( CA PCOM2 )产生两个边沿对齐的 PWM 信号

的子程序。其中一个占空比为 25 % ,周期为 26ms ,使用 CA PCOM 通道 16 , 被分配到定

时器 T7。另一个占空比为 50 % ,周期为 26ms,使用 CAPCOM 通道 17 ,被分配到定时器

T8。已知 CP U 的时钟频率为 20MHz。

系统初始化设置 (略 )。

定时器的初始化 :

定时器 T7 工作在定时方式 ,预分频比为 8。

定时器 T8 也工作在定时方式 ,预分频比为 8。

P8 .0 口用作 CA PCOM 通道 16 的输出 , P8 .1 口用作 CA PCOM 通道 17 的输出。

定时器 T7 以比较方式 3 工作 ,每当匹配时 ,引脚 CC16IO输出为“1”。定时器 T8 也

以比较方式 3 工作 ,每当匹配时 ,引脚 CC17IO输出为“1”。

其他 CAPCOM 通道均禁止。

汇编程序清单如下。

main:

CALLA c_ UC, IO_vInit

CALLA cc_ UC, CC2_vInit

BSE T IEN

第 5 章 定时器及捕获/ 比较器

Page 263: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

252

RET

CC2_vInit : ;定时器 T7 , T8初始化子程序

MOV T78CON , # 00 H ;定时器 T7 , T8以定时方式工作

EXTR # 04 H

MOV T7, # 00 H

MOV T8, # 00 H

MOV T7RE L , # 00 H

MOV T8RE L , # 00 H

OR P8 , ZEROS ; P8口起始输出为“0”

EXTR # 01 H

OR ODP8 , # 00 H ; P8口设为推挽输出

OR DP8 , # 03 H ; P8 .0 和 P8 .1为输出口

MOV CCM4, # 0F7 H ;通道 16 ,17 分别分配给定时器 T7和 T8

MOV CC16 , # 0C000 H ;设置占空比

MOV CC17 , # 08000 H

OR T78CON , # 04040 H ;启动定时器计数

RET

IO_vInit : P8 口初始化子程序

EXTR # 01 H

MOV PICON , # 00 H

RET

图 5-31 是由 CAPCOM2 单元产生的两路边沿对齐的 PWM 信号波形。图中

10.0 kS/ s 表示每秒采样 10000 个样本。

图 5-31 由 CAPCOM2 单元产生的两路边沿对齐的 PWM 信号波形

亿恒 C164CI 16 位单片机

Page 264: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

253

5 .5 捕获/比较单元 CAPCOM6

5 .5 .1 概述

C164CI 的 CAPCOM6 单元是专为产生数字信号和事件捕获方面的应用而设计的

(如脉冲宽度调制和脉冲宽度测量等 )。它提供时间序列的产生和控制 ,使用 3 个 16 位捕

获/ 比较通道加上一个 10 位比较通道。

图 5-32 给出了捕获/ 比较单元 CA PCOM6 的方框图。

图 5-32 捕获/ 比较单元 CAPCOM6 的方框图

CAPCOM6 单元工作在比较方式时 ,为每一个 16 位通道提供两种输出信号 ,它们具

有相反的极性 , 且脉冲跳变沿不重叠。10 位比较通道可以产生单个脉冲宽度调制

( PWM)输出信号 ,并可进一步用来调制捕获/ 比较输出信号。

对于马达控制的应用 ,这两个子单元可以产生多种形式的多通道 PWM 信号 ,这些信

号基本上可以由比较定时器 T12 或典型的霍尔传感器模式以中断输入方式控制。

比较定时器 T12 (16 位 )和 T13 ( 10 位 )是自由运行的定时器 ,由经过预分频的 CP U

时钟驱动。

在捕获方式下 ,当在引脚 CC6x 上出现一个可编程跳变信号时 ,把比较定时器 T12 的

内容存入捕获寄存器。

对程序员来说 , CAPCOM 单元相当于一组与此周边电路相关的 SFR,包括用作替换

功能的输入或输出引脚 ,以及它们的方向控制位 (见图 5-33)。

3 个 16 位的捕获/ 比较通道由定时器 T12 驱动 ,每个可以控制两路输出 (见端口控

第 5 章 定时器及捕获/ 比较器

Page 265: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

254

图 5-33 与 CAPCOM6单元相关的 SFR 和引脚

制逻辑 )。偏移量寄存器 T12OF 允许通过移动相应的比较值来改变 COUT6x 输出电平

的跳变位置。

10 位的比较通道由定时器 T13 驱动 , 可以控制一条输出线。

附加的控制逻辑对捕获/ 比较通道输出与比较通道输出进行组合 , 或与外部信号进

行组合 ,从而自动灵活地产生复杂的输出波形 ,不需要或很少需要 CPU 的操作。

1 .基本工作模式

比较方式有两种基本工作模式。

( 1) 边缘对齐模式。比较定时器从 0000 H 开始加计数 ,当达到保存在寄存器 T xP 中

的周期值时 ,定时器清零并重新开始计数。这时输出信号变换到被动状态。两个比较定

时器 T12 和 T13 都支持边缘对齐模式。

(2 ) 中心对齐模式。比较定时器 T12 从 0000 H 开始加计数 ,当达到保存在寄存器

T12P中的周期值时 ,改变计数方向 ,定时器进行减计数。加/ 减计数期间 ,若定时器的内

容与比较值匹配 ,则输出信号变换到主动/ 被动状态。只有比较定时器 T12 支持中心对

齐模式。

比较定时器 T12 和 T13 是自由运行的定时器 ,其时钟频率可在 fCP U~ fCP U/ 128 之间

编程选取。当定时器达到程序设定的比较值时 , 相应的输出信号将发生改变。而对

COU T60~COU T62 的输出信号的切换 , 则使用定时器内容加上偏移量和比较值进行

比较。

定时器 T12 可工作在边缘对齐或中心对齐的 PWM 模式 (见图 5-34 ) ,图 5-34 ( a)和

图 5-34( b )给出了跳变沿有一定延时或无一定延时的两种工作情况。

定时器 T13 只能工作在边缘对齐模式 ,无跳变沿延时。

亿恒 C164CI 16 位单片机

Page 266: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

255

图 5-34 CAPCOM6基本操作方式

2 .时序安排

CAPCOM6 单元使用一个可编程时钟 ( fCP U~ fCP U/ 128)。单元内的所有操作由这个

时钟信号控制。在下降沿处更改比较定时器的值 ,在上升沿处变换输出信号 (如果需要改

变的话 )。

图 5-35 给出了 CAPCOM6 内部时钟的安排。

图 5-35 CAPCOM6内部时钟安排

3 .输出信号电平的控制

CAPCOM6 单元产生的输出信号用主动状态和被动状态的持续时间来描述。这些

第 5 章 定时器及捕获/ 比较器

Page 267: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

256

持续时间定义了信号的周期和占空比。为了使这些输出信号能适合特殊应用的需求 ,每

个信号被动状态的逻辑电平可以通过寄存器 CC6MCON来选择。

当使用陷阱功能时 ,由于受到外部 (紧急 )信号的激励 ,输出信号将切换到陷阱电平。

这个陷阱电平是由相应端口的输出锁存器规定的。

注意 : 若在 CAPAOM6 工作期间去改变输出信号状态的电平 ,将会直接影响到输出信

号。建议在对输出信号赋值和 CAPCOM6 单元启动之前的初始化过程中定义输出电平。

在突发模式和多通道模式中 ,由比较/ 捕获通道产生的信号可以用 10 位比较通道产

生的信号进行调制。比较通道的信号在调制其他输出信号之前 ,可以选择先反转一次。

这个比较通道的信号可以从引脚 COU T63 输出。输出功能可以用寄存器 CTCON 的位

EC T13O使能。如果输出功能禁止 , COU T63 将输出规定的被动状态电平。

5 .5 .2 工作情况

1 .边缘对齐模式

比较定时器从 0000 H 开始加计数。当定时器的内容与寄存器 CC6x 中的比较值匹

配时 ,对应的输出信号将变换到主动状态。当达到保存在寄存器 TxP中的周期值时 ,定

时器将清零 ,并重新开始计数。这时输出信号变换到它的被动状态。

在图 5-36 中 ,跳变沿的偏移量取为“0”,因此 ,输出信号由 CC6x 和 COUT6x 决定。

图 5-36 边缘对齐模式的工作情况

图 5-36 示出了如何产生占空比为 0%~100%之间的 PWM 信号 (包括两个端点 )。

占空比直接对应于可编程的比较值。所要的输出信号可以从各自的引脚 CC6 x 和

亿恒 C164CI 16 位单片机

Page 268: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

257

COU T6x 输出 , 或从两个引脚一起输出。引脚分配由寄存器 CC6MSEL 中的位域

CMSELx 控制。使能后输出端的被动状态电平用寄存器 CC6MCON 来选择。图 5-36

中 ,主动状态为高电平 ,被动状态为低电平 (对应的选择位为“0”)。

在图 5-37 中 ,使用了非零的偏移量。在这种情况下 ,比较值不是直接与定时器的内

容进行比较 ,而是与定时器的内容加上偏移量进行比较。结果是信号 COUT6x 主动相的

沿相对于 CC6x 有一个偏移。

图 5-37 非零偏移量的工作情况

图 5-37 中显示了所产生的几种输出信号 (比较值 =“3”)。

(a ) 标准输出信号 ,直接使用 T12 ,主动状态为高电平。

( b ) 偏移输出信号 ,使用 T12 + T12OF ,主动状态为高电平。

(c ) 信号同 ( b) ,但是主动状态为低电平。

( d) 0%输出信号 ,比较值 CC6x > T12P + T12OF。

(e ) 100%输出信号 ,比较值 CC6x = T12O F。

注意 : 偏移量的操作只适用于定时器 T12 的 3 个捕获/ 比较通道。定时器 T13 的比

较通道不提供偏移量寄存器 ,并且没有第二输出信号。

2 .中心对齐模式

与 T12 相关联的 3 个捕获/ 比较通道可以工作在中心对齐模式。比较定时器 T12 从

0000 H 开始加计数。当定时器的内容与相应的寄存器 CC6 x 中比较值匹配时 ,对应的输

出信号变换到主动状态 (加计数时 )。当达到存在寄存器 T12P 中的周期值时 ,改变计数

方向 ,定时器做减计数。一旦定时器内容与寄存器 CC6x 中相应的比较值相等时 ,对应的

输出信号变换到被动状态 (减计数时 )。

输出信号 COU T6 x 的变换是用寄存器 CC6x 中的值与 T12 + T12OF 进行匹配的。

COU T6x 的沿相对 CC6x 的沿对称地偏离一个非零偏移量 (见图 5-38 )。这样便可以产

生具有任意激活电平的一对无重叠信号 CC6x/ COU T6 x。这些信号对可以用来驱动电源

第 5 章 定时器及捕获/ 比较器

Page 269: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

258

桥接器的开关 ,不会有某条支路发生短路的危险 ,且有程序的死区时间 tO F F 加以保护 (见

图 5-38)。

图 5-38 中心对齐模式的工作情况

注意 : 为了使 PWM 信号有正确的死区时间 ,存储在 T12OF中的偏移量必须比存储

在比较寄存器中的值小。偏移量会影响所有的 COU T6 x 输出。

3 .时序关系

比较定时器的分辨率由所选择的内部时钟频率决定。输出信号的周期范围的最小值

取决于实际的定时器分辨率 ,最大值取决于定时器及设定的周期值。表 5-17 列出了可能

选择的时钟及两个比较定时器的分辨率和周期范围。由于内部的操作 ,可能输出的最小

周期为两个内部时钟周期 (见图 5-39 )。

表 5-17 内部时钟 fCPU = 20 MHz时比较定时器的分辨率和周期范围

内部时钟比较定时器

分辨率

输出信号周期范围 ( Txmin - T12max / T13max)

边缘对齐模式 中心对齐模式

fCPU 50ns 100ns~3 .28ms / 51 .2μs 200ns~6 .55ms / 102 .4μs

fCPU/ 2 100ns 200ns~6 .55ms / 102 .4μs 400ns~13 .11ms / 204 .8μs

fCPU/ 4 200ns 400ns~13 .11ms / 204 .8μs 800ns~26 .21ms / 409 .6μs

fCPU/ 8 400ns 800ns~26 .21ms / 409 .6μs 1 .6μs~52 .43ms / 819 .2μs

fCPU/ 16 800ns 1 .6μs~52 .43ms / 819 .2ms 3 .2μs~104 .86ms / 1 .64ms

fCPU/ 32 1 .6μs 3 .2μs~104 .86ms / 1 .64ms 6 .4μs~209 .72ms / 3 .28ms

fCPU/ 64 3 .2μs 6 .4μs~209 .72ms / 3 .28ms 12 .8μs~419 .43ms / 6 .55ms

fCPU/ 128 6 .4μs 12 .8μs~419 .43ms / 6 .55ms 25 .6μs~838 .86ms / 13 .1ms

亿恒 C164CI 16 位单片机

Page 270: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

259

图 5-39 时序图

比较时钟 Tx 的周期和占空比可以根据下面的公式计算 ,其中 :

p v = 周期值 ,存储在 T xP 寄存器中 ;

ov = 偏移量 ,存储在 T12OF寄存器中 ;

cv = 比较值 ,存储在 CC6x 或 CMP13 寄存器中。

注意 : 对比较定时器 T13 的输出信号 COU T63 ,仅在边缘对齐模式中是可以用的。

边缘对齐模式 :

周期值 = p v + 1

CC6 x输出的占空比 = 1 -cv

pv + 1×100 %

COU T6x 输出的占空比 = 1 -cv - ovp v + 1

×100%

中心对齐模式 :

周期值 = 2× pv

CC6 x输出的占空比 = 1 -cvpv×100%

COU T6x 输出的占空比 = 1 -cv - ov

p v×100%

4 .突发模式

在突发模式中 , 10位比较通道的输出信号 COUT63 对 3 个捕获/ 比较通道的输出信号

第 5 章 定时器及捕获/ 比较器

Page 271: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

260

COUT6x的主动相进行调制。输出 CC6x 不能用于突发模式。典型情况下 ,调制信号比被

调制的输出通道具有更高的频率。图 5-40 给出了一种由突发模式所产生波形的例子。

图 5-40 突发模式

通过对寄存器 CC6MSEL 中相应位 CMSELx3 进行置位 ,可分别允许各个比较/ 捕获

通道输出工作在突发模式。

5 .捕获方式

通过寄存器 CC6MSEL 中的位 CMSELx 可分别将 3 个捕获/ 比较通道中的每一个设

置为捕获方式。在捕获方式中 ,当相应引脚 CC6 x 上有选定的跳变沿 (上升沿、下降沿或

任何跳变沿 )发生时 ,把定时器 T12 的内容复制到通道的比较寄存器 CC6x 中。捕获方式

可以在边缘对齐模式中使用 ,也可以在中心对齐模式中使用。捕获到的输入信号的跳变

可以有选择地用来产生中断。

每个 CPU 的时钟周期都对引脚 CC6x (捕获方式中的输入端 )采样。在一串捕获事

件中 ,必须注意到每一个捕获事件都会重写相应的寄存器 CC6x ,覆盖掉前面的值。因

此 ,设计控制软件时必须保证能够及时读回捕获到的值。

5 .5 .3 组合多通道模式

只有全功能 CAPCOM6 模块才可使用组合多通道模式。

当工作在组合多通道模式时 ,输出信号 CC6x 和 COU T6 x 不仅受比较定时器控制 ,

而且和附加条件有关。组合多通道模式是通过寄存器 CC6MCON 进行选择的。在这种

亿恒 C164CI 16 位单片机

Page 272: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

261

模式中 ,一组预先规定好样式的信号序列将送到各输出端。

多相方式可以有效地产生所需样式的输出信号 ,如 4~6 相的单极性驱动。相位序列

不仅可以由 T12 溢出自动控制 ,而且可以通过软件控制。

块交换方式 ( BCM)是一种特殊的多通道模式 ,尤其支持无刷直流电机的控制。在这

种模式下 ,相位序列是由驱动部分产生的 3 个输入信号 ( CC6POSx )控制。

所有模式均可对主动相的输出信号进行调制。

图 5-41 是多通道模式控制的组成框图。

图 5-41 多通道模式的控制

1 .多通道模式下的输出信号

在多通道模式下 ,输出信号主要按所选的相位序列控制 (见后面的时序图 )。每个输

出信号有 2 个相位为主动状态 ,所有其他各个相位均处于被动状态。

每个输出信号的主动相可以用 T12 或 T13 调制。为得到未调制的主动相 ,定时器

T12 必须以 100 %的占空比工作 ,即对它的偏移量和比较寄存器清零 ,并且要禁止 T13 的

调制 ,即位 CMSELx3 必须清零。当 T12 设置的占空比小于 100%时 , T12 的调制有效。

而 T13 的调制通过位 CMSELx3 使能 (见图 5-42 中的例子 )。

图 5-42 给出了 5 相的输出波形。对于其他多相模式 ,每一个被动相可分别按照相位

序列缩短或延长。

比较输出信号根据所需要的多相模式进行使能。表 5-18 列出了要求的编码。

表 5-18 多通道 PWM输出信号的编程

多通道 PWM 模式 CMSEL2 CMSEL1 CMSEL0

块交换方式 011B 011B 011B

4 相多通道 PWM 011B 010B 001B

5 相多通道 PWM 011B 010B 011B

6 相多通道 PWM 011B 011B 011B

第 5 章 定时器及捕获/ 比较器

Page 273: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

262

图 5-42 基本的 5相位多通道时序

注意 : 若位 CMSELx3 =“1”,则引脚 COUT6x 的信号用比较定时器 T13 调制 ,否则

不调制。T13 的调制可以和 T12 的调制相组合。

2 .相位时序表

表 5-19~表 5-21 列出了各种多相位模式的相位序列 ,这些序列的每一个状态通过

其跟随状态确定。如对 5 相位情况 ,对“01”设置 , 2 的下一个状态是 1 , 1 的下一个状态

是 5 ,⋯⋯表中还列出了各个状态的输出电平。

相位序列的状态按以下方式变换 :

(1 ) 在 T12 溢出时自动变换。

表 5-19 4相多通道 PWM 时序表

状态输出电平定义 跟随状态 (对 BCM = ⋯ )

CC60 COUT61 CC62 COUT60 CC61 COU T62 01 10 00 11

0 被动 被动 被动 — — 被动 2 1 0 5

1 主动 被动 被动 — — 主动 4 2 0 5

2 主动 主动 被动 — — 被动 1 3 0 5

3 被动 主动 主动 — — 被动 2 4 0 5

4 被动 被动 主动 — — 主动 3 1 0 5

5 被动 主动 被动 — — 主动 2 1 0 5

亿恒 C164CI 16 位单片机

Page 274: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

263

表 5-20 5相多通道 PWM时序表

状态输出电平定义 跟随状态 (对 BCM = ⋯ )

CC60 COUT61 CC62 COUT60 CC61 COU T62 01 10 00 11

0 被动 被动 被动 被动 — 被动 2 1 0 6

1 主动 被动 被动 被动 — 主动 5 2 0 6

2 主动 主动 被动 被动 — 被动 1 3 0 6

3 被动 主动 主动 被动 — 被动 2 4 0 6

4 被动 被动 主动 主动 — 被动 3 5 0 6

5 被动 被动 被动 主动 — 主动 4 1 0 6

6 被动 主动 被动 主动 — 主动 2 1 0 6

表 5-21 6相多通道 PWM时序表

状态输出电平定义 跟随状态 (对 BCM = ⋯ )

CC60 COUT61 CC62 COUT60 CC61 COU T62 01 10 00 11

0 被动 被动 被动 被动 被动 被动 2 1 0 7

1 主动 主动 被动 被动 被动 被动 5 2 0 7

2 被动 主动 主动 被动 被动 被动 1 3 0 7

3 被动 被动 主动 主动 被动 被动 2 4 0 7

4 被动 被动 被动 主动 主动 被动 3 5 0 7

5 被动 被动 被动 被动 主动 主动 4 6 0 7

6 主动 被动 被动 被动 被动 主动 5 1 0 7

7 被动 主动 被动 主动 被动 主动 2 1 0 7

(2 ) 通过寄存器 CC6MSEL 的位 NMCS,由软件控制状态的变换。当位 NMCS =“1”

时 ,允许由软件控制状态的变换 ,禁止在 T12 溢出时产生变换。

注意 : 主动状态和被动状态实际的逻辑电平在寄存器 CC6CON 中定义。

在 4 相、5 相和 6 相多通道 PWM模式中 ,所有输出信号可以在主动相期间用定时器

T12 和定时器 T13 进行调制。

3 .块交换方式

块交换方式是多通道模式的一种特殊情况 ,其相位序列不是由内部控制 ,而是由 3 个

输入信号 ( CC6POS2~0 )来控制。6 个输出信号的状态由当时的输入信号形式决定。表

5-22 概括了可能的组合方式。

在块交换方式中 , CAPCOM 通道 0 被自动配置为捕获模式。输入端 CC6POS2~0

上任何信号的跳变都会产生一个 CAPCOM 通道 0 的捕获脉冲。这些值可用来测量驱动

第 5 章 定时器及捕获/ 比较器

Page 275: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

264

电机的转速。

注意 : 不可能通过 T12 对主动相进行调制 ,但可以通过 T13 对 COU T6x 进行脉冲

宽度调制。

表 5-22 块交换方式时序表

块交换方式

(BCM )

控制输入

CC6POS . . .

0 1 2

输出电平定义

CC60 CC61 CC62 COUT60 COU T61 COU T62

左转

1 0 1 被动 被动 主动 主动 被动 被动

1 0 0 被动 主动 被动 主动 被动 被动

1 1 0 被动 主动 被动 被动 被动 主动

0 1 0 主动 被动 被动 被动 被动 主动

0 1 1 主动 被动 被动 被动 主动 被动

0 0 1 被动 被动 主动 被动 主动 被动

右转

1 1 0 主动 被动 被动 被动 主动 被动

1 0 0 主动 被动 被动 被动 被动 主动

1 0 1 被动 主动 被动 被动 被动 主动

0 0 1 被动 主动 被动 主动 被动 被动

0 1 1 被动 被动 主动 主动 被动 被动

0 1 0 被动 被动 主动 被动 主动 被动

左转①

右转

0 0 0 被动 被动 被动 被动 被动 被动

1 1 1 被动 被动 被动 被动 被动 被动

慢速 X X X 被动 被动 被动 主动 主动 主动

休闲② X X X 被动 被动 被动 被动 被动 被动

① 在左转或右转的模式时 ,若检测到这两个输入信号组合中的一个 ,位 BCE RR 置“1”,并将产生一个应急中断

(如已使能 )。当遇到这样的 (错误 )状态时 , C164CI 会立刻进入空闲状态。

② 当检测到“错误跟随”信号 (即 BCEN =“1”)或非法的输入形式 (见注① )时 , C164CI 进入空闲状态。进入空

闲状态后 , BCE RR 标志一直置位。只有当 BCE RR 标志被软件清除时 ,才能退出空闲状态。

5 .5 .4 工作寄存器

为了控制两个比较定时器产生最多 7 个输出信号 ,并为实现多通道操作对子模块进

行组合 , CAPCOM6 寄存器组提供了一定数量的控制、数据和状态位。

表 5-23 中列出了所用的寄存器。下面将对控制寄存器进行详细的描述 ,对数据寄存

器 (如周期寄存器和比较寄存器 )不作详细介绍。请注意定时器寄存器 ( T12 , T13 )不能直

接存取。

亿恒 C164CI 16 位单片机

Page 276: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

265

表 5-23 CAPCOM6寄存器摘要

名 称 说 明 地 址 读

T12P 定时器 T12周期寄存器 F030 H/ 18 H 锁存器

T12OF 定时器 T12偏移量寄存器 F034 H/ 1AH 锁存器

T13P 定时器 T13偏移量寄存器 F032 H/ 19 H 锁存器

CPM13 比较通道的比较寄存器 FE36 H/ 1BH 锁存器

CC60 捕获/ 比较通道 0 的比较寄存器 FE30 H/ 18 H 寄存器

CC61 捕获/ 比较通道 1 的比较寄存器 FE32 H/ 19 H 寄存器

CC62 捕获/ 比较通道 2 的比较寄存器 FE34 H/ 1AH 寄存器

CTCON 比较定时器控制寄存器 FF30 H/ 98 H 寄存器

TRCON 陷阱使能寄存器 FF34 H/ 9 AH 寄存器

CC6MCON CAPCOM6 模式控制寄存器 FF32 H/ 99 H 寄存器

CC6MSEL CAPCOM6 模式选择寄存器 F036 H/ 1BH 寄存器

CC6MIC CAPCOM6 中断控制寄存器 FF36 H/ 9BH 寄存器

注意 : 当读这些寄存器时 ,在“读”的一栏中指明是访问寄存器本身 ,还是访问其影像

锁存器 (见下面的详细描述 )。

另外还有 4 个中断节点控制寄存器和 CAPCOM6 单元有关 ,但它们不属于此模块。

1 .用于同步更新的影像锁存器

定时器周期、偏移量和比较值是写到影像锁存器 ,而不是实际的寄存器。因此 ,对一

个新的输出信号的值进行编程时 ,可以不影响当前产生的信号。从锁存器到寄存器传送

的使能 ,用对寄存器 CTCON 中相应的影像锁存器传送使能位 STEx 置位来实现。

如果传送已使能 ,则当定时器的值达到“零”时 (在边缘对齐模式中是正在清零 ,而在

中心对齐模式中是从“1”减到“0”) ,下一次计数时将把影像锁存器的内容复制到相应的寄

存器。

当定时器 T12 工作在中心对齐模式时 ,若达到当前设置的周期值 (加计数 ) , 也会同

样复制锁存器的内容 (如果已使能 )。

传送结束后 ,相应的位 STEx 自动清零。

注意 : 复位后第一次启动定时器 T12 时 , 影像锁存器自动进行传送。对于定时器

T13 ,第一次启动时同样也要求位 ST Ex =“1”。

注意 : 当 T12 正做加计数时 ,如果一个新的比较值写入影像锁存器 ,这个新值必须比

当前的周期值小。否则将检测不到匹配 ,并且输出信号也不会再改变。如果一个比较值

在 T12 做减计数时写入 ,则不受上述条件限制。

第 5 章 定时器及捕获/ 比较器

Page 277: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

266

位 功 能

比较定时器 Tx 输入时钟选择

选择定时器 T12 或 T13 的输入时钟 fTx

CTxCLK fTx = fCPU/ 2< CT xCLK > .

000: fTx = fCPU

. . .

111: fTx = fCPU/ 128

比较定时器 Tx 运行位

CTxR 启动和停止定时器 Tx ( T12 或 T13)

CTxR 与 CTxRES 位一起共同控制 Tx的工作

0 : 定时器 Tx 停止计数。如果 CTxRES =“1”, 定时器 Tx 清零 ,并且比较输出设置到空闲状态

1 : 定时器 Tx 从它的当前值开始计数

比较定时器 Tx 复位控制位

0 : 当定时器 Tx 停止时 ,对定时器无影响

CTxRES 1 : 当定时器 Tx停止 , 并且比较输出设置到空闲状态时 ,定时器 Tx 清零

注意 : 对捕获模式 (仅 T12 ) , 当 CT12RES =“1”时 ,一个捕获事件后 ,清除CT12R将破坏存储在捕获寄存器 CC6x中的值 (所有影像寄存器是透明的)

在捕获模式里只留用 CT12RES =“0”

定时器 T12 影像锁存器传送使能位

ST E12

0 : 禁止从影像锁存器到定时器 T12 的周期、比较和偏移量寄存器 ( T12P ,

CC6x , T12OF)的传送

1 : 当 T12到达周期值 (模式 0 )或 0000 H (模式 1)时 , T12 的周期、比较和偏移量寄存器从影像锁存器中装入

注意 : ST E 12 在影像锁存器传送后 ,由硬件清除

紧急陷阱中断允许位

ETRP 0 : 禁止 CAPCOM6 陷阱信号的紧急中断

1 : 允许 CAPCOM6 陷阱信号的紧急中断

T12 操作模式

CT M 0 : 边缘对齐模式 , 加计数

1 : 中心对齐模式 , 加/ 减计数

定时器 T13 影像锁存器传送使能

0 : 禁止从影像锁存器到定时器 T13 的周期、比较寄存器 ( CC62 ,CMPx)的传送

ST E13

1 : 当 T13达到相应的周期值时 ,定时器 T13的周期、比较寄存器从影像锁存器中装入

注意 : ST E13 在影像锁存器传送后 ,由硬件清除

比较定时器 T13 输出使能位

ECT13O

0 : 当 ECT13O 清零 ,且定时器 T13 正在运行时 ,信号 COU T63 输出选取的被

动逻辑电平 (COUT3I)

1 : 当 ETC13O 置位 ,且定时器 T13 正在运行时 ,定时器 T13 输出 COUT63 使能 ,并输出 10 位比较通道的 PWM 信号

定时器 T13 周期标志

CT13P

只要定时器 T13 的内容与定时器 T13 的周期寄存器的内容相匹配 ,周期标志CT13P 置位 ,同时产生中断请求 ,CT13P 由软件清除

亿恒 C164CI 16 位单片机

Page 278: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

267

位 功 能

陷阱允许控制位

偶数位 (0 , 2 , 4)分配给 CC6x比较输出

奇数位 (1 , 3 , 5)分配给 COU T6x 比较输出

TRENx 0 : 比较通道输出 ,提供在陷阱状态的 CAPCOM 输出信号

1 : 比较通道输出 CC6x 或 COU T6x 在陷阱状态的逻辑电平设置为端口输出锁存寄存器的相应位定义的值

注意 : 当写 TRENx 时 ,位 TRF 应该为“0”,否则将产生陷阱状态中断

陷阱标志

TRF 如果陷阱功能允许( TRPEN =“1”) ,且CTRAP变为有效 (低 ) , TRF 由硬件置位

如果已使能 ,当 TRF 置位时 ,产生一个中断。TRF 必须由软件清除

外部CTRAP陷阱功能允许位

TRPEN 0 : 外部陷阱输入CTRAP禁止 (复位后的缺省值 )

1 : 外部陷阱输入CTRAP允许

位 功 能

比较输出 CC6x 初始值( x = 0 ,1 ,2)

CCxI 当比较定时器 T12 没有运行时 ,比较输出 CC6x为 CCxI的值

CCxI表示使能的比较通道的被动输出电平

注意 : 初始值只对允许比较方式操作的捕获/ 比较输出有效

比较输出 COUT6x 初始值 ( x = 0 , 1 ,2 )

COU TxI 当比较定时器 T12 没有运行时 ,比较输出 COU T6x 驱动 COU TxI 的值

COUTxI表示一个使能的比较通道的被动输出电平

注意 : 初始值只对允许比较方式操作的捕获/ 比较输出有效

COUT6x翻转控制位

0 : T13的输出信号直接连接到比较输出

COU TXI COUT6x在突发或多通道模式( x = 0 ,1 ,2)

1 : T13输出信号反转后再连接到比较输出

COUT6x在突发或多通道模式( x = 0 ,1 ,2)

比较输出 COUT63 初始值

COU T3I 定义定时器 T13 第一次开始之前 ,输出 COU T63 的初始逻辑状态

当位 ECT13O 为零时 (COUT63 禁止 ) , COU T3I定义 COUT63 的逻辑状态

第 5 章 定时器及捕获/ 比较器

Page 279: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

268

续表

位 功 能

多通道 PWM 模式输出样式选择

用来选择全部多通道模式 PWM 输出信号样式 (同时参照 MPWM )

BCM 00: 空闲模式

01: 右转模式

10: 左转模式

11: 减速模式

块交换使能位

0 : 16位捕获/ 比较通道的多通道 PWM 模式(由位域 MPWM 选择 )禁止

BCEN 1 : 多通道 PWM 模式允许

注意 : 位 BCEN 置位前 ,通过写寄存器 CC6MSEL ,全部要求 PWM 的比较输出将被编程到比较输出方式工作

块交换模式错误标志

0 : 没有错误情况

BCERR 1 : 在右转或左转模式里出现一个错误条件

在CC6POSx 一次跳变后 ,所有的CC6POSx输入均为高或低电平 , 当出现一个“错误跟随”条件时(见位 BCEM 的说明 ) ,如果块交换中断允许 ( EBCE =“1”) ,将产生一个 CAPCOM6 紧急中断。BCERR必须由软件清除

块交换方式错误中断使能位

EBCE 0 : 块交换方式错误 ,不产生中断

1 : 对一个块交换方式错误 ,激活紧急中断

参考 BCERR 和 BCEM 的描述

多通道 PWM 模式选择

在全部多通道 PWM 模式里 ,用以选择输出信号样式 (参见位域 BCM )

MPWM 00: 3相块交换方式

01: 4相多通道 PWM 方式

10: 5相多通道 PWM 方式

11: 6相多通道 PWM 方式

机器极性 (仅在多通道 PWM 模式里有效)

BCMP

0 : 在多通道 PWM 模式的主动相期间 ,仅 COU T6x 输出被切换到定时器 T13

的输出信号。对此功能 , CMSELx3必须置位

1 : 在多通道 PWM 模式的主动相期间 ,所有使能的比较输出 COUT6x 和 CC6x

均切换到定时器 T13 的输出信号

错误模式选择位 (只在块交换方式中有效 )

BCEM 0 : 一个“错误跟随”条件不报错误

1 : 如果 EBCE置位 ,在右转或左转方式中 ,一个“错误跟随”条件使 BCERR标志置位

亿恒 C164CI 16 位单片机

Page 280: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

269

位 功 能

捕获/ 比较模式选择

这些位域选择 16 位捕获/ 比较通道的工作模式 ,并配置输入输出引脚 ,各个通道可以分别编程为比较或捕获方式

000 : 比较输出禁止 ,CC6x/ COUT6x 可以用作 I/ O

001 : 比较输出 ,引脚 CC6x ,COUT6x能够用于 I/ O

CMSELx 010 : 比较输出 ,引脚 COU T6x , CC6x能够用于 I/ O

011 : 比较输出 ,引脚 COU T6x和 CC6x

100 : 捕获模式 ,不由 CC6x触发 ,COUT6x为 I/ O

101 : 捕获模式 ,由引脚 CC6x 的上升沿触发 , COU T6x 为 I/ O

110 : 捕获模式 ,由引脚 CC6x 的下降沿触发 , COU T6x 为 I/ O

111 : 捕获模式 ,由引脚 CC6x 的任何跳变沿触发 , COU T6x 为 I/ O

比较方式 COUT6x 由定时器 T13 控制

CMSELx3

这些位决定了在它的主动相期间 (由寄存器 CC6MCOM 定义 ) , 输出 COU T6x

是否由 10位比较通道的输出信号来调制 ,典型的调制信号是一个频率更高的信号

0 : COU T6x输出主动电平

1 : COU T6x由 10 位比较通道的输出信号调制

下一个多通道 PWM 状态 (ESMC =“1”时有效 )

NMCS 0 : 空闲

1 : 选择在 4/ 5/ 6 相多通道 PWM 模式中下一个跟随状态

NMCS置位后 ,由硬件在下一个时钟周期清零

软件控制的多通道 PWM 模式使能

ESMC 在 4/ 5/ 6 相多通道 PWM 模式中定义跟随状态选择

0 : 跟随状态选择由比较定时器 T12 控制

1 : 跟随状态选择由位 NMCS 控制(软件控制 )

注意 : 复位后首次对多通道 PWM 模式初始化时 , 必须对 CC6MCON 写两次 ,第一

次是对 BCEN 清零 , 所有其他位按要求进行置位和清零 (对空闲模式 , BCM 必须为

“00”)。跟着进行第二次写 , CC6MCON 各位的形式和第一次相同 ,但是对 BCEN 置位。

在第二次写后 ,可以用对寄存器 C TCON 中的位 CT12R 置位启动定时器 , 然后 BCM 可

以设置为除空闲模式外的其他模式。

位 功 能

捕获/ 比较上升沿中断允许

CCnREN 0 : 禁止上升沿中断

1 : 允许由 CCxR 请求标志产生的中断

第 5 章 定时器及捕获/ 比较器

Page 281: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

270

续表

位 功 能

捕获/ 比较下降沿中断允许

CCxFEN 0 : 禁止下降沿中断

1 : 允许由 CCxF 请求标志产生的中断

定时器 T12计数方向改变中断允许

ECTC 0 : 禁止计数方向改变中断

1 : 允许由 CT12FC 请求标志产生的中断

允许定时器 T12 周期中断

ECTP 0 : 禁止周期中断

1 : 允许由 CT12FP 请求标志产生的中断

捕获/ 比较上升沿中断标志

0 : 空闲

CCxR 1 : 中断请求标志的置位发生

捕获模式 , 对应 CC6x 输入引脚的上升沿

比较模式 , 加计数时 , T12 和比较寄存器 CC6x匹配 (在定时器 T12 的边缘对齐模式和中心对齐模式中 )

捕获/ 比较下降沿中断标志

0 : 空闲

CCxF 1 : 中断请求标志的置位发生

捕获模式 , 对应 CC6x 输入引脚的下降沿

比较模式 , 减计数时 , T12 和比较寄存器 CC6x 匹配(仅在定时器 T12 的中心对

齐模式中 )

定时器 T12计数方向改变标志

CT12FC 0 : 空闲

1 : 在 T12(中心对齐模式 ,减计数 )计数为 0000 H ,且改变为向上计数时 ,产生一

个中断请求。边缘对齐模式无效

定时器 T12周期标志

CT12FP 0 : 空闲

1 : 在 T12 值与周期值匹配时 ,产生一个中断

注意 : 寄存器 CC6MIC 的所有 CAPCOM6 中断请求位必须由软件清零。

5 .5 .5 中断结构和陷阱功能

1 .中断结构

图 5-43 总结了 CAPCOM6 的中断源、相关状态和控制标志 ,并显示出了与之相关的

4 个 CAPCOM6 中断节点。

亿恒 C164CI 16 位单片机

Page 282: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

271

图 5-43 CAPCOM6 中断结构

4 个中断节点控制寄存器的组成如下。

第 5 章 定时器及捕获/ 比较器

Page 283: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

272

注意 : 对控制域的详细说明 ,请参看一般中断控制寄存器的说明。

2 .陷阱功能

陷阱功能提供了非常有效的手段来保护连接在 CAPCOM6 输出线上的外部电路。

陷阱功能由寄存器 T RCON 控制 ,由输入信号C TRA P触发。输入CT RAP的触发功能可

以整体使能或禁止 , 而陷阱功能可以分别应用于各个捕获/ 比较通道 ( CC6x 和

COU T6x)。图 5-44 给出了边缘对齐模式和中心对齐模式中陷阱状态的例子。

参考点 1) : 输入信号C T RA P有效 ,各个输出立即切换到各自的陷阱电平。

参考点 2) : 输入信号C T RA P无效 ,各个输出与新的定时器周期同步切换到各自的编程电平。

安全的陷阱状态在陷阱状态期间选择 T 13 调制的 CC6x 和 COU T6 x 的输出不再受 T13的输出信号调制 ,而是取其各自的初值。

图 5-44 陷阱功能

当CTRA P变为有效时 ,进入陷阱状态。不需要任何 CPU 操作 ,所选择的输出信号会

立刻变换到其相应的陷阱电平 (由端口锁存器定义 ) , 陷阱标志 (寄存器 T RCON 中的

亿恒 C164CI 16 位单片机

Page 284: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

273

T RF)置位 ,向软件发出该事件的信号。如果寄存器 CT CON 中的位 CT12RES 置位 ,则

定时器 T12 因发生陷阱事件而被清零 , 否则将继续计数。输出信号将不再产生任何

跳变。

在采样到输入信号CTRA P无效后 ,在 T12 达到值 0000 H 时 ,退出陷阱状态。通过这

段“延时”对陷阱事件同步后 ,自动恢复输出由程序设定的信号。

注意 : 在块交换方式中 ,当定时器 T13 (不是 T12 )达到 0000 H 时 ,退出陷阱状态。

第 5 章 定时器及捕获/ 比较器

Page 285: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

串行 I/O口

6 .1 异步/同步串行接口

6 .1 .1 概述

异步/ 同步串行接口 ( ASC0 )提供 C164CI 与其他单片机、微处理器和外部设备之间

的串行通信。

ASC0支持全双工的异步通信 ,速率高达 625 千波特 ,半双工的异步通信速率可以高

达 2 .5 兆波特 (20MHz CP U 时钟 )。在同步模式下 ,数据的发送和接收都与 C164CI产生

的移位时钟同步。在异步模式下 ,数据可选 8 位或者 9 位 ,奇偶校验与否和停止位的个数

也是可选的。C164CI 提供奇偶校验错误、帧错误和溢出错误检测来保证数据传输的安全

性。数据的发送和接收采用双缓冲。对于多机通信 ,它包含一种区分数据和地址的机制。

测试由循环反馈 ( loop-back)选项支持。ASC0 由一个 13 位的波特率发生器提供一个独

立的串行时钟信号。图 6-1 示出了与 ASC0 相关的 SFR 和端口引脚。

图 6-1 与 ASC0相关的 SFR和端口引脚

Page 286: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

275

串行口 ASC0 的工作方式由可位寻址的控制寄存器 S0CON 来控制。这个寄存器包

含方式控制位、错误检测选择和错误鉴别的状态标志。

位 功 能

ASC0 方式控制

000 : 8 位数据 同步工作方式

001 : 8 位数据 异步工作方式

010 : 保留。不要选择此组合

S0M 011 : 7 位数据 + 奇偶校验位 异步工作方式

100 : 9 位数据 异步工作方式

101 : 8 位数据 + 唤醒位 异步工作方式

110 : 保留。不要选择此组合

111 : 8 位数据 + 奇偶校验位 异步工作方式

停止位个数选择 异步工作方式

S0ST P 0 : 1 个停止位

1 : 2 个停止位

接收使能位

S0REN 0 : 禁止接收

1 : 允许接收 (在同步方式下 ,接收一个字节后由硬件复位)

奇偶校验使能位 异步工作方式

S0PEN 0 : 不作奇偶校验

1 : 检测奇偶校验错误

帧校验使能位 异步工作方式

S0FEN 0 : 忽略帧错误

1 : 检测帧错误

溢出检查使能位

S0OEN 0 : 忽略溢出错误

1 : 检测溢出错误

S0PE奇偶校验错误标志

当检测到奇偶校验错误时由硬件置位 ( S0PEN =“1”)。必须由软件复位

S0FE帧错误标志

当检测到帧错误时由硬件置位 ( S0FEN =“1”)。必须由软件复位

S0OE溢出错误标志

当检测到溢出错误时由硬件置位 ( S0OEN =“1”)。必须由软件复位

奇偶校验选择位

S0ODD 0 : 偶校验 (当数据中有奇数个“1”时校验位置位)

1 : 奇校验 (当数据中有偶数个“1”时校验位置位)

第 6 章 串行 I/ O口

Page 287: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

276

续表

位 功 能

波特率选择位

S0BRS 0 : 时钟分频采用重装载值加常数进行 (与工作方式有关 )

1 : 将串行时钟降低至 2/ 3

循环反馈方式选择位

S0LB 0 : 标准的发送/ 接收方式

1 : 循环反馈方式

波特率生成器启动位

S0R 0 : 波特率生成器禁止 ( ASC0 不工作 )

1 : 波特率生成器允许

对发送缓冲器 S0 TBU F 写入 ,启动一次传送 (通过指令或者是 PEC 数据传送 )。仅

仅是由所选的工作方式决定的数据位个数才作实际的传送 ,如写到寄存器 S0TBU F的第

9~15 位总是丢掉的。当一次传送结束以后 ,发送缓冲区寄存器都被清除到 0000 H。

数据发送是双缓冲的 ,因此在前一个字符发送结束之前 ,可以往发送缓冲器寄存器中

写入一个新的字符。这样可以将字符一个接一个无间隙地发送出去。

数据接收由接收使能位 S0R EN 控制。当一个字符的接收完成以后 ,接收的数据和

接收的奇偶校验位 (如果选取的话 )可以从只读的接收缓冲器 S0RBU F 读出。S0RBU F

的高字节在所选工作方式下是无效的 ,并且读出来也是为零。

数据接收是双缓冲的 ,因此在前一个字符从接收缓冲寄存器读出之前 ,可能已经开始

了另一个字节的接收。在所有的模式下 ,接收缓冲器的溢出错误可以通过位 S0OEN 检

测。当开启溢出错误检测后 ,如果接收缓冲寄存器在第二个字符接收完成的时候还没有

被读出 ,溢出错误状态标志 S0OE和错误中断请求标志 S0EIR 将被置位。在接收缓冲器

中的前一个接收到的字符将被覆盖。

循环反馈选项 (由 S0LB 位选择 )允许当前发送出去的数据再接收回到接收缓冲器

中。它常用在串行通信的早期测试中 ,而不必再提供一个外部的网络。在循环反馈方式

中 ,不必用到 P3 口的替换输入/ 输出功能。

注意 : 只有当波特率生成器启动位 S0R 置为“1”时 ,才能进行串行数据的发送和接

收。否则串行口一直处于空闲方式。

不要将寄存器 S0CON中的方式控制域 S0M 设置为保留方式 ,以避免串行口出现不

可预料的操作。

6 .1 .2 异步通信工作方式

图 6-2 示出了异步工作方式串行通道的组成方框图。

异步工作方式支持全双工通信 ,此时发送器和接收器使用相同的数据帧结构和相同

的波特率。数据由引脚 TxD0/ P3 .10 发送 ,由引脚 RxD0/ P3 .11 接收。这些信号使用 P3

口引脚的替换功能。

亿恒 C164CI 16 位单片机

Page 288: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

277

图 6-2 串行通道的异步工作方式

1 .异步数据帧

图 6-3 示出了异步工作的 8 位数据帧的组成。

8 位数据帧可以包含 8 个数据位 D7~D0(S0M =“001B”) ;或 7 个数据位 D6~D0,再

加上自动生成的奇偶校验位 (S0M =“011B”)。奇偶校验可以是奇校验或者是偶校验 ,取

决于寄存器 S0CON中的位 S0ODD。如果 7 位数据的模 2 和为“1”,偶校验时 ,对校验位

置位 ;奇校验时 ,将校验位清零。奇偶校验可以通过位 S0PEN 使能 (通常在 8 位数据方式

下是关掉的 )。奇偶校验错误标志 S0PE将与错误中断请求标志位一起置位 ,如果接收到

错的奇偶校验位 ,奇偶校验位本身将存到 S0RBUF .7。

图 6-3 异步工作的 8 位数据帧

9 位数据帧可以是包含 9 位数据 D8~D0 ( S0M =“100B”) ;也可以是 8 位数据 D7~

第 6 章 串行 I/ O口

Page 289: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

278

D0 ,加上自动生成的奇偶校验位 ( S0M =“111B”) ;或是 8 位数据 D7~D0 ,加上一个唤醒

位 (S0M =“101B”)。奇偶校验工作情况和 8 位数据帧相同 ,但如果接收到错的奇偶校验

位 ,奇偶校验位本身将被存在 S0RBUF .8。

在唤醒方式下 ,如果第 9 位 (唤醒位 )为“1”,所接收到的帧只传送到接收缓冲寄存器。

如果这一位为“0”,将不会激活接收中断请求 ,也不传送数据。这一特性可以用来控制多

处理器系统中的通信。

当主处理器要传送一块数据到几个从处理器中的一个时 ,它首先发送一个地址字节

来鉴别目标从机。地址字节与数据字节的区别在于额外的第 9 位 ,地址字节的第 9 位为

“1”,而数据字节的第 9 位为“0”,因此不会发生从处理器被一个数据字节中断的情况。但

地址字节将中断所有的从处理器 (以 8 位数据 +唤醒位方式工作时 ) ,因此 ,每一个从处理

器都能检查所收到字符的低 8 位地址。被选中的从处理器将转换到 9 位数据方式 (清除

S0M .0) ,这样可以使它能接收后面即将到来的数据字节 (唤醒位已清零 )。未选中的从处

理器仍然停留在 8 位数据 +唤醒位方式 ,并忽略掉后面的数据字节 ,如图 6-4 所示。

图 6-4 异步工作的 9 位数据帧

2 .异步发送

当 S0R 已置位 ,且数据也加载到发送缓冲器 S0TBU F中时 ,将在 16 分频的计数器下

一次溢出时开始发送 (见图 6-2)。发送数据帧包括如下 3 个基本的部分 :

� 起始位。

� 数据区 (8 位或者 9 位 ,先是最低位 ,包含奇偶校验位 ,如果选择了的话 )。

� 分隔符 (1 个或者是 2 个停止位 )。

数据发送是双缓冲的。当发送器是空闲的时候 ,装载到 S0 TBU F 中的发送数据将立

即转送到发送移位寄存器。于是 S0 TBU F可以空出来用于发送下一个数据 ,这种情况用

发送缓冲器中断请求标志 S0 TBIR 置位来表示。在继续前一个数据发送的同时 ,可以往

S0 TBUF 中写入下一个数据。

发送中断请求标志 S0 TIR 将在一帧的最后一位发送以前置位 ,即在第 1 个或第 2 个

停止位被移到发送移位寄存器之前。

发送输出引脚 TxD0/ P3 .10 必须设置为数据输出 ,即 P3 .10 =“1”,且 DP3 .10 =“1”。

3 .异步接收

如果位 S0R 和 S0REN 都置位 ,异步接收由引脚 RxD0 的下降沿启动。数据接收时 ,

将以所选波特率的 16 倍对引脚 RxD0 进行采样。这一位的有效值主要取决于第 7 , 8 和 9

亿恒 C164CI 16 位单片机

Page 290: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

279

次采样值 ,这样可避免由噪声所造成的错误。

当对起始位进行检测时 ,如果检测到的不是“0”, 接收电路将被复位 , 并等待引脚

RxD0 上的下一个下降沿。如果起始位是有效的 ,那么接收电路就继续采样 ,并将到来的

数据帧移入接收移位寄存器。当接收到最后的停止位后 ,接收移位寄存器的内容将被传

送到接收数据缓冲器 S0RBUF。同时 ,在最后的停止位第 9 个取样发生时刻 ,不管是否已

接收到有效的停止位 ,将接收中断请求标志位 S0RIR 置位。接收电路将等着接收数据输

入引脚下一个起始位 (下降沿 )。

接收输入引脚 RxD0/ P3 .11 必须设为输入 ,即 DP3 .11 =“0”。可以用对位 S0REN

清零来停止异步接收 ,包括生成接收中断请求和错误中断请求。当前接收的帧结束后 ,将

不再识别下一帧的起始位。

注意 : 在唤醒工作方式下 ,如果第 9 位 (唤醒位 )为“1”,只将接收到的帧传送到接收

缓冲寄存器 ;如果这一位为“0”,将不能激活接收中断请求 ,也无数据传送。

6 .1 .3 同步通信工作方式

同步工作方式支持半双工通信 ,通过移位寄存器用作简单的 I/ O口的扩展。通过引

脚 RxD0/ P3 .11 发送和接收数据 ,同时通过引脚 RxD0/ P 3 .11 输出移位时钟。这些信号

都是 POR T3 引脚的替换功能。同步方式由 S0M =“000B”来选择。

8 位数据与移位时钟同步发送或接收 ,移位时钟由内部的波特率生成器产生 ,移位时

钟只在数据位发送或接收时才有效。

图 6-5 示出了串行通道 ASC0 的同步工作方式组成方框图。

1 .同步发送

若位 S0R 置位 ,且 S0REN =“0”(半双工 ,无接收 ) ,在数据装载到 S0 TBUF 后 4 个状

态时间内开始发送。数据发送是双缓冲的。当发送器是空闲的时候 ,装载到 S0 TBU F 中

的发送数据将立即移到发送移位寄存器 , 于是 S0TBU F 可以空出来用于发送下一个数

据 ,这种情况用发送缓冲器中断请求标志 S0 TBIR 置位来表示。在继续前一个数据发送

的同时 ,可以往 S0TBU F中写入下一个数据。数据将与移位时钟同步发送出去。在第 8

位数据发送后 ,引脚 T xD0 和 RxD0 都将变为高电平 ,发送中断请求标志 S0TIR 置位 ,串

行数据发送结束。

引脚 TxD0/ P3 .10 必须设置为替换数据输出 ,即 P3 .10 =“1”,并且 DP3 .10 =“1”。

为了提供移位时钟 ,在发送期间 ,引脚 RxD0/ P3 .11 必须设置为替换输出 ( P3 .11 =“1”,

且 DP3 .11 =“1”)。

2 .同步接收

位 S0R EN 设置为“1”时 ,启动接收。如果位 S0R 为“1”,加载到引脚 RxD0 上的数据

将移入接收移位寄存器 ,并且与引脚 T xD0 上输出的时钟同步。在第 8 位数据移入后 ,接

收移位寄存器的内容被传送到数据接收缓冲器 S0RBU F,接收中断请求标志 S0RIR 将置

第 6 章 串行 I/ O口

Page 291: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

280

图 6-5 串行通道 ASC0 的同步工作方式

位 ,接收允许位 S0REN 清零 ,串行数据接收停止。

为了提供移位时钟 ,引脚 RxD0/ P3 .10 必须设置为替换数据输出 ,即 P3 .10 =“1”,

并且 DP3 .10 =“1”。引脚 TxD0/ P3 .11 必须设置为替换数据输入 (DP3 .11 =“0”)。

如果对位 S0REN 清零 ,同步接收将停止。当前的字节会接收完 ,同时产生接收中断

请求和错误中断请求 (如果有的话 )。在接收的同时对发送缓冲器写入 ,不会对接收产生

任何影响 ,也不会开始发送。

如果启动溢出检测位 S0OEN ,当下一个数据接收完成时 ,若前一个接收的数据还没

有从接收缓冲寄存器读出 ,则错误中断请求标志 S0EIR 和溢出错误状态标志 S0OE 将

置位。

6 .1 .4 硬件错误检测能力

为了串行数据传输的安全 ,串行通道 ASC0 提供了错误中断请求标志 ,用来表明出现

了错误。寄存器 S0CON中有 3 个可选的错误状态标志 ,它标志在接收过程出了错。在

接收结束的时候 ,只要遇到下面一个或多个情况 ,错误中断请求标志 S0EIR 将会与接收

中断请求标志 S0RIR 同时置位。

亿恒 C164CI 16 位单片机

Page 292: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

281

� 如果帧错误检测使能位 S0FEN 置位 ,且任何一个停止位如果不是高电平 ,则帧错

误标志 S0FE 置位 , 表示这个错误中断请求是由于帧错误引起的 (仅适用于异步工作

方式 )。

� 如果奇偶校验检测使能位 S0PEN 置位 ,这时接收奇偶校验位。若证实收到的数

据奇偶校验是错误的 ,则将奇偶校验错误标志 S0PE置位 ,表示错误中断请求是由于奇偶

校验错误引起的 (仅适用于异步工作方式 )。

� 如果溢出错误检测使能位 S0OEN 置位 ,且在一个新帧接收完成时 ,前一个接收到

的数据没有从接收缓冲器中读出或进行 PEC 传送 ,溢出错误标志 S0OE 置位 ,表明错误

中断请求是由于溢出错误引起的 (适用于异步和同步工作方式 )。

6 .1 .5 ASC0波特率生成器

串行通道 ASC0 有自己专用的 13 位波特率生成器 ,它具有 13 位重装载的能力 ,这使

波特率生成器独立于 GPT 时钟。

波特率生成器的时钟为 CP U 时钟的 1/ 2 ,即 fCP U/ 2。这个计数器进行减计数 ,并且

可以通过寄存器 S0CON中的波特率生成器启动位 S0R 来控制它的启动和停止。定时器

的每一次下溢为串行通道提供一个时钟脉冲。这个定时器在每次下溢的时候 ,可以重装

存储在 13 位重装载寄存器中的值。根据工作方式和波特率选择位 S0BRS, 对得到的时

钟脉冲再次分频 ,如果位 S0BRS =“1”,则时钟信号再次进行 2/ 3 次分频 (见下面公式和

表 6-2 )。所以 ASC0 的波特率由 CP U 的时钟、重装载值、位 S0BRS 的值和工作方式 (同

步还是异步 )决定。

寄存器 S0BG具有双重功能 ,可用作波特率生成器和重装载寄存器。读 S0BG 时 ,返

回的是定时器的内容 ( 15~ 13 位返回为“0”) ;写 S0BG 时 , 将更改重装载寄存器的值

(15~13 位的值无意义 )。

每次对 S0BG进行写操作后 ,定时器都会自动更新重装载寄存器的内容。然而 ,如果

S0R =“0”时 ,对 S0BG 进行写操作 ,定时器将不会更新 ,直到在 S0R =“1”后的第 1 个指

令周期 ,定时器才更新重装载寄存器的内容。

1 .异步方式的波特率设置

对于异步工作方式 ,波特率生成器提供一个频率为 16 倍所选波特率的时钟。每一个

接收位都在这个时钟的第 7 , 8 和 9 个周期进行采样。串行通道 ASC0 在异步工作方式下

的波特率及其所需的重装载值由如下公式决定 :

BAsync =fCP U

16× (2 + < S0BRS > ) × ( < S0BRL > + 1 )

S0BR L =fCP U

16× (2 + < S0BRS > )× BA sy nc- 1

式中 , < S0BRL >表示重装载寄存器的内容 ,是一个 13 位的无符号整数。

< S0BRS >表示 S0BRS位的值 (“0”或者“1”) ,整数。

第 6 章 串行 I/ O口

Page 293: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

282

20M Hz的 CP U 时钟可以得到的最高波特率为 625 千波特。表 6-1 中列出了通常使

用的各种频率重装载值及与标准波特率的偏差。

表 6-1 ASC0波特率生成

波 特 率S0BRS =“0”, fCPU = 20MHz S0BRS =“1”, fCPU = 20MHz

偏离误差 重装载值 偏离误差 重装载值

625 千波特 ±0 .0% 0000 H - -

19 .2 千波特 + 1 .7% / - 1 .4 % 001FH/ 0020 H + 3 .3 % / - 1 .4 % 0014 H/ 0015 H

9600 波特 + 0 .2% / - 1 .4 % 0040 H/ 0041 H + 1 .0 % / - 1 .4 % 002AH/ 002BH

4800 波特 + 0 .2% / - 0 .6 % 0081 H/ 0082 H + 1 .0 %/ - 0 .2% 0055 H/ 0056 H

2400 波特 + 0 .2% / - 0 .2 % 0103 H/ 0104 H + 0 .4 %/ - 0 .2% 00 ACH/ 00 ADH

1200 波特 + 0 .2% / - 0 .4 % 0207 H/ 0208 H + 0 .1 %/ - 0 .2% 015AH/ 015BH

600波特 + 0 .1% / - 0 .0 % 0410 H/ 0411 H + 0 .1 %/ - 0 .1% 02B5 H/ 02B6 H

75 波特 + 1 .7% 1FFF H + 0 .0 %/ - 0 .0% 15B2 H/ 15B3 H

注意 : 上表中偏差已作了四舍五入。使用波特率晶体 (例如 18 .432M Hz)时将得出

无偏差的波特率。

2 .同步方式的波特率设置

对于同步工作方式 ,波特率生成器可以提供 4 倍于所设置波特率的时钟。此工作方

式下 ,它的波特率由下面的公式来决定 :

BSync =fCP U

4× ( 2 + < S0BRS > )× ( < S0BRL > + 1 )

S0BRL =fCPU

4× (2 + < S0BRS > )× BSy nc- 1

式中 , < S0BRL >表示重装载寄存器的内容 ,是一个 13 位的无符号整数。

< S0BRS >表示 S0BRS位的值 (“0”或者“1”) ,整数。

当 CPU 的时钟为 20MHz时 ,同步工作方式可以提供的最高波特率为 2 .5 兆波特。

6 .1 .6 ASC0中断控制

串行通道 ASC0 有 4 个可位寻址的中断控制寄存器。寄存器 S0 TIC 控制发送中断 ,

S0 TBIC控制发送缓冲器中断 , S0RIC控制接收中断 , S0EIC 控制串行通道 ASC0 的错误

中断。每一个中断源都有自己专用的中断向量 , S0TINT 是发送中断向量 , S0 TBINT 是

发送缓冲器中断向量 , S0RINT 是接收中断向量 , S0EINT 是错误中断向量。错误中断请

求的原因 (帧错误、奇偶校验错误或是溢出错误 )可以由控制寄存器 S0CON 错误状态标

志位来判别。

与错误中断请求标志位 S0EIR 相反 ,错误状态标志位 S0FE/ S0PE/ S0OE 不会因为

亿恒 C164CI 16 位单片机

Page 294: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

283

进入错误中断处理服务程序而自动复位 ,必须由软件清除。

注 : 对控制位域的说明 ,请参见一般的中断控制寄存器的说明。

ASC0 中断使用方法如下。

正常工作时 (除了错误中断之外 ) , ASC0 提供 3 种中断请求来控制通过串行通道的

数据交换过程。

� S0 TBIR 当数据从 S0 TBU F 移到发送移位寄存器中时激活。

� S0 TIR 在发送异步数据帧的最后一位之前激活 ,或者是在同步数据帧最后一位

发送之后再激活。

� S0RIR 当接收到的数据帧被移入到 S0RBU F 时激活。

单个数据发送时 , 仅用发送中断 S0 TIR 就已经足够。这意味着前面装载的数据已

经发送出去了 ,异步帧的最后一位除外。

多个连续数据发送时 ,在前一帧的最后一位发送出去时 ,它必须装载下一段数据。在

异步方式下 ,仅有一位数据的时间提供处理器来响应发送中断请求 ;在同步方式下 ,这是

不可能实现的。

使用发送缓冲器中断 (S0TBIR)来重装发送数据 ,可为中断服务程序提供一个发送一

个完整的帧的时间 ,因为在前一个数据发送的时候 , S0 TBUF 是可以重装数据的。

如图 6-6 所示 , S0 TBIR 是一个用于重装程序的提前触发 ,而 S0 TIR 表示发送完成。

因此 ,用到握手的软件要依靠在数据块结束端的 S0TIR , 以确保所有的数据是发送完

第 6 章 串行 I/ O口

Page 295: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

284

成了。

图 6-6 ASC0 中断产生

6 .1 .7 程序举例

本节给出一个实例 ,用 C164CI 的异步串行通道发送连续的 ASCII 字符到 PC机。

[例 6 .1] 使用定时器 T3 的中断服务程序 ,在每次定时器 T3 下溢时 , 写下一个字

符到异步串行通道发送缓冲器中 ,定时器 T3 每 10ms 将下溢一次 (使用定时器 T4 重装载

定时器 T3)。外部时钟频率为 5MHz , CP U 的时钟频率为 20M Hz。

系统初始化设置 (略 )。

定时器 T3 的初始化 :

定时方式 ,减计数 ,预分频比为 16 ,外部加减控制禁止。

定时器 T3 中断使能 ,中断优先级 ILVL = 3 ,组优先级 GLVEL = 3。

定时器寄存器 : 装 10ms 值 ( 16 进制值 0 x30d4)到 T3 寄存器。

辅助定时器 T4 的初始化 :

重装载方式 ,用定时器 T4 重装载定时器 T3。

定时器寄存器 : 装 10ms 值 ( 16 进制值 0 x30d4)到 T4 寄存器。

串行口 ASC0 的初始化 :

异步工作 ,波特率为 9600 波特 , 8 位数据 , 1 个停止位。

汇编程序清单如下。

main:

CALLA c_ UC, ASC_vInit

CALLA cc_ UC, GT1_vInit

BSE T IEN

RET

ASC_vInit : ;串行口初始化子程序

MOV S0CON, # 011 H ;8 位数据 , 1 个停止位 ,异步工作

亿恒 C164CI 16 位单片机

Page 296: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

285

MOV S0BG, # 040 H ;波特率为 9600 波特

OR P3 , # 0400 H ; P3 .10 口设为发送数据输出

OR DP3 , # 0400 H

AND DP3 , # 0F7FFH ; P3 .11 口设为输入

BSE T S0R ;波特率生成器启动工作

RET

GT1_vInit : ; GP T1 初始化子程序

MOV T3CON, # 081 H ;定时器 T3 取为减计数 ,预分频比为 16

MOV T3 , # 030D4 H ;定时器 T3 运行 10ms 后溢出

MOV T3IC , # 04FH ;设置定时器 T3 的中断

MOV T2CON, # 00 H ;关定时器 T2

MOV T2 , # 00 H

MOV T4CON, # 027 H ;定时器 T3 每次溢出时重装载定时器 T4 中的值

MOV T4, # 030D4 H ;设置定时器 T4 中的重装载值

BSE T T3R ;定时器 T3 启动计数

RET

ASC_vSendDa ta : ;从串行口发送 R8 中的数据

EXTR # 01 H

BCLR S0TBIR ;清除发送缓冲器中断请求标志

MOV S0TBUF , R8 ; R8 的内容加载到发送缓冲器

RET

GT1_viIs rTmr3 : ;定时器 T3 中断服务子程序

⋯⋯

CALLA cc_ UC, ASC_vSendData

RETI

图 6-7 是从串行口发送的信号波形。图中 500kS/ s 表示每秒采样 500000 个样本。

图 6-7 从串行口发送的信号波形

第 6 章 串行 I/ O口

Page 297: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

286

6 .2 高速同步串行接口

6 .2 .1 概述

高速同步串行接口 SSC 可以为 C164CI 和其他单片机、微处理器或者外部设备提供

灵活的高速串行通信。

SSC 支持最高可达 5MHz( 20MHz CP U 时钟 )的全双工和半双工同步通信。串行时

钟信号可以由 SSC 本身产生 (主方式 ) ,也可从外部接收 (从方式 )。数据宽度、移位方向、

时钟极性和时钟的相位都是可编程的。它可以和 SPI 兼容的设备通信。发送和接收数据

都是双缓冲的。一个 16 位的波特率生成器提供 SSC 独立的串行时钟信号。

高速同步串行接口可以灵活地进行配置 ,它可以与其他同步串行接口 (例如同步方式

的 ASC0 )一起使用 ,以主机/ 从机或多主机互连方式工作 ,或与通用 SPI 接口兼容工作。

因此 ,它可以用来与移位寄存器 ( I/ O 扩展 )、外部设备 (例如 EEPROM 等 )或者是其他联

网的控制器通信。SSC 支持半双工和全双工的通信。数据由引脚 M TSR/ P3 .9 (主机发

送/ 从机接收 )和引脚 MRST/ P3 .8 (主机接收/ 从机发送 )发送和接收。时钟信号由引脚

SCLK/ P3 .13 输入和输出。这些引脚都是使用 P3 口的替换功能。

图 6-8 示出了与 SSC 相关的 SFR 和端口引脚。

图 6-8 与 SSC 相关的 SFR 和端口引脚

图 6-9 是同步串行通道 SSC 的方框图。

串行通道 SSC 的工作方式由可位寻址的控制寄存器 SSCCON 控制。这个寄存器有

以下两种格式 :

(1 ) 编程模式 ,在编程期间 (SSC 可由 SSCEN =“0”来禁止 ) ,它提供一组控制位的

访问。

(2 ) 工作模式 ,在工作期间 (SSC可由 SSCEN =“1”来打开 ) ,它提供一组状态标志位

亿恒 C164CI 16 位单片机

Page 298: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

287

图 6-9 同步串行通道 SSC方框图

的访问。

下面列出了在两种模式下寄存器 SSCCON 的组成。

位 功能 (编程模式 , SSCEN =“0”)

SSC数据宽度选择

SSCBM 0: 保留 ,不要选用

1~15: 传送数据宽度为 2~16 位( < SSCBM > + 1 )

SSC顺序控制位

SSCHB 0: 首先发送/ 接收最低位

1: 首先发送/ 接收最高位

SSC时钟相位控制

SSCP H 0: 在时钟的前沿移位发送数据 ,在后沿锁存

1: 在时钟的前沿锁存接收数据 ,在后沿移位数据

SSC时钟极性控制位

SSCPO 0: 空闲时钟线为低 ,时钟前沿为低到高的跳变

1: 空闲时钟线为高 ,时钟后沿位高到低的跳变

SSC发送错误使能位SSCT EN 0: 忽略发送错误

1: 检查发送错误

第 6 章 串行 I/ O口

Page 299: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

288

续表

位 功能 (编程模式 , SSCEN =“0”)

SSC接收错误使能位

SSCREN 0: 忽略接收错误

1: 检查接收错误

SSC相位错误使能位

SSCP EN 0: 忽略相位错误

1: 检查相位错误

SSC波特率错误使能位

SSCBEN 0: 忽略波特率错误

1: 检查波特率错误

SSC自动复位使能位

SSCAREN 0: 出现波特率错误时 ,无附加操作

1: 出现波特率错误时 , SSC自动进行复位

SSC主机选择位

SSCMS 0: 从机方式。用 SCLK 接收到的移位时钟工作

1: 主机方式。产生移位时钟 ,并通过 SCLK 输出

SSCENSSC使能位 =“0”

禁止发送和接收。访问控制位

位 功能(工作模式 , SSCEN =“1”)

SSCBCSSC移位计数器

每移入一位数据 ,移位计数器更新一次。禁止写操作 !

SSCT ESSC发送错误标志位

1: 从机的发送缓冲器没有更新时 ,又开始发送

SSCRESSC接收错误标志位

1: 在接收缓冲器被读出前 ,接收已完成

SSCP ESSC相位错误标志位

1: 在采样时钟沿接收的数据发生变化

SSCBESSC波特率错误标志位

1: 从机实际的波特率与预期的波特率的比不在 2~0 .5之间

SSCBSYSSC忙标志位

当传送正在进行的时候置位。禁止对该位做写操作

SSC主机选择控制位

SSCMS 0: 从机方式。用 SCLK 接收到的移位时钟工作

1: 主机方式。产生移位时钟 ,并通过 SCLK 输出

SSCENSSC使能位 =“1”

允许发送和接收。访问状态标志位和 M/ S 控制

亿恒 C164CI 16 位单片机

Page 300: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

289

注意 : 对 SSCCON的访问目标 (控制位或标志位 )是由访问前 SSCEN 的状态决定

的 ,例如 ,在编程模式下 ( SSCEN =“0”) ,把 C057 H 写到 SSCCON 中 ,将会对 SSC 初始

化 ,然后把它打开 ( SSCEN =“1”)。

当写 SSCCON 的时候 ,需注意保留位应该保持为 0。

SSC 移位寄存器经过引脚控制逻辑同时接到发送引脚和接收引脚 (参见方框图 )。

串行数据的发送和接收都是同步而且是同时发生的 ,例如 ,接收到的位数和发送的位数是

相同的。发送的数据写到发送缓冲器 SSCTB。一旦移位寄存器为空 ,就会把发送缓冲器

中数据移过来。此时 , SSC主机 (SSCMS =“1”)会立即进行发送 ,而 SSC 从机 ( SSCMS =

“0”)则会等待移位时钟。当发送开始后 ,忙标志位 SSCBSY 置位 ,并且会产生一个发送

中断请求 (SSCTIR ) ,表明现在可以对 SSCTB 重新装载。当程序选定的位 ( 2~16 )都已

经发送完以后 ,移位寄存器的内容将传送到接收缓冲区 SSCRB,并且会产生一个接收中

断请求 (SSCRIR)。如果再没有数据需要发送 ( SSC TB 为空 ) , SSCBSY 将会同时清零。

不要用软件去修改 SSCBSY ,因为这个标志位是由硬件控制的。

注意 : 在某个给定的时间 ,只能有一个 SSC 设为主机。

串行数据传送的许多参数可以用程序控制 ,如 :

� 数据的长度可以在 2~16 位之间选择。

� 发送可以从低位或是高位开始。

� 移位时钟空闲时 ,可以是低电平或高电平。

� 数据位可以在时钟信号的上升沿或者是下降沿移位。

� 波特率可以从 152 波特到 5 兆波特范围内设置 (20MHz CP U 时钟 )。

� 移位时钟可以是自己产生的 (主机 ) ,或者是接收到的 (从机 )。

下面介绍其中两个主要参数。

(1 ) 数据宽度选择

发送的帧长度为 2 位“字符”到 16 位“字符”。若从低位 ( SSCHB =“0”)开始发送 ,则

允许与同步工作方式下的 ASC0 或者 8051 单片机的串口进行通信。如果从高位

(SSCHB =“1”)开始发送 ,则可以进行与 SPI 接口兼容的操作。

不管数据宽度取几位 ,也不管是从高位 ( MSB)还是从低位 ( LSB)开始发送 ,发送的数

据都是与寄存器 SSCTB 和 SSCRB 右对齐的 ,发送数据的低位在这些寄存器的第 0 位。

发送时 ,这些数据位将根据内部移位寄存器的逻辑进行重组。SSCTB 中未选用的位将被

忽略 , SSCRB中未选用的位将无效 ,要在接收服务程序中把它去掉。

(2 ) 时钟控制

改变时钟可使 SSC的发送和接收适应各种串行接口。时钟的一个沿 (上升沿或下降

沿 )用来移出发送数据 ,另一个沿用来锁存接收数据。不同的功能用位 SSCP H 进行选

择。位 SSCP O用来选择时钟线空闲状态的电平。对于空闲时为高的时钟 ,前沿为下降

沿 ,即 1 到 0 的跳变。各种组合的工作情况如图 6-10 所示。

第 6 章 串行 I/ O口

Page 301: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

290

图 6-10 串行时钟相位和极性的选择

6 .2 .2 工作情况

1 .全双工方式

不同的设备通过三条线连接起来。这些线的定义通常由主机决定。连接到主机的数

据输出引脚 M TSR 的线是发送线 ,连接到数据输入引脚 MRST 的线是接收线 ,连接到时

钟引脚 SCLK的线是时钟线。仅有编程为主机方式工作的设备才产生串行时钟 ,并从引

脚 SCLK输出。所有的从机都接收这个时钟 ,所以它们的时钟引脚必须转换成输入模式

(DP3 .13 =“0”)。主机移位寄存器的输出连接到外部的发送线 ,它同时连接到从机移位

寄存器的输入。从机移位寄存器的输出连接到外部接收线 ,这样可以使主机接收到移出

从机的数据。这些引脚的功能和方向都取决于各个设备主机或从机的工作状态。

注意 : 图 6-11 中的移位方向对于先发送最高位还是先发送最低位是相同的。

这种配置在初始化时 ,应选择其中一个为主机 ( SSCMS =“1”) ,所有其他的都必须设

置为从机 (SSCMS =“0”)。初始化包括这个设备 SSC 的工作方式和相应引脚的功能。

所有从机的数据输出引脚 MRST 都连接到同一根接收线上。在传送过程中 ,各个从

机都将从各自的移位寄存器中移出数据。有两种方法可以避免接收线上由于来自不同从

机数据所引起的冲突。

(1 ) 只有一个从机驱动接收线

只对一个从机的 MRST 引脚使能 , 所有其他的从机必须用程序控制 , 使它们的

M RST 引脚为输入脚 ,也即只有 MRST 引脚使能的从机可以将数据发送到主机的接收线

上。只有主机可以接收数据。主机选择它希望接收数据的从机 ,这可以通过单独的选择

线或者是向这个从机发送一个特殊的命令来实现。然后 ,被选择的从机将它的 MRST 引

脚设为输出 ,直至接收到一个该机不再被选择的信号或命令。

亿恒 C164CI 16 位单片机

Page 302: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

291

图 6-11 SSC 全双工的配置

(2 ) 从机的 MRST 采用开漏输出

这样可构成“线与”连接。此时 ,接收线需要一个外部上拉器件 ,使所有没有被选为发

送的从机只发送“1”,这样就可避免选中的从机发送到接收线上的数据产生讹误。因为高

电平是通过上拉器件来保持的 ,若无器件驱动这根线 ,选中的设备可以在发送“0”时将它

拉到低电平。主机选择它希望接收数据的从机是通过单独的选择线或向这个从机发送一

个特殊的命令来实现的。

在进行了必要的 SSC 初始化以后 ,串行接口便可打开了。对于主机 ,时钟线将进入

由程序设定的极性。数据线将变成“0”或者“1”,直到第一次数据传送开始。传送结束后 ,

数据线将一直保持在最后一位发送数据的电平上。

当串行接口打开以后 ,主机可将要发送的数据写到寄存器 SSC TB 来开始第一个数

据的发送。这个值将复制到移位寄存器中 (此时假定移位寄存器是空的 ) ,发送数据第一

位将在波特率生成器的下一个时钟送到 MTSR 线上 (只有在 SSCEN =“1”时 ,发送才开

始 )。按照所选择的时钟相位 ,在 SCLK 线上将产生一个时钟脉冲。在相反的时钟沿位

置 ,主机锁存并移入输入线 MRST 上检测到的数据。这样 , 就对发送数据和接收数据

进行了“交换”。由于时钟线连接到所有的从机 ,它们的移位寄存器将与主机的移位寄

存器同步移位 ,移出寄存器中原有的数据 , 移入输入线上检测到的数据。在程序预先

设定的时钟脉冲个数之后 (由数据宽度检测决定 ) ,主机发送的数据已经在所有的从机

移位寄存器中 ,同时主机的移位寄存器保持有选中的从机发送来的数据。此时主机和

所有从机移位寄存器的内容都会复制到接收缓冲器 SSCRB 中 , 同时接收中断标志

SSCRIR 置位。

当发送缓冲区的内容复制到移位寄存器时 ,从机会立即在引脚 M RST 上输出所选

第 6 章 串行 I/ O口

Page 303: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

292

择的第一位 (发送数据的 MSB或者 LSB)。它将不会等待下一个波特率生成器的时钟 ,

就像主机一样。这样做的原因是 ,根据所选择的时钟相位 , 主机产生的第一个时钟沿

可能已经被用来移入第一位数据。因此 ,从机的第一位数据必须在此时有效。

注意 : 在 SSC 上 ,发送和接收通常是同时进行的 ,不管是否存在有效的数据发送或

接收。这一点与 ASC0 的异步接收不同。

在主机上作时钟 SCLK 引脚的初始化设置时 ,需注意避免出现不希望的时钟发送 ,

这可能会干扰其他的接收者。内部可选的输出线的状态在 SSC 禁止时一直都为“ 1”,

这时输出信号是与相应端口输出锁存器相“与”得到的结果。对空闲电平为低

( SSCPO =“0”)的 SSC 使能 ,将驱动数据输出和时钟 SCLK 立即 (通过与 )为低。要避

免这种现象 ,可采用如下的步骤 :

� 选择时钟空闲电平 (SSCPO =“x”)。

� 用要求的时钟空闲电平装载输出锁存器 ( P3 .13 =“ x”)。

� 将引脚转换为输出 (DP3 .13 =“1”)。

� 对 SSC 使能 ( SSCEN =“1”)。

� 如果 SSCPO =“0”,对替换数据输出使能 ( P3 .13 =“1”)。

选择一个从机作发送时 (单独的选择线或是特殊的命令 )所采用的机制 , 同样适用

于主机的角色改由网络中其他设备来担任的情况。在这种情况下 ,以前的主机和将来

的主机 (以前的从机 )必须转换它们的工作方式 (SSCMS) ,且改变它们的引脚方向。

2 .半双工工作方式

半双工工作时 ,发送和接收数据仅需要一条数据线。数据交换的引线既连接到

M TSR ,也连接到每一个设备的 M RST 引脚。时钟线都连接到 SCLK 引脚 (见图

6-12 )。

主机通过产生移位时钟来控制数据发送 ,从机通过接收时钟来发送数据。由于所有

的发送和接收引脚实际上都连接到同一根数据交换线 ,所以串行数据可以在任意的站点

之间传送。

与全双工方式一样 ,有两种方法可以避免数据交换线上的冲突。

(1 ) 只有发送设备可以对它的发送引脚驱动使能。

(2 ) 不发送数据的设备使用开漏输出 ,并且只发送“1”。

由于数据输入输出线都连接在一起 ,发送设备将会在输入引脚上 (对主机是 M RST ,

对从机是 M TSR)移入自己的数据。公共数据交换线上的任何冲突 ,只要用接收到的数

据与发送的数据不一样就可以检测出来。

3 .连续发送

当发送中断请求标志位置位时 ,表明发送缓冲器 SSCTB 已经空闲 ,可以装载下一个

要发送的数据了。如果 SSCTB 在这次发送完成时 , 已经重新装载了新的数据 ,这个数据

将会立即传送到移位寄存器 ,并且毫无延迟地发送出去。在数据线上 ,两个相继的数据帧

亿恒 C164CI 16 位单片机

Page 304: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

293

图 6-12 半双工 SSC的配置

之间没有任何间隙 ,例如 ,两个字节的发送看起来像一个字的发送。这种特性可以用来构

成与那些需要每次传送大于 16 位设备的接口。至于总的数据帧可以为多长 ,这仅仅是

软件的问题。这种选项可以用在同一个串行总线上 ,既有字节宽度又有字宽度设备的

场合。

注意 : 因为连续发送需要快速地对 SSC 禁止/ 使能 ,以对基本的数据宽度重新编程 ,

所以这仅限于多种已选定的基本数据宽度。

4 .端口控制

SSC 使用 P3 口的 3 根引脚来同外面通信。引脚 P3 .13/ SCLK 作为时钟线 ,引脚

P3 .8/ MRST (主机接收/ 从机发送 )和 P3 .9/ MTSR (主机发送/ 从机接收 )作为串行的数

据输入输出线。

这些引脚的工作取决于所选择的工作状态 (主机还是从机 )。为了对这些引脚的替换

输出功能使能 ,以代替一般的 I/ O 操作 , 各个端口的锁存器必须设置为“1”, 因为引脚锁

存器的输出和替换输出线是相“与”的。当不使用替换数据输出线的时候 (功能禁止 ) ,通

过端口锁存器进行 I/ O操作 ,它将保持为高电平。端口线的方向取决于它的操作方式。

当切换工作模式时 , SSC将自动正确地选用替换输入或替换输出功能。但引脚的方向必

须由用户按照表 6-2 来编程。使用开漏输出特性可以避免总线竞争问题 ,减少对硬件握

手和从机选择线的需要。在这种情况下 ,它不必经常切换端口引脚的方向。表 6-2 概括

列出了对不同方式和引脚所需要设置的值。

第 6 章 串行 I/ O口

Page 305: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

294

表 6-2 SSC端口的控制

引脚主 机 方 式 从 机 方 式

功 能 端口锁存 方 向 功 能 端口锁存 方 向

SCLK 串行时钟输出 P3 .13 =“1”DP3 .13 =“1” 串行时钟输入 P3 .13 =“x” DP3 .13 =“0”

MTSR 串行数据输出 P3 .9 =“1” DP3 .9 =“1” 串行数据输入 P3 .9 =“x” DP3 .9 =“0”

MRST 串行数据输入 P3 .8 =“x” DP3 .8 =“0” 串行数据输出 P3 .8 =“1” DP3 .8 =“1”

注意 : 在表 6-2 中 ,“ x”代表实际的值与各种模式无关 ,建议将这些位设置为“1”,这

样它们在主机方式和从机方式之间转换时 ,就会处于正确的状态。

6 .2 .3 波特率生成器

串行通道 SSC 有自己独立的 16 位波特率生成器 , 并且具有 16 位的重装载能力 ,使

它的波特率生成器相对独立于定时器。

波特率生成器的时钟是由 CPU 的时钟二分频得到的 ( fCP U/ 2)。定时器做减计数 ,并

且可以通过寄存器 SSCCON 中的全局控制位 SSCEN 来启动或停止。寄存器 SSCBR 具

有双重功能 ,可用作波特率生成器和重装载寄存器。当 SSC 使能的时候 ,读 SSCBR 得到

的是定时器的内容。当 SSC 禁止的时候 ,读 SSCBR 得到的是程序设置的重装载值。在

这种工作方式时 ,可以把所要的重装载值写到 SSCBR 中。

注意 : 当 SSC 使能时 ,一定不要去写 SSCBR。

下面的公式可以用来计算给定重装载值时的波特率 ,也可以用来计算给定波特率时

所需要的重装载值 :

BSSC =fCP U

2× ( < SSCBR > + 1 )

SSCBR =f CPU

2× BS SC- 1

式中 , < SSCBR >代表重装载寄存器的内容 ,是一个 16 位的无符号整数。

在 CPU 频率为 20MHz时 ,可以得到的最高波特率为 5 兆波特。表 6-3 中列出了一

些可能的波特率 ,及其所需的重装载值和位时间长度。假定 CP U 时钟为 20M Hz。

表 6-3 波特率、重装载值和位时间长度

波 特 率 位 时 间 重 装 载 值

保留使用一个大于零的重装载值 — — 0000 H

5 .0 兆波特 200 ns 0001 H

3 .3 兆波特 300 ns 0002 H

2 .5 兆波特 400 ns 0003 H

2 .0 兆波特 500 ns 0004 H

亿恒 C164CI 16 位单片机

Page 306: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

295

续表

波 特 率 位 时 间 重 装 载 值

1 .0 兆波特 1 μs 0009 H

100 千波特 10 μs 0063 H

10 千波特 100 μs 03E7 H

1 .0 千波特 1 ms 270FH

152 .6 波特 6 .6 ms FFFFH

注 : SSCBR 的值必须大于 0。

6 .2 .4 错误检测

SSC 可以检测出 4 种错误情况 ,包括接收错误、相位错误、发送错误和波特率错误。

接收错误和相位错误在所有模式下都可以检测 ,而发送错误和波特率错误只对从机方式

适用。当检测到一个错误的时候 ,相应的错误标志位置位。当相应的错误使能位置位时 ,

还会对位 SSCEIR 置位 ,产生一个错误中断请求。错误中断处理将会检查错误标志位 ,以

确定产生错误中断的原因。错误标志位是不会自动复位的 (同 SSCEIR 一样 ) ,必须在中

断处理后由软件清除。这样就允许通过中断来处理某些错误情况 ,而对其他的错误可以

通过软件查询解决。

图 6-13 给出了 SSC 错误中断控制的方框图。

图 6-13 SSC错误中断控制

注意 : 错误中断处理必须清除对应 (已使能 ) 的错误标志 ,避免重复的中断请求。

第 6 章 串行 I/ O口

Page 307: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

296

1 .接收错误 (主机或从机方式 )

如果一个新的数据帧接收完成时 , 前一个接收到的数据还没有从接收缓冲寄存器

SSCRB 中读出 ,将检测到这种错误 ,这时会将位 SSCRE 置位。当通过位 SSCREN 打开

中断允许的时候 ,中断请求标志位 SSEIR 也会置位。接收缓冲器 SSCRB 将被覆盖 ,丢失

的数据不可恢复。

2 .相位错误 (主机或从机方式 )

当引脚 MRST (主机方式 )或者 M TSR(从机方式 )的输入数据在以与 CP U 时钟相同

的频率进行采样时 ,如果在时钟信号的锁存沿之前的第一次采样和之后的第二次采样这

个期间采样值发生变化 ,就会检测到相位错误 (参见 6 .2 .1 节中的“时钟控制”)。在这种

情况下 ,错误标志 SSCPE 置位 ,当位 SSCPEN 使能时 ,错误中断请求标志 SSCEIR 也会

置位。

3 .波特率错误 (从机方式 )

如果接收到的时钟偏离程序预设的波特率超过 100% , 即超过波特率的两倍或小于

波特率的 1/ 2 ,都认为是出错了。这种情况下 , SSCBE 置位 ,如果位 SSCBEN 使能 ,同时

对中断请求 SSCEIR 置位。应用这种错误检测能力时 ,要求从机的波特率生成器编程为

与主设备有同样的波特率。这种特性可以检测时钟线上附加或丢失的脉冲 (在一定的

帧内 )。

注意 : 如果错误发生 , 而且 SSCAREN =“1”, SSC 在这种错误情况下将自动复位。

如果检测到太少或者是太多的时钟脉冲 ,将重新初始化 SSC。

4 .发送错误 (从机方式 )

当主机开始一个发送 (移位时钟激活 ) ,但是从机的发送缓冲器 SSCTB 从上次发送

完后没有更新过 ,这时就认为发送出错。此时将错误标志 SSCT E 置位 ,若 SSCTEN 已使

能 ,错误中断请求标志同时置位。如果在发送缓冲器未被更新时开始发送 ,从机将会把移

位寄存器中的“旧”的数据移位输出。通常是上一次发送时接收到的数据。

如果这个从机没有选择发送 ,在半双工方式 (开漏配置 )下 ,可能会导致发送/ 接收数

据线的冲突。因此 ,这种方式要求从机不选择发送数据 ,只能是移出“1”,即它们的发送缓

冲器在发送以前必须装入“FFF F H”。

注意 : 对于推挽输出的从机 ,只要不选择发送数据 ,通常会将其输出驱动器关掉。然

而 ,为了避免发生可能的冲突或错译 ,建议在任何传送之前 ,先对从机的发送缓冲器装载。

6 .2 .5 SSC中断控制

串行通道 SSC 提供 3 个可位寻址的中断控制寄存器。寄存器 SSCTIC 控制发送中

断 ,寄存器 SSCRIC 控制接收中断 ,寄存器 SSCEIC 控制串行通道 SSC 的错误中断。每一

亿恒 C164CI 16 位单片机

Page 308: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

297

个中断源都有各自独立的中断向量。SCTIN T 是发送中断向量 , SCRINT 是接收中断向

量 , SCEINT 是错误中断向量。

错误中断请求的原因 (接收错误、相位错误、波特率错误和发送错误 )可以由控制寄存

器 SSCCON 中的错误状态标志来鉴别。

注意 : 与错误中断请求标志 SSCEIR 相反 ,错误状态标志 SSCxE 在进入错误中断服

务程序时是不会自动清除的 ,必须由软件清除。

第 6 章 串行 I/ O口

Page 309: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

A/D转换器

7 .1 概 述

C164CI 提供一个分辨率为 10 位具有片内采样/ 保持电路的 A/ D转换器 ( ADC)。可

通过多路开关在 8 路模拟输入通道 ( P5 口的替换输入功能 )之间进行选择 ,或是通过软件

控制 (进入固定通道模式 ) ,或是自动 (进入自动扫描模式 )进行控制。ADC 模块能够对温

度变化或过程变化带来的影响自动进行校正。

为满足大多数控制应用的需求 , ADC 有下列各种转换模式 :

� 固定通道单次转换 ,对选定的通道仅产生一次转换。

� 固定通道连续转换 ,对选定的通道重复进行转换。

� 自动扫描单次转换 ,对选定的一组通道中的每一个产生一次转换 (扫描一次 )。

� 自动扫描连续转换 ,对选定的一组通道中的每一个重复扫描转换 (重复扫描 )。

� ADDAT 读等待模式 ,当前一次转换结果读出后 ,自动开始下一次转换。

� 通道插入模式 ,在自动扫描的一个转换中 ,插入一个特定通道的转换。

对 ADC 进行控制和存放转换结果的一组 SFR 和端口引脚 ,如图 7-1 所示。

图 7-1 与 A/ D 转换器有关的 SFR和端口引脚

Page 310: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

299

外部模拟参考电压 VA REF 和 VAG ND是固定的 ,这种单独的供电方式可以减小其他数字

信号带来的干扰。采样时间及转换时间可以通过编程控制。通过模拟源的内阻和外加的

模拟参考电压 ,可对 ADC进行调整。

图 7-2 为 A/ D转换器的方框图。

图 7-2 A/ D 转换器的方框图

7 .2 模式选择和操作

8 个模拟输入通道 AN0~AN7 是 P5 口的替换输入功能。P5 口是惟一的 8 位输入

口 ,可用于模拟输入端 ,也可用于数字输入端。但是对要用于模拟输入的引脚 ,建议通过

P5DIDIS寄存器的设置 ,禁止其数字输入功能 ,只输入模拟信号。这样可以防止不需要

的交叉电流和由于模拟输入信号在 VIL和 VI H之间变化所产生的开关噪声。

A/ D转换器的功能是由可位寻址的 A/ D 转换控制寄存器 ADCON 来控制的 ,通过

一些位域来指定其工作的模拟通道、转换模式 ,并且反映转换器的状态。

位 功 能

ADCH ADC模拟通道输入选择

ADC模式选择

00 : 固定通道 ,单次转换

ADM 01 : 固定通道 ,连续转换

10 : 自动扫描 ,单次转换

11 : 自动扫描 ,连续转换

ADST ADC 启动位

第 7 章 A/ D转换器

Page 311: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

300

续表

位 功 能

ADBSYADC忙标志

ADBSY =“1”: 转换正在进行

ADWR ADC读等待控制

ADCI N ADC通道插入允许

ADCRQ ADC通道插入请求标志

ADSTC ADC采样时间控制*

ADCTC ADC转换时间控制*

* ADST C 和 ADC T C控制转换的时序 ,参考“转换时序的控制”。

由位域 ADCH 指定进行转换的输入通道 (在自动扫描模式里是指定一个转换序列的

第一个通道 )。位域 ADM 选择 A/ D 转换器的工作模式。对位 ADST 置“1”,便启动一次

转换 (或一个转换序列 ) ;清除位 ADST ,可使 A/ D 转换器所进行的某种转换操作停止。

转换正在进行时 ,忙标志位 ADBSY(只读 )将置位。

转换的结果存放在结果寄存器 ADDAT 中 ,插入方式的转换结果存放在 ADDA T2

寄存器中。

注意 : 寄存器 ADDAT 中的位域 CHNR 的内容表示由 ADC指定与转换结果对应的通

道号 ,寄存器 ADDAT 2 中的位域 CHNR的内容表示由 CPU指定被插入的模拟通道号。

位 功 能

ADRES A/ D转换结果 (10 位 )

CHNR 通道号 (3 位 ,标识转换的模拟通道 )

当位 ADST 设为“1”时 ,启动一次转换。忙标志位 ADBSY 将置位 , A/ D 转换器对寄

存器 ADCON 中通道选择位域 ADCH 指定的输入通道进行采样。在转换期间 ,采样电平

将在内部保持。当该通道转换完成时 , 10 位转换结果和通道号一起传送到结果寄存器

ADDAT ,并且对中断请求标志 ADCIR 置位。

当一次转换正在进行时 ,如果位 ADST 通过软件清零 ,则 A/ D 转换器在当前转换

亿恒 C164CI 16 位单片机

Page 312: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

301

(固定通道模式 )或者当前顺序转换 (自动扫描模式 )完成后 ,将停止工作。

当一次转换正在进行时 ,如果位 ADST 置位 ,则立即终止当前的转换 ,并且根据寄存

器 ADCON 指定的参数开始一次新的转换。

注意 : 这里提到的终止和重新开始是在位 ADST 从“0”变到“1”时触发的 ,即 ADST

在置“1”前必须是“0”。

当一次转换进行时 ,模式选择位域 ADM 和通道选择位域 ADCH 可以改变。ADM

将在当前转换完成后起作用 , ADCH 将在当前转换 (固定通道模式 )或者当前转换序列

(自动转换模式 )完成后起作用。

1 .固定通道转换模式

通过对寄存器 ADCON 中的模式选择位域 ADM 的设置 , 可以选择以下模式 :

“00B”为单次转换 ,“01B”为连续转换。通过位 ADST 置“1”启动转换后 , 忙标志位

ADBSY置位 , 由位域 ADC H 指定的通道开始转换。在转换完成后 , 中断请求标志

ADCIR 置位。

在单次转换模式中 ,转换器将自动停止工作 ,并且对位 ADBSY和 ADST 清零。

在连续转换模式中 ,转换器将自动对由位域 ADCH 指定通道开始新的一次转换 ,每

次转换完成后 ,中断请求标志 ADCIR 置位。

若一次转换正在进行中 ,位 ADST 被软件清零 ,转换器将在完成当前的转换后停止

工作 ,并且对位 ADBSY 清零。

2 .自动扫描转换模式

通过对寄存器 ADCON中模式选择位域 ADM 的设置 ,可以选择以下模式 :“10B”为

单次转换 ,“11B”为连续转换。自动扫描模式自动开始一个模拟通道序列的转换 ,这个序

列的第一个通道由位域 ADCH 指定 ,序列的最后一个是通道 0。

ADST 置位后 ,转换开始 ,忙标志位置位 ,对位域 ADCH 指定的通道进行转换。转换完

成后 ,中断请求标志 ADCIR置位 ,并且转换器将自动开始下一个较低通道新的转换。每次

转换完成后 ,中断请求标志 ADCIR都会置位。通道 0 的转换结束后 ,当前转换序列完成。

在单次转换模式中 ,转换器将自动停止工作 ,并且对位 ADBSY和 ADST 清零。

在连续转换模式中 ,转换器将自动执行新一轮转换 ,从位域 ADCH 指定的通道开始

(参见图 7-3)。

若一次转换正在进行中 ,位 ADST 被软件清零 ,则转换器将在完成当前序列 (包含通

道 0)的转换后才停止工作 ,并对 ADBSY清零。

3 . ADDAT读等待模式

在 ADC 的缺省模式下 ,如果前一次的转换结果在新的一次转换完成前尚不能从寄

存器 ADDA T 中读出 ,则前一次的转换结果将丢失 ,因为寄存器 ADDAT 将被新的值重

写 ,并且 A/ D溢出错误中断请求标志 ADEIR 将会置位。

为了避免错误中断 ,特别是为了在连续转换模式时不至于丢失转换结果 , 对寄存器

ADCON 中的位 ADWR 置位 , ADC 能够转移到“ADDAT 读等待模式”。

第 7 章 A/ D转换器

Page 313: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

302

图 7-3 自动扫描转换模式例子

如果在当前转换完成的时刻 ,寄存器 ADDAT 中的值没有被读出 ,就将新的转换结

果存储到一个暂存缓冲器 ,并且暂停下一个转换 (在此期间内 , ADST 和 ADBSY 将保持

原设定 ,但是不能产生转换结束中断信号 )。从寄存器 ADDAT 中读出前一个值以后 ,暂

存缓冲器中的内容被复制到 ADDA T 里 (产生一个 ADCIR 中断 ) ,且暂停的转换重新开

始。这种机制对单次和连续两种转换模式都适用。

注意 : 在标准模式里 ,连续转换是以一个固定的速率 (由转换时间决定 )来执行的。

在“ADDAT 读等待模式”里 ,由于暂停转换 ,可以有延时。但是如果 CPU (或 PEC)不能

够对转换速率保持跟踪 ,延时仅仅影响这次转换 (参见图 7-4 )。

图 7-4 读等待模式的例子

4 .通道插入模式

通道插入模式允许不改变当前的工作模式对指定的模拟通道进行转换 (当 ADC 运

行在连续或自动扫描模式时 ) ,指定通道的转换完成后 , ADC 继续以原有转换模式工作。

图 7-5 示出了通道插入模式工作的例子。

通道插入模式通过对寄存器 ADCON 中的位 ADCIN 置位来使能 , 并且要求

“ADDAT 读等待模式”有效 (即 ADWR =“1”)。插入的转换通道由寄存器 ADDAT2 中

的位域 C HNR 指定。

亿恒 C164CI 16 位单片机

Page 314: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

303

注意 : A/ D 转换器只改变位域 ADRES 的内容 , 不会改变 ADDA T2 中的位域

CHNR。因为插入的转换通道号没有缓冲保存 ,在一个插入转换的采样期间 , ADDA T2

的位域 C HNR 决不可以修改 ,否则这个输入多路开关将切换到新的通道。建议只在没有

插入转换运行时改变通道号。

图 7-5 通道插入模式的例子

通道插入模式能够用以下两种方法触发 :

(1 ) 通过软件设置通道插入请求标志位 ADCRQ ;

(2 ) CA PCOM2 单元的捕获/ 比较寄存器 CC27 的比较事件或捕获事件也可以对位

ADCRQ进行置位。

第二种方法将在一个特定时间插入一个通道转换。这个时间或是 CA PCOM 定时器

达到预先设定的计数值 ,或是寄存器 CC27 中的一个捕获事件发生时。触发可以使用外

部信号的上升沿、下降沿或者任何跳变沿来完成。此外 ,这种方法允许记录这个信号出现

的时间。

注意 : 无论通道插入模式是使能或禁止 , 通道插入请求位 ADCRQ 将在任何

CAPCOM2 单元中 CC27 的中断请求发生时置位。因此 ,在对通道插入模式使能之前 ,建

议先对位 ADCRQ 清零。

完成当前的转换以后 , A/ D转换器将开始指定通道的 (插入 )转换。当这个通道转换

完成时 ,转换结果将存入替换结果寄存器 ADDAT2 ,并且将产生一个插入通道完成中断

请求 ,它使用中断请求标志 ADEIR (由于这个原因 ,要求对 ADDA T 读等待模式使能 )。

注意 : 如果在 ADDAT 读等待模式里所用的暂存数据寄存器是满的 ,则相应的下一

个转换 (标准模式或者插入模式 )将暂停。这个暂时寄存器能够保持 ADDAT 的数据 (从

一个标准转换得到的 )或 ADDAT2 的数据 (从一个插入转换得到的 )。具有读等待的通

道插入转换工作情况参见图 7-6。

5 .转换的仲裁

当 ADC 空闲时 ,激活的转换请求会立即触发相应的转换。当前的转换正在进行时 ,

第 7 章 A/ D转换器

Page 315: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

304

图 7-6 具有读等待的通道插入转换的例子

如果来了一个转换请求 , A/ D转换器的工作情况将根据涉及的转换模式而定 (标准的或

是插入的 )。

注意 : 如果相应的控制位 ( ADST 或 ADCRQ )是从“0”变换到“1”,也即这些控制位

在被设置为“1”之前 ,必须处于“0”的状态 ,则一个转换请求将会激活。

表 7-1 概括了各种可能情况的 ADC的工作。

表 7-1 转 换 仲 裁

正在进行的转换新的转换请求

标 准 插 入

标准中断正在进行的转换 ,并且开始新的

转换请求

完成正在进行的转换以后 ,开始转换

请求

插入

完成正在进行的转换以后 ,开始所请

求的转换

完成正在进行的转换以后 ,开始所请

求的转换 ,然而 , 对第二个转换 , 位

ADCRQ 将为“0”

亿恒 C164CI 16 位单片机

Page 316: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

305

7 .3 转换时序控制

当一次转换开始时 ,首先转换器的电容通过各自的模拟输入引脚充电 ,以达到当前的

模拟输入电压。这个电容的充电时间与采样时间有关。下一个采样电压通过逐次逼近方

式转换成数字值 ,其位数决定于 ADC的分辨率。转换完成后 ,转换器内部的自校准模块

进行自动校准。在转换期间 (采样时间除外 ) ,内部的电容通过引脚 VA R EF和 VAGND反复充

电和放电。

采样和充放电时 ,从电源中汲取的电流取决于各个阶梯所占的时间 ,因为必须使这个

电容在给定的时间内达到最终的电平 ,至少是一个确定的近似值。而一个电源所能提供

的最大电流 ,取决于它的内阻。

转换期间 ,采样和转换两个不同操作所花费的时间 ,在一定的范围内可以通过编程进

行调整 ,这个范围与 CP U 的时钟有关。因此 ,转换的不同阶梯所占的绝对时间与控制器

的一般速度无关。这样就可对 C164CI 中 A/ D 转换器进行调整 , 以适应不同的系统

特性。

1 .快速转换

通过编程使各段时间取可能的最小值 ,以完成快速的转换。这最适合于扫描高频信

号。这时模拟部分的信号源和电源的内阻必须足够小。

2 .高内阻转换

通过编程使各段时间取一个较高的值 ,或取可能的最大值 ,来实现一个高内阻转换。

当模拟信号源和电源有高的内阻时 ,为使电流尽可能小 ,这样设置更好。但在这种情况

下 ,转换速率可能相对要低一些。

转换时间可以用寄存器 ADCON 的高 4 位进行编程。位域 ADSTC (转换时间控制 )

用来选择 A/ D转换器工作时的基本时钟。采样时间由这个转换时钟及位域 ADST C(采

样时间控制 )决定。表 7-2 中列出了可能的组合 ,时间基准为 CP U 的时钟周期 , tCP U =

1/ fC PU。

表7-2 ADCTC与 A/ D转换器基本时钟表

ADCON .15/ 14( ADCTC) A/ D 转换器基本时钟 fBC ADCON .13/ 12 ( ADSTC) 采样时间 tS

00 fCPU/ 4 00 tBC * 8

01 fCPU/ 2 01 tBC * 16

10 fCPU/ 16 10 tBC * 32

11 fCPU/ 8 11 tBC * 64

选择 ADCT C和 fCP U时 ,不能超出基本时钟频率 fBC的极限值 (见数据手册 )。

第 7 章 A/ D转换器

Page 317: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

306

完成一次转换的时间包含采样时间、转换本身和将数据传送到结果寄存器的时间 (见

下面的例子 )。

注意 : 位域 ADCTC 采用这种非线性译码是为了与 80C166 复位时所取的缺省值 (复

位后为“00”)兼容。

转换器时序设置举例如下。

假设 fC PU = 20MHz (即 tCP U = 50ns) , ADCTC =“00”, ADST C =“00”。

基本时钟 : fBC = fCP U/ 4 = 5MHz, 即 tBC = 200ns。

采样时间 : tS = tBC * 8 = 1600ns。

转换时间 : tC = tS + 40 tBC + 2 tCP U = ( 1600 + 8000 + 100) ns = 9 .7μs。

7 .4 A/D转换中断的控制

每一次转换结束后 ,中断控制寄存器 ADCIC 的中断请求标志 ADCIR 置位 , 该转换

结束中断请求可以产生一个中断矢量 ADCINT , 或触发 PEC 数据传送 , 从寄存器

ADDAT 中读转换结果 ,存储到内部 RAM 的一个表中。

如果一个转换结果覆盖了寄存器 ADDA T 中前面的值 ,或者一个插入转换的结果存

储到 ADDAT2 (插入转换的结束中断 ) ,则寄存器 ADEIC 的中断请求标志 ADEI R 将置

位 (标准模式中的错误中断 ) ,这个中断请求可以用来产生一个中断矢量 ADEINT ,或者

触发一个 PEC 数据传送。

7 .5 程 序 实 例

本节给出一个 A/ D转换应用实例。

[例 7 .1] 用从 C164CI 的 A/ D转换器通道 1 得到的 ADC 值去控制 CAPCOM2 通

道 0 的输出脉冲宽度 ,控制范围从 0%~100%。CP U 的时钟频率为 20M Hz。

每次 A/ D转换器输出的 8 位新结果可以在 LED 上显示 , LED 被连接到端口引脚

亿恒 C164CI 16 位单片机

Page 318: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

307

P1L .0~P1L .7。外接一个大于等于 10kΩ的电位器到模拟输入通道 1 ,如图 7-7 所示。

图 7-7 模拟电压输入用电位器的连接图

系统初始化设置 (略 )。

CAPCOM2 的初始化 :

定时器 T7/ T8 为定时方式 ,预分频比为 8 ,定时器寄存器值为 0xFC00 , 定时器重装

载寄存器值为 0xFC00。

定时器 T7 的计数时钟为 fCP U/ 8。

配置通道 16。

比较模式 3 使能 ,指定通道 16 到定时器 T7 ,捕获/ 比较寄存器 0 设置为 0xFC00。

ADC 的初始化 :

固定通道连续转换 ,输入选择为模拟通道 1 ,转换结束后允许中断。

中断优先级 ILVL = 3 ,组优先级 GLVL = 3。

端口初始化 :

P1L .0~P1L .7 口用作一般的输出口 ,推挽输出 ,初始电平为“1”。 ( LED不显示 )。

汇编程序清单如下。

main:

CALLA c_ UC, IO_vInit

CALLA cc_ UC, ADC_vInit

CALLA cc_ UC, CC2_vInit

BSE T IEN

RET

ADC_vInit : ; A/ D 转换初始化子程序

MOV P5DIDIS, # 02 H ;

MOV ADCIC, # 04FH ; 设置 A/ D 转换中断优先级 ,开中断

MOV ADCON , # 091 H ; 选择固定通道 1 ,启动 A/ D 转换

RET

ADC_viIs rConv : ; A/ D 转换中断服务子程序

MOV R4, ADDAT ; 读 A/ D 转换值

AND R4, # 03FFH ; 取转换值

SH L R4 , # 6 ; 把转换值送到比较值的高 10 位

MOV CC16 , R4

MOVB P1L , RH4 ; 取转换值的高 8 位 ,送显示

RETI

第 7 章 A/ D转换器

Page 319: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

308

CC2_vInit : ; CAPCOM2 初始化子程序

MOV T78CON , # 00 H ; 定时器 T7 , T8 以定时方式工作

EXTR # 04 H

MOV T7, # 0FC00 H

MOV T8, # 00 H

MOV T7RE L , # 0FC00 H

MOV T8RE L , # 00 H

OR P8 , ZEROS ; P8 口起始输出为“0”

EXTR # 01 H

OR ODP8 , # 00 H ; P8 口设为推挽输出

OR DP8 , # 01 H ; P8 .0 口为输出口

MOV CCM4, # 07 H ; 通道 16分配给定时器 T7 ,比较方式 3

MOV CC16 , # 0FC00 H ; 设置比较初值

OR T78CON , # 040 H ; 启动定时器 T7 计数

RET

IO_vInit : ; P1 口初始化子程序

EXTR # 01 H

MOV PICON , # 00 H

MOV P1L , # 0FFH ; P1L口锁存器值“1”

EXTR # 01 H

MOV DP1L , # 0FF H ; P1L口设置为输出口

RET

亿恒 C164CI 16 位单片机

Page 320: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

CAN接口

8 .1 概 述

局域网络控制器 ( cont roller area network )总线 ,即 CAN 总线 ,及其相关的协议 ,可

以使连接到这个总线上的各个站点相互之间进行高效率的通信。

这里所说的效率含义为 :

(1 ) 传送速率 (数据率可高达 1Mbit/ s)。

(2 ) 数据的完整性 ( CAN协议提供多种纠错方式 )。

(3 ) 节省主处理器资源 ( CAN控制器能够自动完成大部分的工作 )。

(4 ) 灵活并且强大的信息传递 (支持扩展 CAN 协议 )。

片上的 CAN 模块根据 CAN技术规范 V2 .0 B,部分地自动处理整个 CAN 数据帧的

发送和接收。也就是说 ,片上 CAN 模块可以接收和发送具有 11 位标识符的标准帧和带

有 29 位标识符的扩展帧。

注意 : CAN 模块是一个 XBUS周边电路 ,因此 ,要求寄存器 SYSCON 的位 XPEN 置

位才能工作。图 8-1 示出了与 CAN 模块相关的寄存器。

CAN模块可以提供完全型 CAN 功能 ,多达 15 个完整的信息报文 (每一个为 8 个数

据字节 )。报文 15 可以配置为基本型 CAN 功能 ,具有双缓冲的接收。两种模式都提供

独立的屏蔽功能 ,对有关报文进行接收滤波。在完全型 CAN 模式下 ,允许若干标识符的

接收 ;而在基本型 CAN 模式下 ,允许去除若干标识符的接收。所有的报文都可以独立于

其他报文而进行更新 ,并且具有最大信息长度为 8 字节的缓冲区。

位时序由 XCLK驱动时钟确定 ,并可由程序控制 ,其数据速率最高可达 1 兆波特 (在

fC PU≥8/ 16MHz时 )。CAN 模块使用 P4 口或 P8 口的两个引脚作为收发总线的接口。

CAN模块包括几个并行工作功能模块 ,控制器性能由这些模块决定 (见图 8-2 )。下

面分别说明这些单元及其功能。

每一个信息报文都有唯一的标识符 ,并且有自己的一组控制和状态位。所有报文都

可以设置它们的方向 ,或为发送 ,或为接收。最后一个报文除外 ,它仅仅是具有专用屏蔽

寄存器的双缓冲接收。

Page 321: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

310

图 8-1 与 CAN 模块相关的寄存器

图 8-2 CAN 控制器框图

设置为发送的报文可以配置成 :只要在 CAN 总线上收到一个匹配的标识符 (考虑相

应的全局屏蔽寄存器 )的远程帧 ,就自动的进行发送。设置为接收的报文在请求发送时 ,

可以发送一个远程帧 ,要求其他的节点发送所需的报文。每个报文都有独立的发送中断、

接收中断和状态位 ,这样可以使得 CPU 在检测一个远程/ 数据帧的接收或发送时 ,具有

亿恒 C164CI 16 位单片机

Page 322: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

311

极大 灵活性。

一般应用情况下 ,两个接收滤波的屏蔽是可编程的 ,其中一个用于 11 位的标识符 ,另

一个用于 29 位的标识符。然而对每一个有效的报文 , CP U 必须对位 XTD(扩展标识符 )

进行设置 ,以判断所接收到的数据帧是标准帧 ,还是扩展帧。

对最后一个报文的接收滤波 , CAN 模块有自己的可编程屏蔽。它使系统可以处理大

量不经常出现的报文。CAN 控制器的报文层结构应设计得尽可能的规则合理 , 易于

使用。

1 .发送/接收移位寄存器 Tx/ Rx

发送/ 接收移位寄存器 T x/ Rx 保持填入总线的位数据流 ,从而可以对整个数据帧或

远程帧并行存取 ,进行标识码的匹配测试 ,以及将这些帧发送到智能存储器或从智能存储

器读出。

2 .比特流处理器

比特流处理器 ( BSP)用来控制 T x/ Rx移位寄存器、CRC 寄存器和总线之间的数据流

顺序。BSP同时也控制错误管理逻辑 ( EML ) ,及 Tx/ Rx 移位寄存器与智能存储器之间

的并行数据流 ,使得它们的接收、仲裁、发送和错误标识都按照 CAN 协议进行。对由于

噪声或总线上其他外部错误条件造成损坏的帧 ,也由 BSP 负责自动重发。

3 .循环冗余校验寄存器

循环冗余校验 (cyclic redundancy check )寄存器在数据发送之后产生循环冗余校验

码 ( CRC) ,然后发送出去 ,用于校验接收报文的 CRC码。该 CRC 码由数据流除以代码生

成多项式得到。

4 .错误管理逻辑

错误管理逻辑 ( EML)用于 CAN 设备的错误监护。它的计数器、接收错误计数器和

发送错误计数器的递增或递减由比特流处理器的命令来决定。根据错误计数器的数值 ,

CAN控制器设置为主动错误 ( error active)、被动错误 (error passive)和总线关闭 ( bus off)

3 种状态。

如果错误计数器的计数值在 128(被动错误界限 )之下 , CAN 控制器处于主动错误状

态。只要一个错误计数器的计数值等于或者超过 128 ,则进入被动错误状态。

当发送错误计数器的计数值等于或者超过总线关闭界限 256 时 ,则总线将关闭。在

总线关闭恢复序列完成之前 , CAN 设备将一直保持总线关闭状态。

此外 ,状态寄存器中有一个位 E WRN ,若至少有一个错误计数器的计数值等于或者

超过警告错误界限 96 ,则位 EWRN 将置位。若两个错误计数器的计数值均小于警告错

误的界限 ,则位 EWRN 将复位。

5 .比特定时逻辑

比特定时逻辑模块 ( BTL)负责监视总线的输入 CAN_RxD,并且按 CAN 协议来管

第 8 章 CAN 接口

Page 323: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

312

总线的位时序。在帧的开始 , BTL 进行一次“隐性”( recessive)到“主控”( dominant )的总

线跳变同步 (硬同步 )。如果 CAN 控制器本身不能发送一个起支配作用的主控位 (重同

步 ) ,也会进行另一次“隐性”到“主控”的总线跳变同步。

BT L还提供一个可编程的时间段 ,用以补偿由于传输引起的延时和相移 ,并用来规

定位定时中的采样点位置。BT L的编程控制由波特率和外部的物理延迟时间决定。

6 .智能存储器

智能存储器 ( CAN/ RAM 阵列 )可以提供最多 15 组报文的存储空间 ,每组报文数据

的最大长度为 8 个字节。每个报文有唯一的标识符和一组自己的控制、状态位。在初始

化设置后 ,智能存储器可以在不占有 CP U 资源的情况下进行发送和接收数据。

7 .寄存器和报文的组织

CAN控制器的所有寄存器和信息报文都位于 256B 的专用 CAN 地址区域内。映射

在第 0 段 ,物理地址为 0EF00 H~0EFFF H。所有的寄存器都是 16 位的寄存器 , 处于字

寻址的地址区。当然 ,所有的寄存器都是可以按字节访问的。

注意 :图 8-3 给出了寄存器中属于 CAN 控制器部分的地址映射关系 ,其中还包括与

CAN模块相关的 C164CI专用寄存器。这些寄存器用来控制对 CAN 模块的访问 ,而不

是用作其他的功能。

图 8-3 CAN 模块地址映射图

亿恒 C164CI 16 位单片机

Page 324: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

313

8 .2 工 作 情 况

1 .控制/ 状态寄存器

控制/ 状态寄存器 ( CSR )用于对模块作一般控制设置 ,并给出状态信息。

位 功能(控制位 )

I NIT 初始化位 置位时 ,开始初始化 CAN 控制器

IE 中断允许位

通过信号XINTR,允许或禁止 CAN 模块产生中断 ,不影响状态更新

SIE

状态改变中断使能位 当一个报文传送成功 (发送或接收 ) ,或者检测到一个 CAN 总线错误 ,由该位控制允许或禁止产生中断

EIE 错误中断使能位 当状态区中位 BOFF 或 EWARN 变化时 ,由该位控制允许或禁止产生中断

CPS

时钟预分频控制位 0:标准模式 ,输入频率作 2 分频。波特率为 1 兆波特时的最小输入频率 fCPU = 16MHz

1:快速模式 ,直接用输入频率。波特率为 1兆波特时的最小输入频率 fCPU = 8MHz

CCE 配置改变使能位 允许或禁止 CPU 访问位时序寄存器

TM

测试方式位

在写控制寄存器的时候 ,确保该位为“0”。因为该位控制一种特殊测试方式 ,专用于进行产品的测试。但在正常工作时 ,这种测试方式可能导致器件工作不正常

L EC

最近的一个错误码 这个位域保存 CAN 总线上最近发生的错误类型代码。如果信息传送 (发送或接收 )没有错误 ,则这个位域将为“0”。编码“7”未使用时 , CPU 可以写入“7”,以检测该位是否更新 0: 没有错误

1: 组合错误 ,在一个接收到的信息序列中 ,相同的比特超过 5 位 ,则认为出错 ,因为这是不允许的 2: 帧错误 ,在所接收到的帧中 ,固定格式部分出现一个错误的格式 3: 应答错误 ,一个 CAN 控制器发送的信息没有收到另一个节点的应答

4: 位“1”错误 ,在一个信息的发送过程中 (仲裁区域除外 ) ,设备希望发送一个隐性电平“1”,但是检测到的总线电平为主控电平

第 8 章 CAN 接口

Page 325: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

314

续表

位 功能(控制位 )

L EC

5: 位“0”错误 ,在一个信息 (应答位 ,主动错误标志或超载标志位 )发送过程中 ,设备希望发送一个主控电平 (“0”) ,但是检测到的总线电平为隐性的。在总线关闭恢复期间 ,这个状

态位将在每一次检测到“11”隐性位时置位。这使得 CPU 可以检测总线关闭的恢复序列的过程 (表明总线没有持续的主控电平或者是连续的被干扰 )

6: CRC错误 ,接收到的报文 CRC 校验和不正确 7: 未使用码 ,可以由 CPU 写入 ,用来检查其是否被修改

TXOK

发送报文成功 由于这一位最后由 CPU 复位( CAN 控制器不对这一位进行复位 ) ,一旦复位 ,表明已经成功发送了一个报文 (没有错误并且至少有一个其他的节点进行了应答 )

RXOK

接收报文成功 由于这一位最后是由 CPU 复位 ( CAN 控制器不对这一位进行复位 ) ,一旦复位 ,表明成功地接收了一个报文

E WRN 错误警告状态 表明至少有一个 EML 错误计数器的计数值达到了 96 个错误警告的界限

BOFF 总线关闭状态 表明 CAN 控制器处于总线关闭状态 (见 EML)

注意 :如果有中断还未处理 ,在进行读控制寄存器的高位字节时 (状态区 ) ,会清除掉

中断寄存器中状态改变中断 (被挂起的 )的值。采用对低位字节作字节的访问 ,可以避免

上述情况的发生。

2 . CAN中断处理

片上 CAN 模块有一个中断输出 ,同步后连接到一个标准的 C164CI 中断节点 ,它和

其他标准的片内周边电路中断相同。用这种配置方法 ,用户可以对这个中断的所有控制

选项进行操作 ,例如允许/ 禁止中断 ,级别和组的优先级控制 ,以及进行中断还是 PEC 服

务等。片上 CAN 模块接到一个 XBUS中断控制寄存器。

与所有其他的中断服务一样 ,在中断服务 (标准的中断或者是 PEC 服务 )后 ,节点的

中断请求标志由硬件自动清除。

注意 :理论上 CAN中断请求可以有一个 PEC 通道服务。然而 ,由于 PEC 通道只能

处理单个已经预先定义的数据传送 (不存在有条件的 PEC 传送 ) ,因此 ,只有在已知相应

的中断请求是由一个特定的源所产生 ,并且这时没有其他的中断请求产生时 ,才可以使用

PEC服务。但在实际使用中 ,出现这种情况的概率比较低。

由于 CAN 模块的中断请求可以由不同情况产生 , 所以在中断服务程序中必须读取

适当的 CAN 中断状态寄存器 ,以此来判断中断请求产生的原因。端口控制/ 中断寄存器

( PCIR)中的中断标识符 INITD (一个数 )用来表明中断请求的原因。当没有中断挂起

时 ,标识符的值为“00”。

如果标识符 INITD的值不为“00”,则必有一个中断没有处理。如果控制/ 状态寄存

器的位 IE 也置位的话 ,那么送到 CPU 的中断信号激活 ,而且中断信号将一直保持激活状

态 ,直至位域 INI TD为“00”(也即所有的中断请求已经服务过了 ) , 或中断被禁止 (位 IE

亿恒 C164CI 16 位单片机

Page 326: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

315

清零 )。

注意 :中断节点只在 CAN 中断信号从“0”变到“1”时激活。CAN 中断服务子程序只

应在 INTID确认为 00 H 时才结束。

INTID值越低的中断 , 其优先级越高。如果在处理当前的中断时 ,又产生了一个高

优先级的中断 , INITD 将会更新 ,并且新的中断将取代旧的中断。

当对相应的中断源处理过后 , IN TID 也被更新。这通过相应报文控制寄存器 ( MCR)

的 INTPND标志清零表明 ,或是用读寄存器 CSR 的状态部分得到 (状态改变中断情况 )。

INTID的更新由 CAN状态机进行 ,最多需要 6 个 CAN 时钟周期 ,取决于状态机的当前

状态。1 个 CAN时钟周期等于 1 个或 2 个 CP U 时钟周期 ,由预分频位 CPS决定。

注意 :最差的情况发生在 BRP = 00 H 时 , CAN 控制器正在存储刚接收到的报文 ,且

CP U正在对 CAN 模块作连续的访问。在这种个别的场合 ,最大延时可为 26 个 CAN 时

钟周期。

要使这种延时的影响达到最小 ,可以用在中断处理的前期对位 INTID 清零 ,并在预

期的更新完成前 ,限制 CP U 对 CAN 模块的访问。

位 功 能

I NITD

中断标识符

它表示中断的原因

00 H : 中断空闲 ,没有发生中断请求

01 H : 状态改变中断 ,CAN 控制器已经更新 (不是必须改变 )了控制寄存器中的状态。更

新的原因是 CAN 控制器的错误状态的改变 ( EIE 置位 ,且 BOFF 或 E WRN 改变 ) ;或者是

CAN 传送事件 ( SIE 必须置位 ) ;如接收或发送一个信息 ( RXOK 或 TXOK 置位 ) ,或者是

CAN 总线错误( LEC更新)。CPU 可以清除掉 RXOL , TXOK 和 LEC ,但是不会去写控制寄

存器的状态部分 ,或者复位一个中断。要更新 INTID的值 ,必须读控制寄存器的状态部分

02 H : 报文 15 中断 ,报文 15(最后的信息 )的报文控制寄存器中的位 IN TPN 已经置位。

在所有的报文中 ,最后的信息报文具有最高的中断优先级①

( 02 + N) : 报文 N 中断 ,报文 N 的报文控制寄存器的位 INTPN 中的“N”已置位 ( N = 1⋯

14)。注意 ,只有在无其他更高优先级的中断请求时 ,才会显示出报文中断的编码①

例 :报文 1 , IN TID = 03 H ; 报文 14 , IN TID = 10 H

IPC

接口的端口控制 (复位值为 111B,即无端口连接 )

位域 IPC的编码在“CAN 应用接口”一节描述

注意 :只有在位 CCE 置位时 ,才能对位域 IPC写入

① 用更低级别的优先级去更新 INTID,或者是将 IN TID 复位至“00”(休眠状态 ) ,则相应报文的 IN TP D 可以被

清除掉。

第 8 章 CAN 接口

Page 327: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

316

3 .位时序的构成

根据 CAN 协议规范 ,位时序可分为四段 :同步段 ,传播时间段 ,相位缓冲段 1 和相位

缓冲段 2(见图 8-4)。每一段都是时间份额 tq ( tq = ( BRP + 1 )·2( 1 - CP S)· tX CL K )的整数倍。

同步段 ( sync-seg)通常是 1 个 tq 长度。传播时间段和相位缓冲段 1 (组合成 TSEG1)决定

了采样点以前的时间。而相位缓冲段 2( TSEG2)则定义了采样以后的时间长度。这些段

的长度是通过位时序寄存器 ( BT R)由程序设定的 (同步段除外 )。

注意 :对于这些段的精确定义 ,请参考 CAN 规范。

图 8-4 位时序的定义

位时序由 XBU S时钟周期 tX CL K、波特率预分频器和每位的时间份额数确定。

位时序 = tsy nc- seg + tTSEG1 + tTSE G2

tsync- seg = 1· tq

tTSEG1 = ( TSEG1 + 1 )· tq

tTSEG2 = ( TSEG2 + 1 )· tq

tq = ( BRP + 1)·2( 1 - CPS)

· tq

注 : TSEG1 , TSEG2 和 BRP是可编程的数值 ,由位时序控制器的对应位域决定。

位 功 能

BRP 波特率预分频器 用来生成位时间的时间份额 , CPU 频率除以 2( 1 - CP S)· ( BRP + 1)

SJW (重新)同步跳跃宽度 通过最大值为 ( SJW + 1 )个时间份额来调整位时序 ,以实现重新同步

TSEG1 采样点前的时间段

采样点以前的时间长度为 ( TSEG1 + 1 )个时间份额。TSEG1 的有效值为 2~15

TSEG2 采样点之后的时间段 采样点之后的时间长度为 ( TSEG2 + 1 )个时间份额。TSEG2 的有效值为 1~7

注 :只有使能位 (CCE)置位时 ,这个寄存器才允许进行写操作。

亿恒 C164CI 16 位单片机

Page 328: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

317

4 .屏蔽寄存器

报文可以使用标准的或扩展的标识符。接收到的帧可以用适当的全局掩码进行屏

蔽。根据接收到的报文位 IDE 决定是使用 11 位标准掩码作全局短屏蔽 ( GMS) ,还是使

用 29 位扩展掩码作全局长屏蔽 ( UGML 和 LGML)。对保持为“0”的那些位“不考虑”,即

不与报文标识符里各个对应位进行比较。最后一个信息报文 (15)另外有一个单独的可编

程接收掩码 ( UMLM 和 LMLM) ,用于终了的仲裁场。这样 ,通过屏蔽标识符的一些位可

以得出这个报文里所接收的信息类别。

注意 :最后一个报文的屏蔽 ,是与接收到报文所对应的全局屏蔽相“与”工作。

位 功 能

ID28~18 标识符 ( 11 位)

用作对有标准标识符的报文滤波的掩码

位 功 能

ID28~0 标识符 ( 29 位)

用作对有扩展标识符的报文滤波的掩码

第 8 章 CAN 接口

Page 329: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

318

位 功 能

ID28~0

标识符 ( 29 位)

根据配置 ,用于对有扩展标识符或对有标准标识符的最后一个报文 (第 15 个 )的滤波

的掩码

8 .3 报 文

报文是 CPU 与 CAN控制器之间通信的主要方式。15 个报文的每一个都使用 15 个

连续的字节 (见图 8-5) ,并且以 16 的倍数为地址的起始。

图 8-5 信息报文地址映射

注意 :所有的报文必须在位 INI T 清零之前由 CPU 初始化 ,包括那些不使用的报文。

报文的一般特性由报文控制寄存器 ( MCR )定义 , 每个报文各有一个专用的寄存器

MCRn。

报文控制寄存器中的每一个元素由互补的两位组成。这种特殊的机制允许不使用

读-修改-写的周期过程 ,可以对某些指定的元素有选择性地置位或清零 (保持其他元素不

变 )。所有元素都不会受复位的影响。表 8-1 列出了如何使用和解释这两位。

表 8-1 报文控制寄存器的位域编码

值 写入的功能 读出的意义

00 保留 保留

01 使元素复位 元素处于复位状态

10 使元素置位 元素处于置位状态

11 保持元素不变 保留

亿恒 C164CI 16 位单片机

Page 330: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

319

1 .报文控制寄存器

位 功 能

I NTPND

中断挂起 表明从上一次由 CPU 对这一位复位后 ,这个信息报文是否已经产生了一个中断请求

(见 TXIE和 RXIE)

RXIE 接收中断允许位 定义为在成功地接收了一帧以后 ,将 IN TPND 置位

TXIE 发送中断允许位

定义为在成功地发送了一帧以后 ,将 IN TPND 置位①

MSGVAL

报文有效 表明相应的报文是否有效。CAN 控制器只对有效的报文进行操作。当报文改变后 ,

或是完全不使用时 ,信息报文可标志为无效

NEWDAT

新的数据

该位表明自该位上一次复位后 ,新的数据是否已经由 CPU (发送报文 )或者是 CAN

控制器(接收报文)写入了此报文的数据部分②

MSGLST

报文丢失 (这一位仅用于接收报文 )

表示 CAN 控制器在 NEWDAT 仍处于置位状态时 ,向此报文中存入了新的信息。这样 ,上一次存入的报文就会丢失

CPUUPD

CPU 更新 (这一位仅用于发送报文 )

表示使相应的报文还未发送。CPU 对该位置位 ,以禁止发送当前正在更新的报文 ,

或控制对远程请求的响应

TXRQ

发送请求 表明由 CPU 或远程帧请求发送的报文还没有发送出去。TXRQ 可以由 CPU UPD

禁止①③

RMT PND

远程挂起 (用于发送报文 )

表明对这个报文的发送请求是由一个远程节点发来的 ,但是数据还没有发送出去。当 RMTPND 置位时 , CAN 控制器将同时对 TXRQ 置位。当报文成功发送以后 ,

RM TPND 和 TXRQ 都将清零

①为了防止报文 15 的发送 ,在信息报文 15(最后的信息 )中 ,这些位都由硬件设为“0”(无效 )。

② 当 CA N 控制器向报文中写入新的数据时 ,没有用到的信息字节将由未指定的数值覆盖掉。通常 CP U 在对数

据工作之前都会将它们置“0”,在报文发送完之后 ,再检验一下该位是否仍然为“0”,以确保所用的是一组完整的数据 ,

而不是前一次的旧数据和后一次的新数据的混合。

发送报文时 , CP U 对该位置位 ,并清除 CP U U P D。这样可以确保在 CP U 更新这条信息期间 ,如果要发送报文时 ,

CAN 控制器将不会使 TXRQ 复位。这样 ,只有在实际数据真正发送出去以后 , TXR Q 才会复位。

③ 当 CP U 请求一个接收报文的发送时 ,将发送一个远程帧来代替一个数据帧 ,向一个远程节点请求发送相应的

数据帧。如果位 NEWD AT 没有置位 ,当报文成功发送后 , CA N 控制器将该位和位 RM TP ND 一起清零。

如果同时有几个有效的提出了发送请求的报文 ,则编号最小的报文将最先发送出去。当有几个报文由 CP U 请求

发送时 ,或因错误帧及失去仲裁而恢复操作时 ,将进行仲裁。

第 8 章 CAN 接口

Page 331: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

320

2 .仲裁寄存器

仲裁寄存器 ( UARn 和 LARn)用来对收到的报文进行接收滤波 ,并定义发送报文的

标识符。收到的报文将根据 DIR =“0”(数据帧 )或 DIR =“1”(远程帧 )存入与标识符相匹

配的有效信息报文中。在判断是否匹配时 ,相应的全局屏蔽也要考虑 (如果是报文 15 ,最

后报文的屏蔽也要考虑 )。

扩展帧 (使用全局长屏蔽 )只能存为 XTD =“1”的报文 ,标准帧 (使用全局短屏蔽 )只

能存为 XTD =“0”的报文。

报文应有唯一的标识符 ,也即如果有一些位是被全局屏蔽寄存器滤除 ,则有效报文的

识别符应与用作接收滤波的剩余位不同。如果收到的报文 (数据帧或远程帧 )与超过一个

的有效报文相匹配 ,则它将存到编号最小的报文中 ;或在响应一个远程帧时 ,对编号最小

的报文进行发送。这里匹配是使用全局屏蔽。在数据帧或远程帧发送后 ,具有编号最小

的匹配报文的发送请求标志清零。这时不使用全局屏蔽。

CAN控制器接到一个数据帧时 ,完整的信息存到相应的报文中 ,包括标识符 (还有被

屏蔽的位 ,标准的标识符 ID17~0 位都填充“0”)、数据长度码 ( DLC)和数据字节 (有效字

节用 DLC 表示 )。这样 ,即使仲裁屏蔽寄存器被占用 ,也可以用保存同标识符联系的数据

字节来实现。

当 CAN 控制器接到一个远程帧时 ,相应的发送报文 ( 1~14 )保持不变 , TXRQ 和

RMTP ND除外 ,当然它们被置位。最后一个报文不启动发送 ,其中与最后报文屏蔽的

“不考虑”位所对应的标识位从接收帧中复制。而与相应的全局屏蔽的“不考虑”位所对应

的标识位不复制 (也即全局屏蔽和最后报文屏蔽所去掉的位不能从报文 15 取回 )。

位 功 能

ID28~0

标识符 ( 29 位)

标准报文的标识符 ( ID28~18 ) ,扩展报文的标识符 ( ID28~0 )。对于标准标识符 ,与位( ID17~0)无关

3 .报文配置寄存器

报文配置寄存器对报文中的信息进行描述。

亿恒 C164CI 16 位单片机

Page 332: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

321

注意 :位 XTD 和位 DIR 不能选择为“不考虑”。因此接收到的帧只能和相应的报文

相匹配 ,要么是标准的 ( XTD = 0 ) ,要么是扩展的 ( XTD = 1 )。数据帧只和接收报文相匹

配 ,远程帧只与发送报文相匹配。

当 CAN 控制器存入一个数据帧时 , 它将把所有的 8 个数据字节写入信息报文。如

果数据长度码小于 8 ,信息报文其余的字节将被未指定的值所覆盖。

位 功 能

XTD

扩展标识符 0 :标准的 ,报文使用 11位的标准标识符

1 :扩展的 ,报文使用 29位的扩展标识符

DIR

报文方向

0 :接收。在 TXRQ ,将发送带有这个报文标识符的远程帧 在接收到一个匹配标识符的数据帧时 ,信息将存入这个报文 1 :发送。在 TXRQ ,将发送相应的报文 在接收一个带匹配的标识符的远程帧时 ,这个报文的位 TXRQ 和 RMT PND将置位

DLC 数据长度码 数据长度的有效值为 0~8

注 :第一个数据字节放在报文配置寄存器的高半部分。

4 .数据区

数据区位于报文配置寄存器后的相继 8 个字节 ,即报文 n 的数据区位于从 00EFn7H

~00 EFnEH。地址 00EFnF H 由系统保留。

在 CPU 读出第一个报文之前 ,如果收到第二个报文 ,报文 15(最后一个信息 )的报文

数据将被写到报文的替换缓冲器中 ,以避免报文的丢失。

5 .报文的处理

图 8-6~图 8-11 概要列出了在 CAN 总线上发送和接收报文的工作过程 ,包括 CAN

控制器的工作及由 CPU 做的工作 (即服务程序 )。

·CAN控制器对发送报文的处理 ,见图 8-6。

·CAN控制器对接收报文的处理 ,见图 8-7。

·CP U对发送报文的处理 ,见图 8-8。

·CP U对接收报文的处理 ,见图 8-9。

·CP U对最后报文的处理 ,见图 8-10。

·最后报文的替换缓冲器的操作 ,见图 8-11。

第 8 章 CAN 接口

Page 333: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

322

图 8-6 CAN 控制器对发送报文的处理

图 8-7 CAN 控制器对接收报文的处理

亿恒 C164CI 16 位单片机

Page 334: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

323

图 8-8 CPU 对发送报文的处理 图 8-9 CPU 对接收报文的处理

图 8-10 CPU 对最后报文的处理

第 8 章 CAN 接口

Page 335: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

324

图 8-11 最后报文的替换缓冲器的操作

8 .4 CAN模块的控制

CAN模块由硬件信号 (如复位 )和由软件执行对寄存器的访问进行控制。

1 .对片上 CAN模块的访问

对 CAN 模块的操作 ,可以看作是对一个外部存储器或外部设备的访问。这意味着

CAN模块的寄存器都可以用 16 位字或 8 位字节 ,或间接存储器寻址方式来对它们进行

读或写操作。

XBU S不支持位操作 ,因为连接到 CAN模块的 XBUS也属于外部总线 ,遵循对外部

总线访问的规则。CAN不能并行地进行对外部指令的读取或数据的读/ 写 ,但是可以对

外部总线的访问流进行仲裁和插入。

对 CAN 模块的访问使用分离的多路地址 , 16 位的数据总线 (可按字节访问 )具有两

个等待状态 ,没有三态状态。

CAN地址区域从 00EF00H 开始 ,占用 256 字节。这个区域使用内部译码 ,因此 ,在

访问片上 CAN 模块时 ,不需要提供另外的可编程地址窗。

亿恒 C164CI 16 位单片机

Page 336: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

325

将 CAN地址区设在段 0 的 00EF00 H ,这样可以通过数据页 3 来访问 CAN 模块。该

页是“系统”数据页 , 通常是通过“系统”数据页指针 DP P3 来访问。这样 ,如 SFR、内部

RAM及 CAN 寄存器等内部地址都位于同一个数据页 ,并构成一个连续的地址空间。

2 .掉电模式

如果 C164CI 进入掉电模式 , XCLK信号将关掉 ,从而使 CAN 模块停止工作 ,任何报

文的传送都会中断。为了确保 CAN 控制器在发送主控电平 (“0”)时不停止工作 , CP U 应

该在进入掉电模式之前 ,使控制寄存器中的位 INIT 置位。CPU 可以通过读控制寄存器

的位 TXOK 或者是信息报文的位 TXRQ 和 NEWDA T ,检查是否正在进行发送。在经过

硬件复位从掉电模式中返回时 , CAN 模块需要重新设置。

3 . CAN模块的禁止

通过对寄存器 SYSCON3 中的位 CANDIS置位 ,可禁止 CAN模块工作 ,这时将无法

访问所有的寄存器。模块的逻辑部分也停止工作 , CAN 总线停止发送。在重新对 CAN

模块使能时 ( CANDIS =“0”) ,必须重新对它设置 (就像从掉电模式中恢复一样 )。

注意 :在这种情况下 ,到来的信息帧仍可通过监视接收口线 CAN_RxD识别出来 (但

是不接收 )。对这种用法 ,接收口线 CAN_RxD 可以通过寄存器 EXISEL 连接到高速外

部中断。

4 . CAN模块的激活

复位后 , CAN 模块处在禁止状态。在它能进行接收和发送之前 ,必须用软件激活。

这时应进行下列操作 :

(1 ) 设置寄存器 SYSCON 的位 XPEN 为“1”,对 CAN 模块进行全局使能。

(2 ) 选取一对端口引脚用来连接 CAN 模块和外部收发器。这是通过寄存器 PCIR

的位域 IPC 的设置实现的。

(3 ) 模块的初始化。确定 CAN 模块的功能 (波特率、有效报文等 )。

5 . CAN模块的复位

片上 CAN 模块与 XBUS 的复位信号 XRESET 相连接。当 C164CI 的复位输入有

效 ,或执行软件复位和监视定时器复位时 ,激活该信号。CAN 模块的复位线触发一个硬

件复位。

硬件复位时的操作如下 :

(1 ) 断开 CAN_ TxD和端口电路的连接 ,输出为“1”(隐性的 )。

(2 ) 清除错误计数器。

(3 ) 总线复位 ,处于关闭 ( busoff)状态。

(4 ) 将控制寄存器的低位字节切换为 01H。

(5 ) 控制寄存器的高位字节和中断寄存器位未定义。

(6 ) 不改变其他寄存器 ,包括信息报文 (标为 UUUU )。

第 8 章 CAN 接口

Page 337: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

326

注意 :上电后的第一次硬件复位 ,未改变过的寄存器处于不确定状态。控制寄存器的

低字节值 01 H 是为模块初始化准备的。

6 .模块的初始化

通过设置控制寄存器中的 INIT 位对软件初始化使能。这可以由 CP U 通过软件来

实现 ,或在硬件复位时由 CAN 控制器自动完成 ,或者由 EML 切换到关闭状态来实现。

当 INIT 置位时 ,其操作如下 :

(1 ) 停止所有 CAN 总线上进出的报文传送。

(2 ) CAN 总线输出 CAN_T xD为“1”(隐性的 )。

(3 ) 最后一个报文的控制位 NE WDAT 和 RM TPND复位。

(4 ) EML的计数器保持不变。

如果设置了 CCE 位 ,还允许改变位时序寄存器的设置。

要初始化 CAN 控制器 ,应按下面的步骤进行 :

(1 ) 设置位时序寄存器 (要求 CCE 置位 )。

(2 ) 设置全局屏蔽寄存器。

(3 ) 初始化每一个信息报文。

如果一个报文是不需要的 ,必须清除它的信息有效位 ( MSGVAL ) ,也即将它定义为

无效 ,否则整个报文都得初始化。在初始化序列完成以后 , CP U 对位 INIT 清零。这时

BSP与 CAN 总线上的数据传送进行同步 ,等待 11 个持续的隐性位序列的发生 (即空闲

状态 ) ,然后才能参与总线活动和开始信息的传送。

报文的初始化取决于位 INIT 的状态 ,或跳过初始化。在 BSP开始传送报文之前 ,报

文应全都配置上特别的识别符 ,或设置为“无效”。

如果要在正常工作期间改变一个报文的设置 , CP U 必须先清除位 MSGVAL ,使这一

位无效。当设置完成以后 ,重新将位 MSGVAL 置位。

7 .关闭恢复序列

如果总线进入了关闭状态 ,位 BOFF 将置位 ,并且位 INIT 会自动置位 , 所有的总线

活动停止。为了使 CAN 模块再次进入总线激活状态 ,必须通过软件对位 INIT 清零 ,开

始一个关闭恢复序列。一旦位 INIT 被清除 ,在恢复正常工作以前 ,将等待发生 129 次总

线空闲。

在关闭恢复序列结束时 , 错误管理计数器清零 , 这将自动使位 BOFF 和 EWRN

清零。

在 INIT 复位后的等待期间 ,每检测到一次 11 个隐性位的序列 , Bit0Error 代码将写

到控制寄存器 ,对 CP U 使能 ,检查 CAN 总线是否已转为主控 ;或继续受到干扰 , 并监视

关闭状态恢复序列的处理过程。

注意 : 当进入总线关闭状态时 ,如果位 IE 和 EIE 置位 ,可以产生一个中断。位域

INTID中的中断代码是 01H。

关闭恢复序列不能用对位 INIT 的置位和复位进行缩短。

亿恒 C164CI 16 位单片机

Page 338: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

327

8 .5 CAN应用接口

C164CI 的片上 CAN 模块通过两个信号连接到外部的物理层 (即 CAN 总线 ) ,见表

8-2。

表8-2 CAN接口信号

CAN 信号 引 脚 功 能

CAN_RxD

CAN_TxD由 C1PCIR .IPC控制

从 CAN 总线上的物理层接收数据

发送数据到 CAN 总线的物理层上

逻辑低电平 (“0”)认为是 CAN 总线“主控”电平 ,逻辑高电平 (“1”)认为是 CAN总线

的“隐性”电平。

1 .外部收发器的连接

CAN模块可以通过一个外部收发器连接到 CAN 总线 (见图 8-12 )。

图 8-12 连接到 CAN 总线

注意 :不使用 CAN 收发器直接连到几个 CAN 模块也是可以的。

2 .端口控制

CAN模块的接收数据线和发送数据线可在两个端口间选择。为了作合适的接收 ,要

确认接收的相应引脚应切换为输入。发送的相应驱动输出会自动接通。

这提供了一种标准的引脚配置 ,不需增加软件控制。还可工作在仿真模式 ,端口方向

寄存器不用控制。

CAN模块的接收线和发送线可用软件选择 ,分配到几个端口引脚 (见表 8-3 ) ,以满足

应用的要求。这种分配是通过寄存器 PCIR 的位域 IPC 选择的。

表 8-3 CAN接口线所分配的端口引脚

I PC CAN_RxD CAN_TxD 说 明

000 P4 .5 P4 .6 兼容的分配 ( CAN)①

001 --- --- 保留 ,不使用

第 8 章 CAN 接口

Page 339: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

328

续表

I PC CAN_RxD CAN_TxD 说 明

010 P8 .0 P8 .1P4 口可用作段地址线 A21~A16

(4MB外部地址空间)

011 P8 .2 P8 .3P4 口可用作段地址线 A21~A16

(4MB外部地址空间)

100 --- --- 保留 ,不使用

101 --- --- 保留 ,不使用

110 --- --- 保留 ,不使用

111 空闲(隐性 ) 不连接 不用分配端口 ,复位后的缺省设置

① 这种分配方式与以前 CA N 接口线是固定分配的版本兼容。

亿恒 C164CI 16 位单片机

Page 340: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

C语言编程

9 .1 概 述

C语言是一种广泛应用的编程语言 ,它能提供高效率的代码、结构化的编程和丰富的

运算符。作为一种通用的编程语言 , C 语言本身和底层的硬件相对独立 ,采用 C 语言开发

应用程序的工作效率要比汇编语言高得多。但是在对执行速度要求较高的地方 ,还需要

使用汇编语言编程。因此 ,采用 C语言和汇编语言混合编程来开发应用程序是最合适的

方法。

开发亿恒 16 位单片机时使用的是 C166 编译器 , 这是一种完全符合 ANSI 标准的 C

语言编译器。它能够使用 C 语言和汇编语言混合编程 ,具有编程灵活、代码效率高以及

汇编语言执行速度高的特点。C语言本身不能完成那些需要由操作系统完成的操作 (例

如输入和输出 ) ,这些操作可以通过 C166 提供的标准程序库实现。

1 . C语言程序的特点

相对于汇编程序而言 , C 语言程序具有以下几个优点 :

(1 ) 适合系统级的程序开发 ,不需要知道处理器各种指令的意义。

(2 ) C 语言是一种结构化语言 ,它既可以像汇编语言一样直接对硬件操作 ,又可以面

向对象。

(3 ) C 语言可以自动管理变量和存储器的分配 ,自动完成数据类型的引用和转换 ,它

具有多种数据类型 , 可自动完成函数之间的参数传递 ,使开发人员可以集中精力实现

算法。

(4 ) 可读性远远高于汇编语言 ,易于维护。

(5 ) 对硬件的依赖程度低 ,便于移植。

(6 ) 具有丰富的库函数 , 如输入输出、类型转换和浮点计算。采用结构化的编程方

法 ,提高了编程的效率 ,大大缩短了产品开发的时间。

2 . C编译器

C编译器把 C语言程序转换成可以执行的机器码。亿恒专门为 C166/ C167 单片机

Page 341: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

330

提供了 Keil C166 编译器 ,它能在代码效率和速度上同汇编语言相媲美。Keil C166 编译

器符合 ANSI 中 C语言的标准 ,并针对 C166/ C167 作了扩展。

3 . C语言程序的组成

C语言程序一般由以下几部分组成 :

(1 ) 头文件 ;

(2 ) 函数说明 ;

(3 ) 宏定义 ;

(4 ) 变量说明 ;

(5 ) 函数定义。

图 9-1 是一个 C 语言程序的例子 ,其中包括了头文件、函数说明、变量说明和函数

定义。

# include < reg166 .h > / * 头文件 * /

# include < stdio .h >

sbit p310 = P3 〈10 ; / * 变量定义 * /

void init ( ) ; / * 函数说明 * /

main ( ) { / * 函数定义 * /

init ( ) ;

unsigned char c , buf[10] ;

whil ( 1) {

P0 = P2 ;

gets (buf , sizeof (buf) ) ;

for (c = 0 ; buf[c ] ! = 0 ; c + + ) {

buf[c ] = toupper ( buf[c ] ) ;

}

print f ( " % s\ n" , buf) ;

P0 = 0 ;

}

}

图 9-1 C 语言程序举例

9 .2 C166编译器

在用 C166 编译器编译 C 语言程序时有很多参数可以指定 ,例如编译器是否产生列

表文件、优化级别、存储模型和存储类型等。

亿恒 C164CI 16 位单片机

Page 342: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

331

9 .2 .1 环境设置

运行编译器和其他工具之前 ,必须设置 DOS环境变量 ,指定编译器的运行路径。表

9-1 列出了需要设置的环境变量。

表 9-1 环 境 变 量

变 量 内 容 意 义

PAT H \C166\ BIN C166 可执行文件的位置

TMP 指定编译器临时文件的存放路径 , T MP 指向 RAM 盘 ,可以提高编译性能。如果不设置该变量 ,编译器会给出一个错误信息并退出

C166INC \C166\ INC

指定 C166 头文件的路径。编译器可以接受最多 5 条路径。如果需要指定多条路径 ,路径之间用分号分开 ,例如 :

SE T C166INC = C: \ C166\ INC; C: \ CH IP_DIR

编译器按照当前路径、源程序所在路径、INCDIR 命令行参数指定路

径、C166INC环境变量指定路径的顺序查找头文件

C166LIB \C166\ LIB 指定标准 C166 库文件的位置

大多数情况下 ,环境变量会在安装 C 编译器时自动在 AU TOEXEC .BAT 文件中进

行设置 ,也可以单独在批处理文件中进行设置。

PAT H = C: \ C166\ BIN

SET TMP = D: \

SET C166INC = C: \ C166 \ INC

SET C166LIB = C: \ C166\ LIB

9 .2 .2 C编译器命令

C编译器可以按 DOS命令行方式运行 ,格式为 :

C166 Sourcefile directives

其中 Sourcefile是 C 源程序 , directive是编译控制参数。例如 :

C166 SAMPLE .C DEBUG CODE PREPRIN T

编译通过时会显示如下的提示信息 :

MS-DOS C166 COMPILER V3 .0

C166 COMPILATION COMPLET E , 0 WARNING(S ) , 0 ERROR (S)

9 .2 .3 错误信息

编译完成后 , 编译器会把错误和警告信息显示在屏幕上 , 同时会设置 DOS 的

第 9 章 C语言编程

Page 343: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

332

ERRORLEVEL 环境变量来反映编译的结果 ,如表 9-2。在批处理方式的编译过程中 ,可

以在批处理文件中根据 E RRORLEVEL 来改变编译流程。

表 9-2 ERRORLEVEL环境变量的设置

ERRORLEVEL 意 义

0 没有错误和警告

1 只有警告

2 有错误 ,同时也可能有警告

3 有致命错误

9 .2 .4 输出文件

C166 编译器会产生很多输出文件。缺省情况下 ,输出文件的前缀和原文件一致 ,但

文件的后缀不同。表 9-3 列出了各种输出文件的意义。

表 9-3 输出文件列表

文件后缀 意 义

.LST 列表文件 ,包括源文件和编译错误信息 ,并可以由 PRIN T 编译控制参数决定是否包括符号和汇编代码

.OBJ 包括可链接目标码的目标文件 ,用于 L166连接器

.I 由预处理器产生的源文件 ,所有的宏都已展开 ,删除了注释

.SRC 汇编代码 ,可以由 A166 编译

9 .2 .5 编译控制参数

编译控制参数用来选择编译器的编译选项 ,可以在命令行中给出 ,也可以在 C 源程序中用 # pragma 语句指定。通常编译控制参数放在 C源程序的起始处 ,在一行里可以指

定多个编译控制参数 ,但不能多次指定同一个编译控制参数 ,否则编译器会产生致命错误报告并退出。下面是 # pragma 的例子。

# pragma SYMBOLS CODE DEBUG

编译控制参数分为三类 :源程序控制 ,目标码控制和列表文件控制。源程序控制定义了命令行中的宏以及需要编译的源文件 ;目标码控制可以选择优化级别和目标文件中的调试信息 ;列表文件控制可以选择列表文件的内容及格式。表 9-4 列出了所有的编译控

制参数。

表 9-4 编译控制参数

参 数 控制类型 意 义

ASM/ ENDASM 源程序 把 ASM 和 ENDASM 之间的源程序直接写入到.SRC文件中 ,可用于嵌入式汇编编程

CODE ,CD 列表文件 列表文件中包括汇编代码

COMPACT , CP 目标码 使用 COMPACT 存储模型

亿恒 C164CI 16 位单片机

Page 344: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

333

续表

参 数 控制类型 意 义

[ NO] COND, [ NO ]CO 列表文件 列表文件中是否包括预处理器删除的 C 源程序

DEBUG, DB 目标码 目标文件包括调试信息

DEFINE ,DF 源程序 为预处理器定义参数

FIX166 目标码 为 80C166 芯片作特殊处理

FIX167 目标码 为 C167/ C165 芯片作特殊处理

FLOA T64 , F64 目标码 允许使用双精度浮点数

HCOMPACT , HCO 目标码 选择 HCOMPACT 存储模型 (仅用于 C167 )

HLARGE , H LA 目标码 选择 H LARGE存储模型(仅用于 C167)

HOLD, H L 目标码 为对象分配存储空间

I NCDIR , ID 源程序 指定头文件的路径

[ NO] INIT , [ NO] IN 目标码 允许/ 禁止变量的初始化

LARGE , LA 目标码 选择 LARGE存储模型

LISTINCLUDE , LC 列表文件 列表文件中包括头文件的内容

MEDIUM , ME 目标码 选择 MEDIUM 存储模型

MOD167 目标码 允许使用 C167 指令

NOALI AS, NOAL 目标码 禁止优化时指针的别名检查

NOAMAKE , NOAM 目标码 编译时不产生用于μVision的更新信息

NODPPSAVE , NODS 目标码 进入中断时不保存 DPP0 和 DPP3 寄存器内容

NOEXT END 源程序 禁止源代码的 C166 扩展

NOFIXDPP , NOFD 目标码 目标码不使用缺省的 DPP 寄存器

OP TIMIZE , OP 目标码 设置编译器的优化级别

ORDER 目标码 变量以源文件中出现的次序安排

PAGEL ENGT H , PL 列表文件 列表文件中每页的行数

PAGEWIDT H , PW 列表文件 列表文件中每行宽度

PECDE F, PD 目标码 保留 PEC通道

PREPRIN T , PP 列表文件 产生宏扩展后的预处理列表文件

[ NO] PRINT , [ NO ]PR 列表文件 指定列表文件的文件名或不输出列表文件

RE ENTRNANT 目标码 自动变量保存在用户堆栈中 ,产生可重入的目标码

REGFILE , RF 目标码 指定全局寄存器优化的寄存器定义文件

RENAMECLASS , RC 目标码 更改目标文件中的预定义类名

SMALL , SM 目标码 选择 SMALL存储模型 (缺省 )

SRC 目标码 产生汇编代码文件 ,不产生目标文件

STATIC 目标码 使用静态地址保存自动变量 ,产生的目标代码不可重入 ,但速度较快

SYMBOLS ,SB 列表文件 在列表文件中包括所有模块中用到的符号

TINY , TY 目标码 选择 TINY 存储模型

UNSIGNED_CH AR , UCH 目标码 把 char 作为 unsigned char

WARNING 列表文件 把列表文件中警告按错误看待或禁止一种警告

WARNINGLEVE L , WL 列表文件 选择警告的级别

第 9 章 C语言编程

Page 345: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

334

9 .3 C语言的扩展

为了能够更有效地对 C166 体系结构提供直接的支持 , C166 编译器为 ANSI 标准 C

语言提供了多种扩展 ,包括存储模型、存储类型、数据类型等 ,并增加了一些新的关键字。

9 .3 .1 关键字

针对 C166 结构的许多特性 , C166 编译器在 C 语言的基础上增加了许多新的关键

字 ,也可以通过使用 NOEXT END编译控制参数来取消这些扩展。表 9-5 列出了新增加

的关键字。

表 9-5 新增加的关键字列表

bdata in terrupt near _ tas k_ using xhuge

bit fa r sbit huge sdata sfr

idata

9 .3 .2 存储模型

C166 编译器可支持 7 种存储类型。除 TINY 存储模型以外 , C166/ C167 CP U 总是

以分段方式工作。存储模型定义了变量和函数定义的默认存储类型。如果对存储类型作

了显式定义 ,则存储模型的限制可以不予考虑。通过使用存储类型 near 或 idata ,可以提

高对实时变量的访问性能。表 9-6 列出了 7 种存储模型。

表 9-6 存 储 模 型

TINY

是 C166/ C167唯一的一种 CPU 处于非分段工作方式下的存储模型。它产生高效的 16 位线性地址 ,并把代码和数据限制在 64KB 中。在这种存储模型中 ,不能使用fa r , huge和 xhuge存储类型

SMAL L

使用分段 CPU 方式。变量存放在 near区域 ,函数调用将产生 near 调用。它产生同TINY 一样高效的代码 ,但是代码和数据不再限制在 64KB 中。用户可以通过 far ,

huge和 xhuge存储类型引用变量和函数 ,这些存储类型能够使 C166/ C167 的地址容量得到充分利用

COMPACT 同 SMALL相似。不同的是 ,存储类型 far 通过 HOLD编译控制参数用于那些比定

义需要更多空间的变量。这一存储模型适合 C166 CPU 用于代码少而数据多的场合

HCOMPACT

同 SMAL L相似。不同的是 ,存储类型 huge通过 HOLD 编译控制参数用于那些比

定义需要更多空间的变量。这一存储模型适合 C167 CPU 用于代码少而数据多的场合。HCOMPACT 存储模型不适用于 C166 CPU

亿恒 C164CI 16 位单片机

Page 346: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

335

续表

MEDIUM 同 SMALL 相似。不同的是 ,所有的函数调用默认为 far 调用。这一存储模型适合用于代码多而数据少的场合

LARGE

使用分段 CPU 方式。当根据 HOLD 编译控制参数指明需要更多空间时 ,所有变量都存放在 far 存储器里。所有函数的默认调用为 far 调用。这一存储模型适合 C166

CPU 用于代码和数据多的场合

HLARGE

使用分段 CPU 方式。当根据 HOLD 编译控制参数指明需要更多空间时 ,所有变量

都被存放在 huge 存储器里。所有函数的默认调用为 fa r 调用。这一存储模型适合C167 CPU 用于代码和数据多的场合。H LARGE存储器不适用于 C166 CPU

这 7 种模型有各自的优缺点 ,特别是在访问效率和地址空间大小方面。因此 , C166

编译器支持多种模型的混合使用。同样 ,定义对象的句法对有关存储类型也作了扩展。

需要注意的是 ,存储模型与外部、静态等属性毫无关系。如果在一个变量或函数定义中没

有指明存储类型 ,则按照选择的存储模型使用默认存储类型。

9 .3 .3 存储类型

结合关键字 sfr 和 sbit ,存储类型可以实现对 C166/ C167 系统所有硬件部分的访问。

任何变量都可以通过存储类型 ( near , idata , bdata, sdata, far , huge , xh uge)确定地址空

间 ,见表 9-7。因为访问内部数据存储器要比访问片外数据存储器快得多 , 16 位访问比 32

位访问快 ,所以将常用的变量放在内部数据存储器。用 far , huge或 xhuge存储类型存放

大的数据对象可以提高程序的效率。

表 9-7 存 储 类 型

存储类型 C166/ C167 地址空间

near

16 位指针、16 位地址允许用于 :

· 16KB空间用于 NDA TA 组变量 · 16KB空间用于 NCONST 组常量 · 16KB空间用于 SDATA 组的系统空间

结合 L166 的连接控制参数 DPPUSE , 最大可以拥有 64KB 的 NDA TA/ NCONST

组。指定一个函数为 near 类型 ,将产生对这个函数的 CALLA 或 CALLR 调用 ( 16 位响应)

idata 80C166 的片上 RAM ,对变量的访问速度最快

bdata 80C166 的片上可位寻址 RAM ,支持对位和字节的混合访问 (最多 256B)

sdata 系统空间 (地址空间 0C000 H~0FFFFH ) ,可用于 PEC寻址对象的定义

fa r

32 位指针 ,通过 16 位地址可以访问到全部地址空间。单对象 (数组或结构体 )的容量上限是 16KB。如果一个函数指定为 far 类型 ,将产生对这个函数的 CALLS(分段响

应)调用。far 是 80C166 CPU 上用于访问其 256KB地址空间的最优存储类型

huge 32 位指针 , 16 位地址支持上限是 64KB大小的对象。huge是 C167/ C165 CPU 用于访问其 16MB地址空间的最优存储类型

xhuge 32 位指针 , 32 位地址支持大小无上限的对象

第 9 章 C语言编程

Page 347: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

336

用存储类型定义变量举例。

char idata var1 ;

sta tic unsigned long far array[100] ;

extern float near x , y , z;

extern unsigned in t xhuge vector [100] [100] ;

unsigned char sda ta pec_buffe r[100 ] ;

char bdata flags ; sbit flag0 = flags 〈0 ;

用存储类型定义函数举例。

/ * function with′NEAR′CALL and RE T inst ruction * /

void near func1 (char * p) {

* p = 1;

}

注意 : near存储类型可应用于 MEDIUM 或 LARGE存储模型中的静态函数 ,以此来

加速对该函数的调用 , 并节省堆栈空间。

/ * function with′segmented′CALLS and RETS inst ruction * /

void far func2 ( char * p) {

* p = 1; }

如果在变量定义中没有定义存储类型 ,将使用默认的存储类型 ,见表 9-8。默认的存

储类型取决于当前的存储模型 TINY , SMALL , COMPACT , H COMPACT , MEDIUM ,

LARGE 或 H LARGE。

表 9-8 存储类型的默认值

存 储 模 型 变 量 函 数

TINY near near (上限为 64KB代码 )

SMALL near near (上限为 64KB代码 )

COMPACT far near (上限为 64KB代码 )

HCOMPACT(不适用于 C166 CPU ) huge near (上限为 64KB代码 )

MEDIUM near far (代码大小无上限)

LARGE far far (代码大小无上限)

H LARGE(不适用于 C166 CPU ) huge far (代码大小无上限)

1 . ROM 对象的定义

一个对象可以通过修饰符 const 定义为常量。常量对象的初始化通常在文件一级。

这样的对象通常放在 ROM 空间里。 const 修饰符可以同存储类型 near , fa r 和 huge 结

合。C166 编译器可识别这三种不同的 const 区域。

用 const 定义变量举例如下 :

const char test [ ] = ″This is a tex t st ring″;

亿恒 C164CI 16 位单片机

Page 348: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

337

const int tab le [2 ] [2 ] = { 0 , 2 , 4 , 8 } ;

const float far pi = 3 .1415927;

const long xhuge vectors[ 10000 ] = { 1 , 67890 } ;

const unsigned char near mask [ ] = { 0x01 , 0x02 , 0x04 , 0x08 } ;

2 .变量访问的代码比较

下面的例子显示了 C166 和 C167 CP U 使用不同存储类型所产生的代码 ,通过对比

可以估计程序所产生的代码。因为 C166 CP U 缺乏直接支持 huge/ xhuge 变量的指令 ,

所以 C166 代码通过使用运行时间库函数来访问 huge 和 xhuge 变量。而 C167 CPU 只

在访问 xh uge空间内的 long , float 或 double变量时才使用运行时间库函数。

变量定义举例如下 :

unsigned in t near near_arr [ 10 ] ;

unsigned in t fa r far_arr [10 ] ;

unsigned in t huge huge_arr [10] ;

unsigned in t xhuge xhuge_arr [10] ;

unsigned long xhuge xhuge_larr[10] ;

C166 和 C167 CPU 的 C 源代码和所产生的汇编代码比较如下 :

unsigned long function ( unsigned int i ) {

i = near_arr [ i] ;

C166 代码 C167 代码

MOV R4 , R8 MOV R4 , R8

SH L R4 , # 1 SH L R4 , # 1

MOV R8 , [ R4 + # near_arr ] MOV R8 , [ R4 + # near_arr ]

i = far_arr[ i] ;

C166 代码 C167 代码

MOV R4 , R8 MOV R4 , R8

MOV DPP0 , # PAG ( far_arr) SH L R4 , # 1

SH L R4 , # 1 EXT P # PAG (far_arr) , # 1

MOV R8 , [ R4 + # far_arr ] MOV R8 , [ R4 + # far_arr ]

i = huge_arr[ i ] ;

C166 代码 C167 代码

MOV R4 , R8

SH L R4 , # 1

MOV R2 , # SOF ( huge_arr)

MOV R3 , # SEG ( huge_arr )

ADD R2, R4

CALLA cc_UC, ? C_ HLOADI MOV R8, R4

MOV R4 , R8

SH L R4 , # 1

EXTS # SEG (huge_arr ) , # 1

MOV R8 , [ R4 + # huge_arr)

第 9 章 C语言编程

Page 349: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

338

i = xhuge_arr [ i] ;

C166 代码 C167 代码

MOV R5 , # 0

ADD R4, R4

ADDC R5 ,R5

MOV R2 , # SOF ( xhuge_arr)

MOV R3 , # SEG ( xhuge_arr)

ADD R2, R4

ADDC R3 ,R5

CALLA cc_UC, ? C_ HLOADI

MOV R8 , R4

MOV R4 , R8

MOV R5 , # 0

ADD R4, R4

ADDC R5 ,R5

ADD R4, # SOF ( xhuge_arr )

ADDC R5 , # SEG ( xhuge_arr)

EXTS R5 , # 1

MOV R8 , [ R4 ]

return ( xhuge_larr[ i] ) ;

}

C166 代码 C167 代码

MOV R5 , # 0

ADD R4, R4

ADDC R5, R5

ADD R4, R4

ADDC R5, R5

MOV R2 , # SOF ( xhuge_larr)

MOV R3 , # SEG (xhuge_larr)

ADD R2, R4

ADDC R3, R5

CAL LA cc_ UC, ? C_ H LOADL

RE T

MOV R4 , R8

MOV R5 , # 0

ADD R4, R4

ADDC R5, R5

ADD R4, R4

ADDC R5, R5

MOV R2 , # SOF ( xhuge_larr)

MOV R3 , # SEG (xhuge_larr)

ADD R2, R4

ADD R3, R5

CAL L cc_UC , ? C_ HLOADL

RE T

3 .指针定义中的存储类型

存储类型也可以用于指针定义来指明指针的大小 ,使得每个变量访问都能产生高效

的代码。一般来说 ,指针应该按下面的法则来定义 (见表 9-9 )。在 TINY 模型中不必定

义指针的存储类型 ,因为每个对象都是通过一个 16 位的地址访问的。

表 9-9 存储类型的指针定义

变 量 定 义 指针大小 指 针 定 义

char c ; 16/ 32 位 char * ptr ; (指针大小取决于所用的存储类型 )

int near nc; 16 位 in t near * np ;

float sdata nf ; 16 位 float sdata * sp ;/ * or * / floa t near * sp ;

long bdata x ; 16 位 long bdata * xp ;/ * or * / long near * xp ;

char idata index; 16 位 char ida ta * ip ;/ * or * / char near * ip ;

指向 sdata , idata或 bdata对象的指针也可以用 near 存储类型来定义 ,因为一个 near 指针可以用一个 16位的逻辑地址来保持所有对象的 DPP 数

亿恒 C164CI 16 位单片机

Page 350: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

339

续表

变 量 定 义 指针大小 指 针 定 义

const char near n = 5; 16 位 char near * cp;/ * const can be ignored * /

unsigned long far l ; 32 位 long far * lp ;

char huge hc ; 32 位 char huge * hc_pt r ;

long xhuge xf ; 32 位 char xhuge * hl_pt r ;

void near unc1( void) 16 位 void ( near * fp1) ( void) ;

int fa r func2 ( void ) 32 位 in t ( far * fp2) ( void) ;

near 目标也可以用 far , huge 或 xhuge 指针来访问。区别在于 fa r , huge 或 xhuge

指针访问总是产生 DP P寄存器或 EXTS/ EXTP指令 ,而一个 near 指针访问使用预存储

DPP寄存器。一个 fa r , h uge或 xhuge对象不能用一个 near 指针来访问。

指针定义举例如下。

char near * px ;

在 near 存储类型中定义了一个指向 char 类型对象的指针。指针本身存放在默

认的存储类型中 (取决于所使用的存储模型 ) ,大小为 2 字节。

char near * idata pdx;

无论使用什么存储模型 ,指针本身都明确存放在内部数据存储器 ( ida ta )中。除

此以外 ,这个定义同上一个相同。

struct time {char hour ; char sec; str uct time near * pxtime; } ;

除其他元素以外 ,所示结构体包含了一个指针 pxtime ,这个指针指向另一个必

须放在 near 存储类型 ( near , idat a, sdata , bdata )里的结构体。指针 pxtime 的

大小为 2 字节。

struct time far * ptime;

定义了一个存储在默认存储类型的指针 ,该指针指向一个存放在 far 存储类型

里的结构体 time。指针 ptime需要 4 字节。

ptime - > pxtime - > hour = 12;

用于前两个定义。指针 pxtime 是从结构体中间接存放的 ,它指向存放在 near

存储类型中的结构体 time中。将值 12 赋予该结构体中的成员 hour。

4 .隐含存储类型

如果在一个变量定义中省略了存储类型的说明 ,则自动选取默认或隐含的存储类型。

不能存放在寄存器内的函数自变量和自动变量也存放在默认的存储器区域。对于全局变

量 ,使用 HOLD编译控制参数可规定容量和改换一种默认存储器空间。默认存储类型由

TINY , SMALL , COMPACT , HCOMP AC T , MEDIUM , LARGE和 HLARGE 编译器

控制指令决定。

9 .3 .4 数据类型

C166 编译器支持多种可在 C 程序中使用的基本数据类型。C166 编译器不仅支持标

第 9 章 C语言编程

Page 351: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

340

准的 C 数据类型 ,而且还支持许多 C166/ C167 平台所特有的数据类型。各种数据类型参

见表 9-10。

表 9-10 数 据 类 型

数 据 类 型 大 小 值 的 范 围

bit * 1位 0 或 1

signed char 1字节 - 128~ + 127

unsigned char 1字节 0~255

signed in t 2字节 - 32768~ + 32767

unsigned int 2字节 0~65535

signed long 4字节 - 2147483648~ + 2147483647

unsigned long 4字节 0~4294967295

Float 4字节 + / - 1 ,176E - 38~ + / - 3 ,40E + 38

Double 8字节 + / - 1 ,7E - 308~ + / - 1 ,7E + 308

Poin ter 2/ 4 字节 目标的地址

用于 SFR 访问的数据类型

sbit * 1位 0 或 1

sfr * 2字节 0~65535

* ANSI C 不支持 bit , sbit 和 sfr ,它们是 C166 特有的。这些数据类型将在下面详

细讨论。

1 .位类型

C166 编译器提供了一个位数据类型 ,它可用于变量定义、自变量列表和函数返回值。

一个位变量的定义和其他 C 数据类型的定义相同。

位数据类型举例如下。

sta tic bit done_flag = 0 ; * 位变量 * /

bit testfunc ( ) / * 位函数 * /

{ return (0) ; / * 位返回值 * /

}

所有的位变量都存放在 C166/ C167 的位存储区域中的一个位段。由于这个区域只

有 256 字节长 ,因此 ,最多定义 2048 个位变量。自动位变量将存放在 CPU 寄存器 R14

和 R15 中 ,这将把一个函数内部的自动位变量数目限制在 32 个以内。

下列限制适用于位变量和位定义 :

( 1) 使用禁止中断 ( # pragma disab le )的函数和使用明确寄存器组 (用 n)的函数不能

返回一个位值。当试图返回一个位类型的值时 , C166 会产生错误信息。

(2 ) 一个位变量不能定义为指针。例如 :

bit * prt ; / * 非法定义 * /

(3 ) 位类型的数组也是不合法的。例如 :

亿恒 C164CI 16 位单片机

Page 352: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

341

bit ware[5 ] ; / * 非法定义 * /

2 .可位寻址对象

可位寻址对象是那些可以用字、字节或位来寻址的对象。只有占用内部存储器的

C166 可位寻址区域的对象才属于这一类。C166 编译器把定义为 bdat a存储类型的变量

存放在这一可位寻址区域。用 bda ta类型定义的变量必须是全局变量。下面是可位寻址

对象的一些例子。

in t bda ta ibase; / * 可位寻址的整型变量 * /

char bdata bary [ 4] ; / * 可位寻址的数组 * /

变量 ibase和 bary 是可位寻址的 ,因此 ,这些变量自身的位可以被直接访问和修改。

可以用 sbit 关键字来定义一个新的变量 ,该变量可以访问被定义为 bdat a的变量中的位。

例如 :

s bit mybit0 = ibase 〈0 ; / * ibase的位 0 * /

s bit mybit15 = ibase 〈15; / * ibase的位 15 * /

s bit Ary07 = bary[0 ] 〈7 ; / * bary[ 0]的位 7 * /

s bit Ary37 = bary[3 ] 〈7 ; / * bary[ 3]的位 7 * /

上面的例子只表示定义 ,而不是分配已在上面定义过的 ibase和 bary 中的位。

字符“ 〈”后面的表达式说明了用该定义访问的位的位置。该表达式必须是一个常

量 ,值的范围取决于定义中的基本变量的类型。对于 char 和 unsigned char ,范围是 0~

7;对于 in t , un signed in t , shor t 和 unsigned short ,范围是 0~15;对于 long 和 unsigned

long ,范围是 0~31。可以为 sbit 提供外部变量定义 ,用于访问其他模块中的这些类型。

例如 :

extern bit mybit0 ; / * ibase的位 0 * /

extern bit mybit15 ; / * ibase的位 15 * /

extern bit Ary07 ; / * bary[ 0]的位 7 * /

extern bit Ary37 ; / * bary[ 3]的位 7 * /

定义 sbit 类型变量时 ,要求基本对象是 bdat a存储类型 ,但特殊功能寄存器的位变量

例外。下面的例子说明了如何更改 ibase和 bary 中的位。

Ary37 = 0 ; / * bary[ 3]的位 7置 0 * /

bary[ 3] = ′a′; / * 字节寻址 * /

ibase = - 1 ; / * 字寻址 * /

mybit15 = 1; / * ibase的位 15 置 1 * /

除了片上数据存储器可位寻址部分中 bdat a定义的变量 , bdat a存储类型同 idata 存

储类型的处理是一样的。这一存储区域的大小不能超过 256 字节。除了为标量类型定义

sbit变量外 ,还可以对结构体和共同体定义 sbit变量。例如 :

第 9 章 C语言编程

Page 353: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

342

union lf t {

float mf ;

long m1; } ;

bdata struct bad {

char m1;

union lf t u ; } tcp ;

s bit tcpf31 = tcp .u .ml 〈31; / * float类型的位 31 * /

s bit tcpm10 = tcp .m1 〈0;

s bit tcpm17 = tcp .m1 〈7;

不可以对一个 float 变量中的位指明为位变量。可以在一个共同体内包括一个 float

和一个 long 变量 ,然后就可以定义位变量来访问 long 类型变量中的位。

3 .专用寄存器

C166/ C167 为访问专用寄存器 ( SFR )提供了一个特殊的存储区域。SFR 用于控制

定时器、计数器、输入输出端口和其他外围设备。SFR 存放在 0xFE00 H~0xFFDE H 和

0xF000H~0xF1DEH 范围的地址空间 ,并且可以按位、字节和字寻址方式访问。

在 C166/ C167 系列单片机中 , SFR 的数量和类型各有不同。C166 编译器并不预先

定义 SFR 名称 ,但可在包含文件中提供 SFR 的定义。

C166 编译器为各种 166 衍生产品提供了多种包含文件。每个文件包含了该种单片

机的 SFR 的定义。

C166 编译器通过 sfr 和 sbit 数据类型访问 SFR。下面将讨论每种数据类型。

(1 ) sfr数据类型

SFR 和其他 C 变量的定义方式一样 , 唯一的区别是数据类型被指定为 sfr ,而不是

char 或者 int。例如 :

sfr P0 = 0xFF00 ; / * 端口 P0 ,地址 FF00 H * /

sfr P1 = 0xFF04 ; / * 端口 P1 ,地址 FF04 H * /

P0 和 P1 是 SFR 的名称定义。sfr 变量的名称同其他 C变量的定义一样。任何符号

名都可以用于 sfr 定义。等号后面的地址说明必须是个常量 , 不允许使用带有运算符的

表达式。这一常量表达式必须是在 sfr 地址范围内 ( 00FE00 H~00FFDE H ,对于有扩展地

址的 C167 CPU 是从 00F000H~00F1DEH )。

(2 ) sbit 数据类型

典型的单片机应用中 ,经常需要访问 SFR 中的特定位。C166 编译器通过 sbit 数据

类型来实现这一功能。sbit数据类型允许访问可位寻址 SFR ,也可以使用保留字 sbit 访

问可位寻址目标。参见下面的例子。

s bit IEN = PSW 〈11 ;

这一语句定义了 IEN 为地址 PSW 〈11 的 SFR 位。在 C166 中 ,这是 PSW 寄存器中

的总的中断允许位。

亿恒 C164CI 16 位单片机

Page 354: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

343

任何符号名都可以用于 sbit 定义。表达式等号右边的部分为该名称指定了一个绝

对的位地址。有两种方法可以用来指定这一地址。

方法一 , sfr_name 〈bit_position

这种方法以一个专用寄存器的地址为基础。 sfr_ name 必须是一个已定义过的 SFR

的名字。字符“ 〈”后面的参数定义了该位在 SFR 中的位置。bit_ position 必须是一个

0~15 之间的数。例如 :

sfr PSW = 0xFF10;

s bit USR0 = PSW 〈6 ;

sfr ADCON = 0xFFA0 ;

s bit ADBSY = ADCON 〈8 ;

方法二 , sfr_address 〈bit_position

这种方法以一个 sfr_ address 说明为基础。sfr _address 必须是一个从 00FF00 H~

00F FDEH 或从 00F000 H~00F1DEH 范围的值。bit_position 必须是一个 0~15 之间的

数。例如 :

s bit ADBSY = 0xFFA0 〈8 ;

s bit USR0 = 0xFF10 〈6;

专用寄存器中的位代表了一个单独定义的类 ,不允许同其他的位定义或位域互换。

4 .寄存器组定义

C166/ C167 为那些只能存放在片上 RAM 的各种寄存器组提供支持。C166 最多可

允许定义 128 个寄存器组 ,每个寄存器组可包含多达 16 个寄存器 ( R0~R15)。当前状态

的寄存器组的基地址由特殊功能寄存器 CP 指明。如果使用关键字 using定义函数 ,则在

函数中将使用一个新的寄存器组 ,编译器会产生一个用于改变寄存器组 ,并保留先前 CP

值的函数入口进程。函数的出口进程保留了旧的 CP 值。当函数执行完以后 ,将重新选

定先前的寄存器组。

使用独立的不同寄存器组的优点是能提高中断过程和实时操作系统的性能。当发生

中断或状态改变而需要改变当前的寄存器组时 ,只需要保存 CP 值。否则的话 ,在中断过

程或任务被执行前 ,必须保存整个寄存器组。

具有寄存器组定义的函数语句为

[ return type ] functionname ( [ parameters ] ) using rbank_id

rbank_id 是一个在连接/ 定位过程中识别寄存器组的寄存器组名称。通过 rbank_id ,

可以在多个函数中使用同一个寄存器组。较好的做法是对于同一优先级的中断使用同一

寄存器组名称。因为具有同一优先级的中断函数不能彼此中断 ,所以当中断执行时寄存

器组未被使用。例如 :

void rb_func( void) using my_rbank{

/ * . . . * /

第 9 章 C语言编程

Page 355: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

344

}

属性 using my_ rban k 指明了在执行函数 rb_func 时 , my_ rbank 为当前使用的寄存

器组。使用属性不允许用于外部函数。使用属性将影响函数的目标代码 ,目标代码首先

把当前 CP寄存器的值在函数入口处保存 ,然后按照所要选定的寄存器组指定寄存器 CP

的值。在函数退出前 ,恢复寄存器 CP 原先的值。下面的例子示出了使用属性的应用和

在函数的入口进程和出口进程中产生的代码序列。

stmt level source

1

2 extern bit ala rm ;

3 int ala rm_count ;

4 extern void alfunc ( bit b0 ) ;

5

6 void fala rm ( void) using f_registers {

7 1 ala rm_count + + ;

8 1 alfunc (ala rm = 1 ) ;

9 1 }

编译后的汇编代码为

; FUNCTION falarm ( BEGIN RMASK = @0x3FFF )

0000 F6F00000 R MOV f_registers , R0

0004 C6090000 R SCXT CP , # f_registers

0008 CC00 NOP

; SOURCE LINE # 6

; SOURCE LINE # 7

000 A 248F0000 R SUB alarm_count , ONES

; SOURCE LINE # 8

000E 0F00 E BSET alarm

0010 CA000000 E CALL A cc_ UC, alfunc

; SOURCE LINE # 9

0014 FC09 POP CP

0016 CB00 RE T

; FUNCTION fala rm ( END RMASK = @0x3FFF )

9 .3 .5 中断函数

C166 编译器支持 C 语言的中断函数编程 ,因此 ,基本上不需要用汇编语言来编写中

断函数。

1 .中断函数定义

中断函数句法定义为

亿恒 C164CI 16 位单片机

Page 356: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

345

void functionname ( void) interrupt vector_definition [ using rbank_id]

其中 vector_definition 可以在以下几种中选择一种 :

inte rrupt_ id = t rap_number

或 inte rrupt_ id

或 t rap_number

中断属性 ( in terrup t )把参数定义为中断向量。C166/ C167 开发环境允许以符号或数

值的形式定义一个中断向量 , 因此 , vector _ definition 可以是用符号表示的中断向量名

( in terrup t_id)、中断号 ( t rap_number)或两者的结合。中断向量名允许用 L166 控制参数

INTNO来定义向量地址 ;而中断号则直接在 C 源代码内定义中断向量的绝对地址。

如果指明了中断号 ,中断向量地址根据以下公式计算 :

vector_address = t rap_number * 4

中断属性不能用于外部函数。使用属性 ( using )将影响函数的目标代码。在函数入

口处 ,专用寄存器 MDC, MDL 和 MDH 的状态 (如果需要的话 )将被压入堆栈。

如果没有使用寄存器组切换 (使用属性 ) ,所有在中断函数中用到的正在工作的寄存

器 ( Rnn)将压入堆栈。在函数退出前 , 所有堆栈中存储的寄存器状态将恢复 (从堆

栈弹出 )。

最后 ,函数由 C166 汇编指令 RET I(从中断返回 )终止。

下面的程序将显示中断属性的使用和函数入口进程和出口进程的具体代码。在本例

中 ,使用属性也被指定 ,并且为寄存器组切换产生了代码。

中断函数举例如下。

stmt level source

1 extern bit ala rm ;

2 int ala rm_count ;

3 extern void alfunc ( bit b0 ) ;

4

5 void fala rm ( void) interrupt 0x21 using f_regs {

6 1 ala rm_count + + ;

7 1 alfunc (ala rm = 1 ) ;

8 1 }

编译后的汇编代码如下。

; FUNCTION falarm ( BEGIN RMASK = @0x7FFF )

; SOURCE LINE # 5

0000 C6030300 SCXT DPP3 , # 03 H

0004 CC00 NOP

0006 F6F00000 R OV f_regs , R0

000 A C60800C0 R SCXT CP , # f_ regs

000E CC00 NOP

第 9 章 C语言编程

Page 357: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

346

0010 EC00 PUSH DPP0

0012 C6871000 SCXT MDC , # 010 H

0016 EC06 PUSH MDH

0018 EC07 PUSH MDL

001 A 248F0000 R SUB alarm_count , ONES ; SOURCE LINE # 6

001E 0FFF BSE T R15 .0 ; SOURCE LINE # 7

0020 4AFF0000 E BMOV alarm , R15 .0

0024 CA000000 E CALLA cc_UC, alfunc

0028 FC07 POP MDL ; SOURCE LINE # 8

002 A FC06 POP MDH

002C FC87 POP MDC

002E FC00 POP DPP0

0030 FC08 POP CP

0032 FC03 POP DPP3

0034 FB88 RE TI

; FUNCTION fala rm ( END RMASK = @0x7FFF )

2 .注意事项

中断函数的编程必须遵守下面的规定 :

(1 ) 不支持参数传递。当中断函数包含有参数定义时 ,编译器将产生出错信息。

(2 ) 不支持返回值。若企图定义一个返回值 ,编译器将产生出错信息。对于任何中

断函数的定义 ,都必须使用 void 返回类型。

(3 ) 编译器会识别直接调用中断函数并予以拒绝。必须使用内部函数_t rap_调用中

断函数。因为中断函数以 RETI 指令退出 ,而 R ETI 恢复 PSW 的值 ,并影响 C166/ C167

中断系统 ,因此 ,调用中断函数时必须使用汇编指令 T RA P。

(4 ) 如果在中断函数中指明了中断号 , L166 连接/ 定位器产生一个中断向量。该向

量包括一个跳转到中断过程的指令。通过编译控制参数 NOVEC TAB 可以抑制这些向

量的产生。

(5 ) 由于 C166 库函数 (除 I/ O 系列和存储器分配 )是可重入的 ,故调用这些函数是不

受任何限制的。C166 为自动变量提供了一个堆栈 ,如果一个 C166 函数在函数执行中只

使用自动变量 ,它就是可重入的。

(6 ) C166 从来不为寄存器访问产生绝对地址。每个 C166 函数都独立于实际使用中

的寄存器。这就意味着一个中断函数可以不受任何限制地调用任何 C 标准函数。

如果中断函数比较精练 ,通常取消使用属性。C166 编译器将把使用的寄存器压入堆

栈 ,产生的代码效率会较高。可以比较一下使用和没有使用带有 C166 CODE 指令的使

用属性所产生的代码。

9 .3 .6 寄存器屏蔽

C166 编译器支持寄存器屏蔽 ,它可应用于函数原型和外部函数定义。寄存器屏蔽指

亿恒 C164CI 16 位单片机

Page 358: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

347

明在函数执行过程中哪些寄存器被改变了 ,便于编译器优化代码的寄存器分配。为了使

程序性能达到最优 ,建议当使用外部函数或传递调用时指明一个寄存器屏蔽。

寄存器屏蔽语句是为了与 C166 版本 1 兼容而提供的。R EGFILE 编译控制参数可

以起到同样的功能。REG FILE 编译控制参数通过 C166 编译器和 L166 连接器进行全局

寄存器优化 ,并为寄存器屏蔽提供一个自动定义。建议使用 REGFILE 编译控制参数 ,而

不是使用寄存器屏蔽。

寄存器屏蔽定义的语句为

[ex tern] [ returntype] functionname ( [ parameters] ) @reg_mask

其中 reg_mask 是一个 16 位数 ,用来指出哪些寄存器可以被该函数改变。 reg_mask 的每

一位都代表一个 C166/ C167 寄存器。 reg_mask 的意义如表 9-11 所示。

表 9-11 寄存器屏蔽中的寄存器分配

位 15 14 13 12 11 10 9 8

寄存器 — DPP3 MDX R12 R11 R10 R9 R8

位 7 6 5 4 3 2 1 0

寄存器 R7 R6 R5 R4 R3 R2 R1 DPP0

表 9-11 中 ,寄存器的作用如下 :

DPP3 DPP3 寄存器 ,用于 C166 上的存储图像和字符串的复制和比较函数。

MDX MDL , MDH 和 MDC 寄存器 ,用于乘法和除法。

R1~R12 R1~R12 寄存器。寄存器 R13 , R14 和 R15 由调用函数存放 ,而这些寄

存器不被调用函数改变。

DPP0 DPP0 寄存器 ,用于在 C166 上对 fa r , h uge和 xhuge的访问。

有两个寄存器屏蔽特殊值表示寄存器没有使用或全部使用 :

0 表示所有的寄存器都在使用。这是在函数原型中没有指明寄存器屏蔽时的默

认值。

0x8000 表示该函数不改变任何寄存器。这一值对于那些从来不返回调用者的函

数 (如 exit ( ) )非常有用。

当使用编译控制参数 CODE 时 , C166 在产生的目标代码汇编列表中显示已编码函

数的寄存器屏蔽。寄存器屏蔽 ( R MASK)将在函数的开头和结尾显示出来。程序举例

如下。

stmt level source

1

2

3 in t increment ( in t a ) {

4 1 return (a + 1 ) ;

5 1 }

编译后的汇编代码如下。

第 9 章 C语言编程

Page 359: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

348

; FUNCTION increment (BEGIN RMASK = @0x0010 )

; ---- Variable′a′assigned to Register′R8′---

0000 F048 MOV R4, R8 ; SOURCE LINE # 4

0002 0841 ADD R4, # 01 H

0004 CB00 RE T ; SOURCE LINE # 5

; FUNCTION increment ( END RMASK = @0x0010)

函数 increment 的寄存器屏蔽是@0x0010。

9 .3 .7 实时任务

C166 支持 RTX166 Full和 RTX166 T iny实时多任务操作系统。_task_关键字可以

将一个函数定义为一个实时任务 ,例如 :

void func (void) _task_ num

其中 num 是一个任务的 ID 号 , 对于 R TX166 Full 是 0~ 255; 对于 R TX166 Tiny

是0~31。

任务函数必须定义为 void 返回类型 ,传递参数也必须是 void 类型。

9 .4 C和汇编混合编程

在很多情况下需要 C 函数和汇编函数的互相调用 ,例如使用过去已经编写好的汇编

函数。采用汇编函数编写核心代码可以提高运行效率 ,或在汇编代码级直接对 SFR 和映

射到内存上的 I/ O设备进行操作。

C166 可以方便地与 166 汇编代码衔接。在一定的编程规则约束下 , C 函数可以调用

汇编函数 ;反过来 ,汇编函数也可以调用 C函数。C 程序可以访问汇编模块中定义的全局

变量。在互相调用时 ,需要注意的是参数的传递和函数返回值的转换。从实际应用的角

度来说 ,被调用的汇编函数看起来应该像一个编译后的 C函数。

9 .4 .1 参数传递

C函数的参数传递是通过寄存器或用户堆栈来实现的。如果使用堆栈 , 则通过

[ R0 +偏移量 ] 指令完成。当参数少于或等于 5 个时 ,可以通过寄存器 R8~R12 传递 ,能

够达到和汇编代码相当的效率。如果所有的寄存器都被占用了 ,则只能通过用户堆栈传

递参数。位类型的参数通过 R15 寄存器传递。下面是几个参数传递的例子。

func1 ( char a ) / * 第 1 个参数通过 R8 传递 * /

func2 ( in t b , / * 第 1 个参数通过 R8 传递 * /

亿恒 C164CI 16 位单片机

Page 360: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

349

inc c , / * 第 2 个参数通过 R9 传递 * /

inc near * d , / * 第 3 个参数通过 R10 传递 * /

char e , / * 第 4 个参数通过 R11 传递 * /

char f ) / * 第 5 个参数通过 R12 传递 * /

func3 ( long g , / * 第 1 个参数通过 R8 和 R9传递 * /

in t far * h , / * 第 2 个参数通过 R10 和 R11 传递 * /

in t i , / * 第 3 个参数通过 R12 传递 * /

long j ) / * 第 4 个参数通过用户堆栈传递 * /

func4 ( double k , / * 第 1 个参数通过 R8 ,R9 , R10 , R11 传递 * /

long l ) / * 第 2 个参数的低位字节通过 R12 传递 * /

/ * 第 2 个参数的高位字节通过用户堆栈传递 * /

func5 ( bit m , / * 第 1 个参数通过 R15 .0 传递 * /

bit n ) / * 第 2 个参数通过 R15 .1 传递 * /

func6 ( char o , / * 第 1 个参数通过 R8 传递 * /

bit p , / * 第 2 个参数通过 R15 .0 传递 * /

char q , / * 第 2 个参数通过 R9 传递 * /

bit r ) / * 第 2 个参数通过 R15 .1 传递 * /

9 .4 .2 函数的返回值

函数的返回值按照表 9-12 的定义通过寄存器传递。

表 9-12 函数返回值的定义

返 回 类 型 使用的寄存器 意 义

位类型 R4 .0

(无符号 )字符 RL4

(无符号 )整型 R4

(无符号 )长整型 R4 , R5 R4 保存低位 , R5 保存高位

浮点类型 R4 , R5 32 位 IEE E格式 , R5 保存指数和符号位

双精度浮点类型 R4 , R5 , R6 , R7 64 位 IEE E格式 , R5 保存指数和符号位

near 类型指针 R4

far/ huge类型指针 R4 , R5 R4 保存偏移量 , R5 保存段

如果不能确定 C 函数会使用哪些寄存器传递参数 ,可以使用 SRC 编译控制参数 ,使

C166 编译器只产生汇编代码 ,通过检查汇编代码可以找到参数传递使用的寄存器。例如

下面的这段 C 代码 :

# pragma SRC

第 9 章 C语言编程

Page 361: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

350

# pragma SMALL

unsigned int asmfunc1 ( unsigned int a rg ) {

return ( 1 + arg ) ;

}

编译后会产生如下的汇编代码。从中可以看出 ,参数 arg 通过 R8 传递 ,函数返回值保存

在 R4 中。

; line 4 : unsigned in t asmfunc1 ( unsigned in t arg) {

asmfunc1 PROC NEAR

PUBLIC asmfunc1

; FUNCTION asmfunc1 (BEGIN RMASK = @0x0010 )

;---- Variab le′arg′assigned to Register ′R8′----

; line 5 : return ( 1 + arg) ;

MOV R4 , R8

ADD R4 , # 1

; line 6 : }

RET

; FUNCTION asmfunc1 ( END RMASK = @0x0010)

9 .4 .3 汇编函数中的寄存器使用

大多数情况下 ,汇编函数会涉及寄存器的操作。C 和汇编混合编程时 ,要求汇编程序

不能随意修改保留寄存器的内容。汇编程序编程时必须注意以下几点 :

(1 ) R0 , R13 , R14 , R15 , DPP1 , DPP2 和 DP P3 是保留寄存器。

(2 ) R1~R12 , PSW, MDL , MDH , MDC和 DPP0 寄存器可以随意使用。

(3 ) 如果汇编函数改变 DPP0 寄存器 ,就不能使用 L166 的 DP PUSE 控制命令指定

使用 DP P0 寄存器。

(4 ) 如果汇编函数改变 DPP0 或 DPP3 寄存器 ,就不能使用 C166 的 NODPPSAVE

编译控制参数。

(5 ) 当汇编函数调用 C 函数时 , C 函数有可能会改变 R1~R12 , PSW, MDL , MDH ,

MDC和 DPP0 寄存器的内容。DPP0 的内容仅当不使用 MOD167 控制命令时才会改变。

各个保留寄存器的作用如表 9-13 所示。

表 9-13 保留寄存器的作用

R0 用户堆栈指针 ,在汇编程序的结尾必须保证其内容和进入汇编函数时一致

R13 , R14 , R15 使用前必须保存其内容 ,函数返回时恢复其内容

DPP1 , DPP2 汇编程序不应使用这些寄存器

DPP3 如果汇编程序改变了 DPP3 的内容 ,返回前将其设为 3

亿恒 C164CI 16 位单片机

Page 362: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

351

9 .4 .4 数据保存格式

C函数在传递参数时 ,各个寄存器的意义和参数的类型有关 ,下面介绍各种数据类型

的保存格式。

1 .位类型 (bit)

位类型只用一个位保存 ,位类型的指针和位数组都是不允许的。位类型的变量都保

存在 C166/ C167 的可位寻址空间中。当把其他类型的变量赋值于位类型时 ,如果变量值

为 0 ,则位变量赋 0 ;否则赋 1。例如 :

bit b ;

in t v ;

b = v; / * if (v) b = 1 ; else b = 0 ; * /

2 .有符号或无符号字符类型 (signed/ unsigned char)

这两种类型用一个字节保存 (8 位 )。

3 .有符号或无符号整型 (signed/ unsigned int)

int , short 和 enum 类型都用两个字节保存 ,低位字节在前 ,高位字节在后。例如 ,整

数 0x1234 在内存中按如下顺序保存 :

地 址 + 0 + 1

内 容 0x34 0x12

4 .有符号或无符号长整型 (signed/ unsigned long)

采用 4 字节保存 ,低位字节在前 ,高位字节在后。例如 , 0x12345678 在内存中按如下

顺序保存 :

地 址 + 0 + 1 + 2 + 3

内 容 0x78 0x56 0x34 0x12

5 . near指针

near 指针采用 2 字节保存。如果是 TINY 存储模型 , near 指针的寻址范围是 16 位

地址空间。其他情况下 ,指针的 0~13 位是偏移量 , 14 和 15 位用来选择 DPP。near 指针

从内存的字边界起始处开始保存。

地 址 + 0 + 1

内 容 偏移量 (低位) 偏移量(高位 )

第 9 章 C语言编程

Page 363: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

352

near 指针的 2 位 DPP选择位允许访问以下的存储类型。

DPP 选择位 存 储 类 型

0 未用

1 NCONST 组 (用 const near 定义 )

2 NDA TA 组 (用 near 定义 )

3 SDA TA 或 SYST EM 组 (用 sdata , idata或 bdata定义)

6 . far指针

fa r指针采用两个字 (4 字节 )保存。第一个字是 14 位的偏移量 (第 14 , 15 位始终是

0) ,第二个字是页号或函数指针的段号。fa r 函数指针的格式和 huge/ xhuge 指针的格式

是一样的。实际的物理地址可以按下式计算 :

变量指针 :物理地址 = (页号×0 x4000L ) +偏移量

函数指针 :物理地址 = (段号×0 x10000L) +偏移量

huge/ xhuge指针从内存的字边界起始处开始保存。

地 址 + 0 + 1 + 2 + 3

内 容 偏移量 (低位 ) 偏移量 (高位) 段(低位 ) 段 (高位 )

7 .浮点类型 ( float)

浮点数采用 4 字节 (32 位 )保存 ,其中 24 位保存尾数 ,精度约为 7 位十进制数字 ,格

式和 IEEE-754 一致。尾数的最高位始终是 1 ,因此并不保存。指数为 8 位 ,它的实际值

是指数位的内容减 127 ,因此范围是 + 128~ - 127。另外还有一个符号位。浮点数也从

内存的字边界起始处开始以如下格式保存 :

地 址 + 0 + 1 + 2 + 3

内 容 MMMM MMMM MMMM MMMM EMMM MMMM SEE E E EEE

其中S是符号位 , 1 是负数 , 0 是正数。

E是以 2 的补码表示的指数。

M 是尾数。

以浮点数 - 12 .5 为例 ,其实际存储内容为

地 址 + 0 + 1 + 2 + 3

格 式 MMMM MMMM MMMM MMMM EMMM MMMM SE EE EEE E

BIN 0000 0000 0000 0000 0100 1000 1100 0001

HEX 00 00 48 C1

其中 号位是 1 ,表示负数。

指数位是 1000 0010 ,相当于十进制的 130 减 127 ,实际的指数是 3。

亿恒 C164CI 16 位单片机

Page 364: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

353

尾数是 (1 ) .100 1000 0000 0000 0000 0000(最高位始终是 1)。

把尾数的小数点右移指数位 (3 位 ) ,即 1100 .1(十进制 12 .5 )。

C166/ C167 在硬件上不支持浮点操作中的溢出错误 , 必须在软件上检测。按照

IEEE的标准 ,根据浮点数的内容可以判断出是否发生了错误 ,如下表。

错 误 类 型 存 储 内 容 意 义

NaN 0xFFFFFFF 不是数字

+ INF 0x7F80000 正无穷大(正溢出 )

- INF 0xFF80000 负无穷大(负溢出 )

8 .双精度类型 (double)

双精度类型采用 8 字节 ( 64 位 )保存 ,其中 53 位保存尾数 ,精度约为 13 位十进制数

字 ,格式和 IEEE-754 一致。尾数的最高位始终是 1 ,因此并不保存。指数为 11 位 ,它的

实际值是指数位的内容减 1023 ,因此范围是 + 1024~ - 1023。另外还有一个符号位。双

精度数也从内存的字边界起始处开始以如下格式保存 :

地 址 + 0 + 1 + 2 + 3

内 容 MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM

地 址 + 4 + 5 + 6 + 7

内 容 MMMM MMMM MMMM MMMM EEE E MMMM SEE E E EEE

其中S是符号位 , 1 是负数 , 0 是正数。

E是以 2 的补码表示的指数。

M 是尾数。

同样 , C166/ C167 在硬件上不支持双精度操作中的溢出错误 ,必须在软件上检测。

按照 IEEE 的标准 ,根据双精度数的内容可以判断出是否发生了错误 ,如下表。

错 误 类 型 存 储 内 容 意 义

NaN 0xFFFFFFF FFFFFFFF 不是数字

+ I NF 0x7F80000 00000000 正无穷大(正溢出 )

- I NF 0xFF80000 00000000 负无穷大(负溢出 )

9 .4 .5 访问绝对地址内存

C语言编程不支持定义静态变量或全局变量的内存位置 ,但可以通过访问绝对地址

内存的宏实现。C166 库函数提供了访问绝对地址内存的宏 ,通过这些宏可以对内存直接

操作 ,具体可参考库参考手册。

H ARRAY MARRAY XARRAY

H VAR MVAR XVAR

第 9 章 C语言编程

Page 365: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

354

9 .5 DES加密算法程序

随着电子商务和安全技术的发展 ,很多系统要求能够对数据进行实时加密。数据加

密标准 DES算法由于其保密性强 ,至今尚无切实可行的破译方法 ,因此得到了广泛的应

用。本节给出了一个可以在 C166 上运行的 DES 程序 ,在 20MHz时钟下完成一次 DES

加密大约需要 30ms,可以对 2400 波特的数据通信进行实时加密。

DES是一种分组密码体制算法 ,它把明文按 64 位一组分成若干组 ,密钥长为 56 位。

其基本思想是采用变换的组合与迭代 ,将明文中的各组变为密文组。其过程如图 9-2 所

示。其中 Ln , Rn 分别表示左半部的 32 位和右半部的 32 位。 Ln + 1 = Rn (交换 ) ,

Rn + 1 = Ln� f ( Kn , Rn ) , f ( Kn , Rn )就是图中的函数。即右半部 32 位 Rn 按一定规则扩展

后得到 48 位 ,然后与 48 位的 Kn 进行模二加运算得到 8 块 (每块 6 位 ,共 48 位 ) ,此后再

对其进行错位、置换 ,最后得到的就是 f ( Kn , Rn )。解密算法与加密算法相同 ,算法的次

序也相同 ,但解密时的密钥与加密时密钥次序相反。例如 ,第 16 次加密用的密钥作为第

一次解密密钥 ,以此类推。

图 9-2 DES 算法示意图

程序列表如下。

# include < stdio .h >

# include < reg167 .h >

# include < in t rins .h >

# define ENCRYP T 1

# define DECRYP T 0

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

/ * 静态数据 * /

亿恒 C164CI 16 位单片机

Page 366: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

355

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

code unsigned char Df_Key[ 24 ] = {

0x01 , 0x23 , 0x45 , 0x67 , 0x89 , 0xab , 0xcd , 0xef ,

0xfe, 0xdc , 0xba , 0x98 , 0x76 , 0x54 , 0x32 , 0x10 ,

0x89 , 0xab , 0xcd , 0xef , 0x01 , 0x23 , 0x45 , 0x67 } ;

code unsigned shor t bytebit [8 ] = {

0200 , 0100 , 040 , 020 , 010 , 04 , 02 , 01 } ;

code unsigned long bigbyte[ 24] = {

0x800000L , 0x400000L , 0x200000L , 0x100000L ,

0x80000L , 0x40000L , 0x20000L , 0x10000L ,

0x8000L , 0x4000L , 0x2000L , 0x1000L ,

0x800L , 0x400L , 0x200L , 0x100L ,

0x80L , 0x40L , 0x20L , 0x10L ,

0x8L , 0x4L , 0x2L , 0x1L } ;

code unsigned char pc1[56] = {

56 , 48 , 40 , 32 , 24 , 16 , 8 , 0 , 57 , 49 , 41 , 33 , 25 , 17 ,

9 , 1 , 58 , 50 , 42 , 34 , 26 , 18 , 10 , 2 , 59 , 51 , 43 , 35 ,

62 , 54 , 46 , 38 , 30 , 22 , 14 , 6 , 61 , 53 , 45 , 37 , 29 , 21 ,

13 , 5 , 60 , 52 , 44 , 36 , 28 , 20 , 12 , 4 , 27 , 19 , 11 , 3 } ;

code unsigned char to trot [ 16] = {

1 , 2 , 4 , 6 , 8 , 10 , 12 , 14 , 15 , 17 , 19 , 21 , 23 , 25 , 27 , 28 } ;

code unsigned char pc2[48] = {

13 , 16 , 10 , 23 , 0 , 4 , 2 , 27 , 14 , 5 , 20 , 9 ,

22 , 18 , 11 , 3 , 25 , 7 , 15 , 6 , 26 , 19 , 12 , 1 ,

40 , 51 , 30 , 36 , 46 , 54 , 29 , 39 , 50 , 44 , 32 , 47 ,

43 , 48 , 38 , 55 , 33 , 52 , 45 , 41 , 49 , 35 , 28 , 31 } ;

code unsigned long SP1 [64] = { / * 置换盒 S1 * /

0x01010400L , 0x00000000L , 0x00010000L , 0x01010404L ,

0x01010004L , 0x00010404L , 0x00000004L , 0x00010000L ,

0x00000400L , 0x01010400L , 0x01010404L , 0x00000400L ,

0x01000404L , 0x01010004L , 0x01000000L , 0x00000004L ,

0x00000404L , 0x01000400L , 0x01000400L , 0x00010400L ,

0x00010400L , 0x01010000L , 0x01010000L , 0x01000404L ,

0x00010004L , 0x01000004L , 0x01000004L , 0x00010004L ,

0x00000000L , 0x00000404L , 0x00010404L , 0x01000000L ,

第 9 章 C语言编程

Page 367: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

356

0x00010000L , 0x01010404L , 0x00000004L , 0x01010000L ,

0x01010400L , 0x01000000L , 0x01000000L , 0x00000400L ,

0x01010004L , 0x00010000L , 0x00010400L , 0x01000004L ,

0x00000400L , 0x00000004L , 0x01000404L , 0x00010404L ,

0x01010404L , 0x00010004L , 0x01010000L , 0x01000404L ,

0x01000004L , 0x00000404L , 0x00010404L , 0x01010400L ,

0x00000404L , 0x01000400L , 0x01000400L , 0x00000000L ,

0x00010004L , 0x00010400L , 0x00000000L , 0x01010004L } ;

code unsigned long SP2 [64] = { / * 置换盒 S2 * /

0x80108020L , 0x80008000L , 0x00008000L , 0x00108020L ,

0x00100000L , 0x00000020L , 0x80100020L , 0x80008020L ,

0x80000020L , 0x80108020L , 0x80108000L , 0x80000000L ,

0x80008000L , 0x00100000L , 0x00000020L , 0x80100020L ,

0x00108000L , 0x00100020L , 0x80008020L , 0x00000000L ,

0x80000000L , 0x00008000L , 0x00108020L , 0x80100000L ,

0x00100020L , 0x80000020L , 0x00000000L , 0x00108000L ,

0x00008020L , 0x80108000L , 0x80100000L , 0x00008020L ,

0x00000000L , 0x00108020L , 0x80100020L , 0x00100000L ,

0x80008020L , 0x80100000L , 0x80108000L , 0x00008000L ,

0x80100000L , 0x80008000L , 0x00000020L , 0x80108020L ,

0x00108020L , 0x00000020L , 0x00008000L , 0x80000000L ,

0x00008020L , 0x80108000L , 0x00100000L , 0x80000020L ,

0x00100020L , 0x80008020L , 0x80000020L , 0x00100020L ,

0x00108000L , 0x00000000L , 0x80008000L , 0x00008020L ,

0x80000000L , 0x80100020L , 0x80108020L , 0x00108000L } ;

code unsigned long SP3 [64] = { / * 置换盒 S3 * /

0x00000208L , 0x08020200L , 0x00000000L , 0x08020008L ,

0x08000200L , 0x00000000L , 0x00020208L , 0x08000200L ,

0x00020008L , 0x08000008L , 0x08000008L , 0x00020000L ,

0x08020208L , 0x00020008L , 0x08020000L , 0x00000208L ,

0x08000000L , 0x00000008L , 0x08020200L , 0x00000200L ,

0x00020200L , 0x08020000L , 0x08020008L , 0x00020208L ,

0x08000208L , 0x00020200L , 0x00020000L , 0x08000208L ,

0x00000008L , 0x08020208L , 0x00000200L , 0x08000000L ,

0x08020200L , 0x08000000L , 0x00020008L , 0x00000208L ,

0x00020000L , 0x08020200L , 0x08000200L , 0x00000000L ,

0x00000200L , 0x00020008L , 0x08020208L , 0x08000200L ,

0x08000008L , 0x00000200L , 0x00000000L , 0x08020008L ,

0x08000208L , 0x00020000L , 0x08000000L , 0x08020208L ,

0x00000008L , 0x00020208L , 0x00020200L , 0x08000008L ,

亿恒 C164CI 16 位单片机

Page 368: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

357

0x08020000L , 0x08000208L , 0x00000208L , 0x08020000L ,

0x00020208L , 0x00000008L , 0x08020008L , 0x00020200L } ;

code unsigned long SP4 [64] = { / * 置换盒 S4 * /

0x00802001L , 0x00002081L , 0x00002081L , 0x00000080L ,

0x00802080L , 0x00800081L , 0x00800001L , 0x00002001L ,

0x00000000L , 0x00802000L , 0x00802000L , 0x00802081L ,

0x00000081L , 0x00000000L , 0x00800080L , 0x00800001L ,

0x00000001L , 0x00002000L , 0x00800000L , 0x00802001L ,

0x00000080L , 0x00800000L , 0x00002001L , 0x00002080L ,

0x00800081L , 0x00000001L , 0x00002080L , 0x00800080L ,

0x00002000L , 0x00802080L , 0x00802081L , 0x00000081L ,

0x00800080L , 0x00800001L , 0x00802000L , 0x00802081L ,

0x00000081L , 0x00000000L , 0x00000000L , 0x00802000L ,

0x00002080L , 0x00800080L , 0x00800081L , 0x00000001L ,

0x00802001L , 0x00002081L , 0x00002081L , 0x00000080L ,

0x00802081L , 0x00000081L , 0x00000001L , 0x00002000L ,

0x00800001L , 0x00002001L , 0x00802080L , 0x00800081L ,

0x00002001L , 0x00002080L , 0x00800000L , 0x00802001L ,

0x00000080L , 0x00800000L , 0x00002000L , 0x00802080L } ;

code unsigned long SP5 [64] = { / * 置换盒 S5 * /

0x00000100L , 0x02080100L , 0x02080000L , 0x42000100L ,

0x00080000L , 0x00000100L , 0x40000000L , 0x02080000L ,

0x40080100L , 0x00080000L , 0x02000100L , 0x40080100L ,

0x42000100L , 0x42080000L , 0x00080100L , 0x40000000L ,

0x02000000L , 0x40080000L , 0x40080000L , 0x00000000L ,

0x40000100L , 0x42080100L , 0x42080100L , 0x02000100L ,

0x42080000L , 0x40000100L , 0x00000000L , 0x42000000L ,

0x02080100L , 0x02000000L , 0x42000000L , 0x00080100L ,

0x00080000L , 0x42000100L , 0x00000100L , 0x02000000L ,

0x40000000L , 0x02080000L , 0x42000100L , 0x40080100L ,

0x02000100L , 0x40000000L , 0x42080000L , 0x02080100L ,

0x40080100L , 0x00000100L , 0x02000000L , 0x42080000L ,

0x42080100L , 0x00080100L , 0x42000000L , 0x42080100L ,

0x02080000L , 0x00000000L , 0x40080000L , 0x42000000L ,

0x00080100L , 0x02000100L , 0x40000100L , 0x00080000L ,

0x00000000L , 0x40080000L , 0x02080100L , 0x40000100L } ;

code unsigned long SP6 [64] = { / * 置换盒 S6 * /

0x20000010L , 0x20400000L , 0x00004000L , 0x20404010L ,

0x20400000L , 0x00000010L , 0x20404010L , 0x00400000L ,

第 9 章 C语言编程

Page 369: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

358

0x20004000L , 0x00404010L , 0x00400000L , 0x20000010L ,

0x00400010L , 0x20004000L , 0x20000000L , 0x00004010L ,

0x00000000L , 0x00400010L , 0x20004010L , 0x00004000L ,

0x00404000L , 0x20004010L , 0x00000010L , 0x20400010L ,

0x20400010L , 0x00000000L , 0x00404010L , 0x20404000L ,

0x00004010L , 0x00404000L , 0x20404000L , 0x20000000L ,

0x20004000L , 0x00000010L , 0x20400010L , 0x00404000L ,

0x20404010L , 0x00400000L , 0x00004010L , 0x20000010L ,

0x00400000L , 0x20004000L , 0x20000000L , 0x00004010L ,

0x20000010L , 0x20404010L , 0x00404000L , 0x20400000L ,

0x00404010L , 0x20404000L , 0x00000000L , 0x20400010L ,

0x00000010L , 0x00004000L , 0x20400000L , 0x00404010L ,

0x00004000L , 0x00400010L , 0x20004010L , 0x00000000L ,

0x20404000L , 0x20000000L , 0x00400010L , 0x20004010L } ;

code unsigned long SP7 [64] = { / * 置换盒 S7 * /

0x00200000L , 0x04200002L , 0x04000802L , 0x00000000L ,

0x00000800L , 0x04000802L , 0x00200802L , 0x04200800L ,

0x04200802L , 0x00200000L , 0x00000000L , 0x04000002L ,

0x00000002L , 0x04000000L , 0x04200002L , 0x00000802L ,

0x04000800L , 0x00200802L , 0x00200002L , 0x04000800L ,

0x04000002L , 0x04200000L , 0x04200800L , 0x00200002L ,

0x04200000L , 0x00000800L , 0x00000802L , 0x04200802L ,

0x00200800L , 0x00000002L , 0x04000000L , 0x00200800L ,

0x04000000L , 0x00200800L , 0x00200000L , 0x04000802L ,

0x04000802L , 0x04200002L , 0x04200002L , 0x00000002L ,

0x00200002L , 0x04000000L , 0x04000800L , 0x00200000L ,

0x04200800L , 0x00000802L , 0x00200802L , 0x04200800L ,

0x00000802L , 0x04000002L , 0x04200802L , 0x04200000L ,

0x00200800L , 0x00000000L , 0x00000002L , 0x04200802L ,

0x00000000L , 0x00200802L , 0x04200000L , 0x00000800L ,

0x04000002L , 0x04000800L , 0x00000800L , 0x00200002L } ;

code unsigned long SP8 [64] = { / * 置换盒 S8 * /

0x10001040L , 0x00001000L , 0x00040000L , 0x10041040L ,

0x10000000L , 0x10001040L , 0x00000040L , 0x10000000L ,

0x00040040L , 0x10040000L , 0x10041040L , 0x00041000L ,

0x10041000L , 0x00041040L , 0x00001000L , 0x00000040L ,

0x10040000L , 0x10000040L , 0x10001000L , 0x00001040L ,

0x00041000L , 0x00040040L , 0x10040040L , 0x10041000L ,

0x00001040L , 0x00000000L , 0x00000000L , 0x10040040L ,

0x10000040L , 0x10001000L , 0x00041040L , 0x00040000L ,

亿恒 C164CI 16 位单片机

Page 370: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

359

0x00041040L , 0x00040000L , 0x10041000L , 0x00001000L ,

0x00000040L , 0x10040040L , 0x00001000L , 0x00041040L ,

0x10001000L , 0x00000040L , 0x10000040L , 0x10040000L ,

0x10040040L , 0x10000000L , 0x00040000L , 0x10001040L ,

0x00000000L , 0x10041040L , 0x00040040L , 0x10000040L ,

0x10040000L , 0x10001000L , 0x10001040L , 0x00000000L ,

0x10041040L , 0x00041000L , 0x00041000L , 0x00001040L ,

0x00001040L , 0x00040040L , 0x10000000L , 0x10041000L } ;

unsigned long KnL[32] ; / * 内部密钥寄存器 ( KnR) * /

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

/ * 数据块加 (解 )密程序 des_block( ) * /

/ * 用当前密钥对缓冲区内的 8 字节明文加密 * /

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

void des_block( unsigned char * buf)

{

unsigned long * block ; / * 数据块首字节 * /

unsigned long fval , work , r igh t , left t ;

unsigned char round , t1 ;

unsigned char * workpt r ;

b lock = (unsigned long * )buf ;

workpt r = ( unsigned char * ) ( & work ) ;

lef tt = block[ 0] ; / * 初始置换 * /

righ t = block[ 1] ;

work = ( ( lef tt > > 4 ) 〈right ) & 0x0f0f0f0fL ;

righ t 〈= work ;

lef tt 〈= ( work < < 4) ;

work = ( ( lef tt > > 16) 〈r igh t ) & 0x0000ffffL ;

righ t 〈= work ;

lef tt 〈= ( work < < 16 ) ;

work = ( ( r igh t > > 2 ) 〈lef tt ) & 0x33333333L ;

lef tt 〈= work;

righ t 〈= ( work < < 2) ;

work = ( ( r igh t > > 8 ) 〈lef tt ) & 0x00ff00ffL ;

第 9 章 C语言编程

Page 371: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

360

lef tt 〈= work;

righ t 〈= ( work < < 8) ;

righ t = ( righ t < < 1 ) | ( ( righ t > > 31) & 1L) ;

work = ( left t 〈r igh t ) & 0xaaaaaaaaL ;

lef tt 〈= work;

righ t 〈= work ;

lef tt = ( leftt < < 1) | ( ( left t > > 31) & 1L) ;

fo ( round = 0; round < 8 ; round + + ) { / * 16轮置换 * /

work = ( righ t < < 28) | ( righ t > > 4 ) ; / * 置换、移位、模 2 加 * /

work 〈= KnL[ round * 4] ;

fval = SP1[ * workpt r & 0x3f] ;

fval | = SP3[ * ( ( unsigned char * ) ( & work) + 1) & 0x3f] ;

fval | = SP5[ * ( ( unsigned char * ) ( & work) + 2) & 0x3f] ;

fval | = SP7[ * ( ( unsigned char * ) ( & work) + 3) & 0x3f] ;

work = right 〈K nL[ round * 4 + 1] ;

fval | = SP2[ * workpt r & 0x3f] ;

fval | = SP4[ * ( ( unsigned char * ) ( & work) + 1) & 0x3f] ;

fval | = SP6[ * ( ( unsigned char * ) ( & work) + 2) & 0x3f] ;

fval | = SP8[ * ( ( unsigned char * ) ( & work) + 3) & 0x3f] ;

left t 〈= fval ;

work = ( lef tt < < 28) | ( left t > > 4) ;

work 〈= KnL[ round * 4 + 2 ] ;

fval = SP1[ * workpt r & 0x3f] ;

fval | = SP3[ * ( ( unsigned char * ) ( & work) + 1) & 0x3f] ;

fval | = SP5[ * ( ( unsigned char * ) ( & work) + 2) & 0x3f] ;

fval | = SP7[ * ( ( unsigned char * ) ( & work) + 3) & 0x3f] ;

work = left t 〈KnL[ round * 4 + 3] ;

fval | = SP2[ * workpt r & 0x3f] ;

fval | = SP4[ * ( ( unsigned char * ) ( & work) + 1) & 0x3f] ;

fval | = SP6[ * ( ( unsigned char * ) ( & work) + 2) & 0x3f] ;

fval | = SP8[ * ( ( unsigned char * ) ( & work) + 3) & 0x3f] ;

righ t 〈= fval ;

}

righ t = ( righ t > > 1 ) + ( right&1 ) * 0x80000000L ; / * 初始置换的逆置换 * /

work = ( left t 〈r igh t ) & 0xaaaaaaaaL ;

lef tt 〈= work;

righ t 〈= work ;

/ / lef tt = ( lef tt < < 31) | ( left t > > 1 ) ;

亿恒 C164CI 16 位单片机

Page 372: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

361

lef tt = ( leftt > > 1) + ( lef tt&1) * 0x80000000L ;

work = ( ( lef tt > > 8 ) 〈right ) & 0x00ff00ffL ;

righ t 〈= work ;

lef tt 〈= ( work < < 8) ;

work = ( ( lef tt > > 2 ) 〈right ) & 0x33333333L ;

righ t 〈= work ;

lef tt 〈= ( work < < 2) ;

work = ( ( r igh t > > 16) 〈left t ) & 0x0000ffffL ;

lef tt 〈= work;

righ t 〈= ( work < < 16) ;

work = ( ( r igh t > > 4 ) 〈lef tt ) & 0x0f0f0f0fL ;

lef tt 〈= work;

righ t 〈= ( work < < 4) ;

b lock [0] = right ;

b lock [1] = left t ;

}

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

/ * 密钥设置程序 deskey( ) * /

/ * 按照工作方式“md”设置内部密钥寄存器 ( KnR) * /

/ * 输入 :“key”是 64 位密钥 * /

/ * “md”值 ENCRYPT/ DECRYPT 表示加密/ 解密 * /

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

void deskey( unsigned char * key , unsigned char md )

{

unsigned char i, j , l , m ,n ,pc1m[ 56] , pcr [56 ] ;

unsigned long * raw0 , * raw1 , t0 , t1 ;

fo ( j = 0 ; j < 56; j + + ) {

l = pc1[ j ] ;

m = l & 07;

pc1m[j ] = ( key[ l > > 3 ] & bytebit [ m] ) ?1 :0 ;

}

fo ( i = 0; i < 16 ; i + + ) {

if ( m = = DECRYPT )

m = (15 - i) < < 1;

else

m = i < < 1;

n = m + 1;

KnL[m] = KnL[ n] = 0L ;

第 9 章 C语言编程

Page 373: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

362

fo ( j = 0 ; j < 28; j + + ) {

l = j + tot ro t [ i] ;

if ( l < 28) pcr [ j ] = pc1m[l ] ;

else pcr[ j ] = pc1m[ l - 28 ] ;

}

fo ( j = 28; j < 56 ; j + + ) {

l = j + tot ro t [ i] ;

if l < 56) pcr[ j ] = pc1m[ l] ;

else pcr[ j] = pc1m[l - 28] ;

}

fo ( j = 0 ; j < 24; j + + ) {

if ( pcr[ pc2[ j] ] ) KnL[ m] | = bigbyte[ j] ;

if ( pcr[ pc2[ j + 24 ] ] ) KnL[ n] | = bigbyte[ j ] ;

}

}

raw1 = KnL ;

fo ( i = 0 ; i < 16; i + + ) {

raw0 = raw1 + + ;

t0 = ( ( * raw0 & 0x00fc0000L) < < 6 ) | ( ( * raw0 & 0x00000fc0L) < < 10) ;

t0 | = ( * raw1 & 0x00fc0000L) > > 10;

t0 | = ( * raw1 & 0x00000fc0L) > > 6 ;

t1 = ( ( * raw0 & 0x0003f000L) < < 12) | ( ( * raw0 & 0x0000003fL) < < 16) ;

t1 | = ( * raw1 & 0x0003f000L) > > 4 ;

* raw1 + + = t1 | ( * raw1 & 0x0000003fL) ;

* raw0 = t0 ;

}

}

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

/ * 加密 (解密 )程序 des( ) * /

/ * 使用内部密钥寄存器 ( KnR)作加密、解密运算 * /

/ * 输入 :“blocks”为数据块的个数 * /

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

void des ( unsigned char * buf , in t block s )

{

int i ;

for ( = 0 ; i < block s; i + + )

des_block ( buf) ; / * 加密一个数据块 * /

亿恒 C164CI 16 位单片机

Page 374: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

363

buf + = 8;

}

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

/ * 加密程序 encrypt ( ) * /

/ * key :密钥 * /

/ * buf :输入的明文 * /

/ * blocks :数据块的块数 * /

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

void encrypt ( unsigned char * key , unsigned char * buf , in t b locks )

{

if ( blocks = = 0 ) return ;

deskey( key , ENCRYPT ) ;

des( buf , blocks) ;

}

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

/ * 解密程序 decrypt ( ) * /

/ * key :密钥 * /

/ * buf :输入的密文 * /

/ * blocks :数据块的块数 * /

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

void decrypt ( unsigned char * key , unsigned char * buf , int blocks )

{

if ( blocks = = 0 ) return ;

deskey( key , DECRYPT ) ;

des( buf , blocks) ;

}

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

/ * 主程序 main( ) * /

/ * Xdata :281B * /

/ * CODE :5508B * /

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

void main( void)

{

第 9 章 C语言编程

Page 375: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

364

unsigned char buffer[ ] = {″test_ input″} ; / * 明文 * /

unsigned char the_key[ ] = {″12345678″} / * 密钥 * /

unsigned char i;

encrypt ( the_key ,buffer , 1) ; / * 参数 3 值为 1 表示加密 * /

for ( = 0 ; i < = 7 ; i + + )

pr int f(″% d″, buffe r[ i ] ) ; / * 输出密文 * /

}

9 .6 CVSD语音编解码程序

CVSD编码 ,即连续可变斜率增量调制编码 ,是脉冲编码调制的一个特例 ,只用一个

比特表示一个抽样值。它具有比特率较低时量化信噪比高、抗误码性能好、编译码器简单

等优点 ,在军工部门的专用通信网和卫星通信中得到了广泛应用。

CVSD的基本原理是采用自适应方法 ,使量化步长的大小随输入信号的平均斜率变

化 ,把信号的抽样值与本地译码信号比较 , 比较的结果量化成一比特输出 ,其过程如图

9-3 所示。当输入信号斜率很大 ,ΔM编码器输出将出现连“1”或连“0”。一旦出现多个连

“1”或连“0”,连码检测电路将输出一个一致脉冲送往音节平滑网络。音节平滑网络实际

上是一个积分器 ,它的输出是一个以音节为时间常数的缓慢变化的电压 ,并与语音信号的

平均斜率成正比。

图 9-3 CVSD 算法示意图

音节平滑网络的计算公式为

Δ= β×Δ+Δ0 ,Δ0 =12.0 , 000/ 111

0.15 ,其他值

亿恒 C164CI 16 位单片机

Page 376: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

365

程序列表如下。

# include < stdio .h >

# include < st ring .h >

# include < stdarg .h >

# include < stdlib .h >

# include < ma th .h >

# include < reg167 .h >

# include < in t rins .h >

# define Maxdelta 112 .0 / * 最大 dela值 * /

# define Mindel ta 0 .2 / * 最小 dela值 * /

# define Beta 0 .95 / * Beta系数 * /

# define Alpha 0 .94 / * Afa系数 * /

# define d2 12 .0 / * D2 * /

# define d1 0 .15 / * D1 * /

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

/ * 初始化程序 * /

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

void P roject_Init ( void)

{

IEN = 1 ; / * 全局中断使能 * /

}

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

/ * 6 阶椭圆滤波器———通带 3k Hz , 通带纹波 0 .5dB , 阻带 - 50dB * /

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

s hort Filter( shor t sample)

{

const shor t nFileterOrder = 7 ;

sta tic float A [7 ] = {1 .0000 , - 3 .3183 ,5 .7716 , - 6 .0783 ,4 .0814 , - 1 .6362 ,0 .3117} ;

sta tic float B[7 ] = {0 .0163 ,0 .0059 , 0 .0324 ,0 .0154 ,0 .0324 , 0 .0059 ,0 .0163} ;

sta tic float y[7] = {0 ,0 ,0 ,0 ,0 , 0 ,0} ;

sta tic s hor t x[ 7] = {0 ,0 ,0 ,0 , 0 ,0 ,0} ;

s hort i;

s hort r tn ;

for( = nFilete rOrder - 1 ; i > 0; i - - ) {

y[ i ] = y[ i - 1 ] ;

x[ i] = x[ i - 1] ;

第 9 章 C语言编程

Page 377: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

366

}

y[0 ] = 0;

x[ 0] = sample ;

for( i = 0 ; i < nFileterOrder ; i + + ) y[0 ] + = B[ i] * x[ i] ;

for( i = 1 ; i < nFileterOrder ; i + + ) y[0 ] - = A[ i] * y[ i] ;

r tn = ( s hort ) y[ 0] ;

return r tn ;

}

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

/ * 6 阶椭圆滤波器———通带 3k Hz , 通带纹波 0 .5dB , 阻带 - 50dB * /

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

s hort EndFilte r( short sample)

{

const shor t nFileterOrder = 7 ;

sta tic float A [7 ] = {1 .0000 , - 3 .3183 ,5 .7716 , - 6 .0783 ,4 .0814 , - 1 .6362 ,0 .3117} ;

sta tic float B[7 ] = {0 .0163 ,0 .0059 , 0 .0324 ,0 .0154 ,0 .0324 , 0 .0059 ,0 .0163} ;

sta tic float y[7] = {0 ,0 ,0 ,0 ,0 , 0 ,0} ;

sta tic s hor t x[ 7] = {0 ,0 ,0 ,0 , 0 ,0 ,0} ;

s hort i;

s hort r tn ;

for( = nFilete rOrder - 1 ; i > 0; i - - ) {

y[ i ] = y[ i - 1 ] ;

x[ i] = x[ i - 1] ;

}

y[0 ] = 0;

x[ 0] = sample ;

for( i = 0 ; i < nFileterOrder ; i + + ) y[0] + = B[i ] * x[ i] ;

for( i = 1 ; i < nFileterOrder ; i + + ) y[0] - = A [ i ] * y[ i ] ;

r tn = ( s hort ) y[ 0] ;

return r tn ;

}

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

亿恒 C164CI 16 位单片机

Page 378: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

367

/ * CVSD 编码程序 Encoder( ) * /

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

s hort Encoder ( shor t sample)

{

sta tic float samDeco = 0 .0 ; / * samDeco : 前一语音样本 * /

sta tic float delta = Mindelta ; / * delta : 增加量 * /

sta tic s hor t bk , bk_1 = 0 , bk_2 = 0 ; / * bk : 本采样点压缩以后的编码 * /

/ * bk_1 : 前一采样点压缩以后的编码 * /

/ * bk_2 : 再前一采样点压缩以后的编码 * /

if( ( ample - Alpha * samDeco) > = 0 )

bk = 1 ;

else

bk = - 1 ;

delta = Beta * delta ;

if ( bk = = bk_1 & & bk = = bk_2) / * 连续三帧趋势相同 * /

delta = delta + d2;

else

delta = delta + d1;

if ( delta > Maxdelta )

delta = Maxdelta ;

else if ( delta < Mindelta )

delta = Mindelta ;

samDeco = Alpha * samDeco + bk * delta ;

bk_2 = bk_1;

bk_1 = bk;

return bk ;

}

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

/ * CVSD 解码程序 Decoder( ) * /

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

s hort Decoder( shor t bk)

{

sta tic float samDeco = 0 .0f ;

sta tic float delta = Mindelta ;

sta tic in t bk_1 = 0 , bk_2 = 0;

delta = Beta * delta ;

第 9 章 C语言编程

Page 379: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

368

if ( bk = = bk_1 & & bk = = bk_2)

delta = delta + d2;

else

delta = delta + d1;

if ( delta > Maxdelta )

delta = Maxdelta ;

else if ( delta < Mindelta )

delta = Mindelta ;

samDeco = Alpha * samDeco + bk * delta ;

bk_2 = bk_1;

bk_1 = bk;

return ( s hort ) samDeco;

}

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

/ * 主程序 main( ) * /

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

in t main( void)

{

long Data_ length ;

s hort Back , tempSample , OutSample, buffer ;

long j ;

Data_ length = 10000;

for ( j = 0 ; j < Data_ length ; j + + ) { * 对输入波形进行编码、译码 * /

scanf ″% c″, & tempSample) ;

buffe r = Filter ( tempSample) ; / * 抗混叠滤波 * /

Back = Encoder ( buffer ) ; / * 编码 * /

OutSample = Decoder( Back) ; / * 解码 * /

buffer = EndFilter( OutSample) ; / * 后端滤波器 * /

prin tf(″% c″, & buffer ) ;

}

return 0 ;

}

9 .7 I2C总线读写程序

I2 C 总线是一种总线标准 ,主要用于家电、通信产品和工业设备。它定义了两根总

线 :串行时钟线 ( SCL )和串行数据线 ( SDA ) , 允许集成电路通过这两根双向总线 递

亿恒 C164CI 16 位单片机

Page 380: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

369

数据。

I2 C 总线可以用硬件实现 ,也可以通过软件把标准的 I/ O 端口仿真成 I2 C 总线。本

节提供的例子实现了 I2C总线的主协议 ,通过定时器中断产生串行时钟并收发数据。采

用 20M Hz的 C164 单片机可以实现 100kHz的 I2 C 总线。

I2C 总线的协议详细描述如下 :

(1 ) SCL 线为高电平时 , SDA线发生从高到低的电平变化表示 ST ART 状态。SCL

线为高电平时 , SDA线发生从低到高的电平变化表示 STOP 状态。STAR T 状态后 , 总

线被通信设备占用 , STOP状态后 ,总线被释放。

(2 ) 数据通信期间 , SCL线是低电平时 , SDA 线才能发生电平变化。SCL 是高电平

时 , SDA线必须保持不变。

( 3) SDA 线上传输的数据字长必须是 8 位 ,高位先发送 ,最后包括一位应答位。用于

应答位的第 9 个时钟脉冲由主设备产生。发送设备必须在第 9 个时钟脉冲释放 SDA 线

(输出高电平或高阻 ) ,同时接收设备必须输出低电平。STAR T 和 STOP 之间传输的字

节数不限。

(4 ) 接收设备每收到一个字节 ,必须产生应答信号 ,否则必须释放 SDA 线 ,以便主设

备产生 STOP 状态 ,放弃数据传输过程。

完整的数据传输过程如图 9-4 所示。主设备产生 STAR T 状态后 ,首先发送 7 位从

设备地址和 1 位读写控制信号 (“1”表示读 ,“0”表示写 ) ,然后是 1 个或多个字节数据的传

输 ,最后主设备产生 STOP状态结束通信。

图 9-4 I2 C 总线数据传输过程

本例中提供了 I2 C总线通信所需的 5 个函数 ,它们的功能如下 :

(1 ) I2cInit 设置定时器 ,初始化 I2C 总线。

(2 ) I2cSt ar t 产生 I2C 总线的 START 状态。

(3 ) I2cMaster Write 向从设备写 1 字节。

(4 ) I2cMaster Read 从从设备中读 1 字节。

(5 ) I2cStop 释放 I2C总线。

程序列表如下。

# include < reg165 .h >

# define period 20000 / * 10ms 总线故障时间 * /

s bit DSCL = DP3 〈2 ; / * 选择 SCL , SDA 的输出端口 * /

s bit DSDA = DP3 〈3 ; / * P3 .2 = SCL , P3 .3 = SDA * /

第 9 章 C语言编程

Page 381: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

370

s bit SCL = P3 〈2 ;

s bit SDA = P3 〈3;

unsigned char I2cInit ( ) ;

void I2cStar t ( ) ;

void I2cMasterWrite ( unsigned char input_byte) ;

void I2cMasterRead( unsigned char ack) ;

unsigned char I2cStop( ) ;

void Delay( unsigned in t count ) ;

unsigned char Check_SCL( ) ;

unsigned in t time_out ;

unsigned char idata rec_data ;

bit TX_RX , Ackge ,COM_ ON , RecAck , temp_SDA ;

unsigned char idata bit_count , input_data , mask;

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

/ * 程序 : Delay * /

/ * 功能 : 为时钟和数据延时 count 个单位 * /

/ * 输入 : 1 count = 400ns * /

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

void Delay( unsigned in t count )

{

while ( count - - ) ;

}

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

/ * 程序 : Check_SCL * /

/ * 功能 : 发送 H IGH ,读 SCL线 ,直到 SCL被从设备释放 * /

/ * 返回 : “0” - SCL 正常 * /

/ * “1” - SCL错误 * /

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

unsigned char Check_SCL( )

{

time_out = per iod ;

DSCL = 0 ; / * 设置 SCL为输入 * /

whi e ( time_out - - ) {

if ( CL) { / * 等待 SCL被从设备拉低 * /

SCL = 1; / * 输出 clock为 1 * /

DSCL = 1 ; / * 设置 SCL为输出 * /

return ( 0) ; }

}

亿恒 C164CI 16 位单片机

Page 382: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

371

return ( 1) ; / * 错误 : SCL固定为 0 * /

}

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

/ * 程序 : I2cInit * /

/ * 功能 : 设置 T2 , T3 ,实现 100 k Hz的重载计时器 * /

/ * 检查时钟和数据线是否有错误 * /

/ * 返回 : “0”- 总线正常 * /

/ * : “1”- 总线错误 * /

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

unsigned char I2cInit ( )

{

T3CON = 0x0080 ; / * 计数器方式 ,分辨率 400ns ,减计数 * /

T2CON = 0x0027 ; / * 重载方式 ,由 T3 OTL 输出变化触发 * /

T2 = 0x0018 ; / * 重载值 24 * /

T3 = 0x0018 ; / * T3 初值 24 * /

T2IC = 0x0004; / * 中断优先级 ( ILVL) = 1(最低 ) , ( GLVL) = 0 * /

DSDA = 0; / * 设置 SDA 和 SCL 为输入 * /

DSCL = 0 ;

if ( SDA) / * 检查时钟和数据线 * /

if ( I2cStop( ) ) return ( 1) ;

if ( SCL)

if ( I2cStop( ) ) return ( 1) ;

return ( 0) ;

}

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

/ * 程序 : I2cStart * /

/ * 功能 : 产生 I2 C总线的 START 状态 * /

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

void I2cStar t ( )

{

SDA = 1; / * SDA , SCL 输出 1 * /

SCL = 1;

DSDA = 1; / * SDA , SCL 设为输出方式 * /

DSCL = 1 ;

Delay(5 ) ;

SDA = 0;

Delay(10) ;

SCL = 0;

}

第 9 章 C语言编程

Page 383: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

372

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

/ * 程序 : I2cMasterWrite * /

/ * 功能 : 发送前先检查 WAIT 状态 ,在 START 状态后发送第 1位

* /

/ * 输入 : 待发送的字节 * /

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

void I2cMasterWrite ( unsigned char input_byte)

{

input_data = input_byte; / * 在中断中使用 * /

COM_ON = 1 ; / * 开始通信 * /

TX_RX = 0 ; / * 设置为发送方式 * /

mask = 0x80; / * 先发送最高位 * /

DSDA = 1; / * 设置 SDA 为输出 * /

bit_count = 0; / * 时钟脉冲的计数值 * /

if (mask & input_da ta) / * 时钟为低时发送第 1 位 * /

SDA = 1;

else SDA = 0 ;

mask = mask > > 1; / * 右移一位 * /

Check_SCL( ) ; / * 发送字节前检查 WAIT状态 * /

T2IE = 1; / * 允许 T2 中断 * /

T3R = 1; / * 计时器开始 * /

}

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

/ * 程序 : I2cMasterRead * /

/ * 功能 : 读从设备前先检查 WAIT 状态 * /

/ * 输入 : 待检测的应答信号 * /

/ * “0” - 从设备收到 1 个字节后产生低输出电平 * /

/ * “1” - 从设备收到 1 个字节后产生高输出电平 * /

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

void I2cMasterRead( unsigned char ack)

{

Ackge = ack ; / * 中断程序中使用 * /

rec_data = 0 ;

COM_ON = 1 ; / * 开始通信 * /

TX_RX = 1 ; / * 设置为接收方式 * /

mask = 0x80;

DSDA = 0; / * 设置 SDA 为输入 * /

bit_count = 0; / * 时钟脉冲的计数值 * /

Check_SCL( ) ; / * 接收字节前检查 WAIT状态 * /

T2IE = 1; / * 允许 T2 中断 * /

T3R = 1; / * 计时器开始 * /

亿恒 C164CI 16 位单片机

Page 384: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

373

}

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

/ * 程序 : I2cStop * /

/ * 功能 : 在 I2 C总线上产生 ST OP 状态 ;在从设备释放总线前 * /

/ * 产生时钟 ,超时时间为 10ms ,然后设置为高电平 * /

/ * 返回 :“0” - 总线正常 * /

/ * “1” - 总线被拉至低电平超过 10ms * /

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

unsigned char I2cStop( )

{

time_out = per iod ;

DSDA = 0 ; / * 设置 SDA 为输入 * /

whi e ( time_out - - ) {

if ( SDA ) { / * 检查 SDA * /

SCL = 1; / * 如果 SDA 为低电平 ,产生时钟脉冲 * /

Delay(6 ) ;

SCL = 0;

Delay(6 ) ;

}

els { / * 检查 SDA * /

SDA = 0 ;

DSDA = 1; / * 设置 SDA 为输出 * /

if ( heck_SCL( ) ) / * 产生 STOP 状态 * /

return (1 ) ; / * 错误 : SCL固定为低电平 * /

Delay(10) ;

SDA = 1 ;

return (0) ;

}

}

return ( 1) ; / * 错误 : SCL固定为低电平 * /

}

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

/ * 程序 : T imer 2 中断处理程序 * /

/ * 功能 : 每次中断发送或接收 1 位数据 * /

/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /

void in t_timer2_handler( void) in terrupt 0x22

{

if ( X_RX) { / * 接收方式 * /

SCL = 1 ;

bit_count + + ;

if ( it_count < = 8 ) {

第 9 章 C语言编程

Page 385: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

374

if ( DA)

rec_data | = mask ; / * 时钟为高电平时保存接收数据 * /

els {

time_out = period ; / * 延时 * /

SCL = 1 ;

}

mask = mask > > 1 ;

SCL = 0 ; / * 设置时钟输出低电平 * /

if ( it_count = = 8) {

DSDA = 1; / * 设置 SDA 为输出 * /

if ( ckge) / * 设置应答位 * /

SDA = 1 ;

else SDA = 0 ;

}

}

els if ( bit_count = = 9) { / * 完成 1 字节的接收 * /

SCL = 1; / * 仅为延时 * /

SCL = 1;

SCL = 1; / * 仅为延时 * /

T2IE = 0 ; / * 中断复位 * /

T3IE = 0 ;

T2IR = 0;

T3R = 0 ;

COM_ON = 0; / * 通信结束 * /

SCL = 0 ;

}

}

els { / * 发送方式 * /

SCL = 1 ;

bit_count + + ;

if ( it_count < = 8 ) {

temp_SDA = 0;

if ( ask & input_da ta) / * 准备下一字节 * /

temp_SDA = 1 ;

mask = mask > > 1; / * 右移 ,准备下一字节 * /

SCL = 0;

if ( it_count ! = 8)

SDA = temp_SDA ; / * 时钟为低电平时发送一位 * /

else DSDA = 0; / * 第 8 个时钟脉冲时释放 SDA 以接收应答位 * /

}

els if ( bit_count = = 9) {

RecAck = SDA ; / * 在第 9 个时钟脉冲读应答信号 * /

亿恒 C164CI 16 位单片机

Page 386: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

375

if ( it_count = = 9) { / * 冗余语句 ,仅仅为了延时 * /

SCL = 1 ; / * 发送完 1 字节 * /

T2IE = 0 ;

T3IE = 0 ;

T2IR = 0;

T3R = 0 ;

COM_ON = 0 ; / * 通信结束 * /

SCL = 0 ;

}

}

} / * 发送结束 * /

}

第 9 章 C语言编程

Page 387: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

附录 1 C166族单片机指令一览表

助 记 符 说 明 字节数数据传送指令MOV Rw , Rw 将字 GPR 的内容传送到另一个字 GPR 2

MOV Rw , # da ta4 将字立即数传送到字 GPR 2

MOV reg , # data16 将字立即数传送到直接寻址的字寄存器 4

MOV Rw , [ Rw ] 将间接寻址的字存储器内容传送到 GPR 2

MOV Rw , [ Rw + ] 将间接寻址的字存储器内容传送到 GPR,然后对源地址指针加 2 2

MOV [ Rw ] ,Rw 将字 GPR 的内容送到间接寻址的字存储器 2

MOV [ - Rw ] , Rw 先对目的地址指针减 2 ,然后 ,将字 GPR 的内容传送到间接寻址的存储器

2

MOV [ Rw ] , [ Rw] 将间接寻址存储器的内容传送到间接寻址的字存储器 2

MOV [ Rw + ] , [ Rw] 将间接寻址存储器的内容传送到间接寻址的字存储器 ,然后对目的地址指针加 2

2

MOV [ Rw ] , [ Rw + ] 将间接寻址存储器的内容传送到间接寻址的字存储器 ,然后

对源地址指针加 22

MOV Rw ,

[ Rw + # data16]

将间接寻址 (源地址指针先增加一个常数)的字存储器的内容传送到字 GPR

2

MOV [ Rw + # data16] ,

Rw

将字 GPR 的内容传送到间接寻址 (目的地址指针先增加一个常数)的字存储器

4

MOV [ Rw ] , mem 将直接寻址字存储器的内容传送到间接寻址的字存储器 4

MOV mem , [ Rw ] 将间接寻址字存储器的内容传送到直接寻址的字存储器 4

MOV reg , mem 将直接寻址字存储器的内容传送到直接寻址的寄存器 4

MOV mem , reg 将直接寻址寄存器的内容传送到直接寻址的字存储器 4

MOVB Rb, Rb 将字节 GPR 的内容传送到另一个字节 GPR 2

MOVB Rb, # data4 将字节立即数传送到字节 GPR 2

MOVB reg , # data8 将字节立即数传送到直接寻址的寄存器低位字节 4

MOVB Rb, [ Rw ] 将间接寻址的字节存储器内容传送到字节 GPR 2

MOVB Rb, [ Rw + ] 将间接寻址的字节存储器内容传送到字节 GPR ,然后对源地

址指针加 12

MOVB [ Rw] ,Rb 将字节 GPR 的内容送到间接寻址的字节存储器 2

MOVB [ - Rw ] ,Rb 先对目的地址指针减 1 ,然后将字节 GPR 的内容传送到间接

寻址的存储器2

MOVB [ Rw] , [ Rw ] 将间接寻址的字节存储器内容传送到间接寻址的存储器 2

MOVB [ Rw + ] , [ Rw] 将间接寻址的字节存储器内容传送到间接寻址的字存储器 ,

然后对目的地址指针加 12

MOVB [ Rw, ] [ Rw + ] 将间接寻址的字节存储器内容传送到间接寻址的字存储器 ,

然后对源地址指针加 12

MOVB Rb, [ Rw + # data16] 将间接寻址 (源地址指针先增加一个常数)的字存储器的字节内容传送到字节 GPR

4

MOVB [ Rw + # data16] ,Rb 将字节 GPR 的内容传送到间接寻址 (目的地址指针先增加一个常数)的字节存储器

4

Page 388: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

395

续表

助 记 符 说 明 字节数

数据传送指令 (续 )

MOVB [ Rw] , mem 将直接寻址的字节存储器内容传送到间接寻址的字节存储器 4

MOVB mem , [ Rw ] 将间接寻址的字节存储器内容传送到直接寻址的字节存储器 4

MOVB reg , mem 将直接寻址的字节存储器内容传送到直接寻址的字节寄存器 4

MOVB mem , reg 将直接寻址的字节寄存器内容传送到直接寻址的字节存储器 4

MOVBS Rw , Rb 将字节 GPR 的内容传送到另一个字 GPR 的低字节部分 ,并扩展符号位

2

MOVBS reg , mem 将直接寻址的字节存储器内容送到直接寻址的字寄存器中 ,

并扩展符号位4

MOVBS mem , reg 将直接寻址寄存器的低字节内容送到直接寻址的字存储器

中 ,并扩展符号位4

MOVBZ Rw , Rb 将字节 GPR 的内容转移到另一个字 GPR 的低字节部分 ,并将该 GPR 的高字节部分扩展为 0

2

MOVBZ reg , mem 将直接寻址的字节存储器内容送到直接寻址的字寄存器的低字节部分 ,并将高字节部分扩展为 0

4

MOVBZ mem , reg 将直接寻址寄存器的低字节内容送到直接寻址的字存储器的低字节部分 ,并将高字节部分扩展为 0

4

系统堆栈指令

POP reg 将字从堆栈取出 ,存放到直接寻址的字寄存器 2

PUSH reg 将字从直接寻址的字寄存器压入堆栈 2

SCXT reg , # data16 将字寄存器的内容压入堆栈 ,再将立即数加载到寄存器中 4

SCXT reg , men 将字寄存器的内容压入堆栈 ,再将直接寻址的字存储器的内容加载到寄存器中

4

算术运算指令

ADD Rw , Rw 将两个字 GPR 的内容相加 ,存放到第一个 GPR中 2

ADD Rw , [ Rw ] 将间接寻址存储器的内容加到字 GPR 上 2

ADD Rw , [ Rw + ] 先将间接寻址存储器的内容加到 GPR上 ,再对源地址指针加 2 2

ADD Rw , # da ta3 将立即数加到 GPR上 2

ADD reg , # data16 将字立即数加到直接寻址寄存器上 4

ADD reg , mem 将直接寻址存储器的内容加到直接寻址寄存器上 4

ADD mem , reg 将直接寻址寄存器的内容加到直接寻址存储器上 4

ADDB Rb, Rb 将两个字节 GPR 的内容相加 ,存放到第一个 GPR中 2

ADDB Rb, [ Rw ] 将间接寻址的字节存储器的内容加到字节 GPR上 2

ADDB Rb, [ Rw + ] 先将间接寻址的字节存储器的内容加到字节 GPR上 ,再对源

地址指针增加 12

ADDB Rb, # data3 将立即数加到字节 GPR上 2

ADDB reg , # data8 将字节立即数加到直接寻址寄存器上 4

ADDB reg , mem 将直接寻址到的字节存储器的内容加到寄存器上 4

ADDB mem , reg 将直接寻址寄存器的低字节内容加到直接寻址存储器上 4

ADDC Rw , Rw 将两个字 GPR 的内容带进位相加 ,存放到第一个 GPR 中 2

ADDC Rw , [ Rw ] 将间接寻址存储器的内容带进位加到 GPR 上 2

附录 1 C166 族单片机指令一览表

Page 389: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

396

续表

助 记 符 说 明 字节数

算术运算指令 (续 )

ADDC Rw , [ Rw + ] 先将间接寻址存储器的内容带进位加到 GPR上 ,再对源地址指针增加 2

2

ADDC Rw , # da ta3 将立即数带进位加到字 GPR上 2

ADDC reg , # data16 将立即数带进位加到直接寻址寄存器上 4

ADDC reg , mem 将直接寻址存储器的内容带进位加到寄存器上 4

ADDC mem , reg 将直接寻址寄存器的内容带进位加到直接寻址存储器上 4

ADDCB Rb, Rb 将两个字节 GPR 的内容带进位相加 ,存放到第一个 GPR 中 2

ADDCB Rb, [ Rw ] 将间接寻址到的字节存储器的内容带进位加到字节 GPR上 2

ADDCB Rb, [ Rw + ] 先将间接寻址到的字节存储器的内容带进位加到 GPR 上 ,再对源地址指针增加 1

2

ADDCB Rb, # data3 将立即数带进位加到字节 GPR 上 2

ADDCB reg , # data8 将字节立即数带进位加到直接寻址寄存器上 4

ADDCB reg , mem 将直接寻址到的字节存储器的内容带进位加到寄存器上 4

ADDCB mem , reg 将直接寻址寄存器的低字节内容带进位加到直接寻址存储器上 4

SUB Rw , Rw 从第一个字 GPR 的内容中减去第二个 GPR 的内容 2

SUB Rw , [ Rw ] 从 GPR 的内容中减去间接寻址存储器的内容 2

SUB Rw , [ Rw + ] 先从 GPR 的内容中减去间接寻址存储器的内容 ,再对源地址指针增加 2

2

SUB Rw , # da ta3 从 GPR 的内容中减去一个立即数 2

SUB reg , # data16 从寄存器的内容中减去一个立即数 4

SUB reg , mem 从寄存器的内容中减去直接寻址存储器的内容 4

SUB mem , reg 从直接寻址存储器的内容中减去寄存器的内容 4

SUBB Rw , Rw 从第一个字节 GPR的内容中减去第二个字节 GPR 的内容 2

SUBB Rw , [ Rw ] 从字节 GPR 的内容中减去间接寻址到的字节存储器的内容 2

SUBB Rw , [ Rw + ] 先从字节 GPR 的内容中减去间接寻址到的字节存储器的内容 ,再对源地址指针增加 1

2

SUBC Rw , # da ta3 从字节 GPR 的内容中减去一个立即数 2

SUBB reg , # data16 从寄存器的低字节内容中减去一个立即数 4

SUBB reg , mem 从寄存器的低字节内容中减去直接寻址到的字节存储器的内容 4

SUBB mem , reg 从直接寻址的字节存储器的内容中减去寄存器低字节的内容 4

SUBC Rw , Rw 从第一个字 GPR 的内容中减去第二个字 GPR 的内容和借位 2

SUBC Rw , [ Rw ] 从 GPR 的内容中减去间接寻址存储器的内容和借位 2

SUBC Rw , [ Rw + ] 先从 GPR 的内容中减去间接寻址存储器的内容和借位 ,再对源地址指针增加 2

2

SUBC Rw , # da ta3 从字 GPR 的内容中减去立即数及借位 2

SUBC reg , # data16 从寄存器的内容中减去立即数及借位 4

SUBC reg , mem 从寄存器的内容中减去直接寻址存储器的内容和借位 4

SUBC mem , reg 从直接寻址存储器的内容中减去存储器的内容和借位 4

SUBCB Rb , Rb 从第一个字节 GPR的内容中减去第二个字节 GPR内容和借位 2

SUBCB Rb , [ Rw ] 从字节 GPR的内容中减去间接寻址的字节存储器内容和借位 2

亿恒 C164CI 16 位单片机

Page 390: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

397

续表

助 记 符 说 明 字节数

算术运算指令 (续 )

SUBCB Rb , [ Rw + ] 先从字节 GPR 的内容中减去间接寻址的字节存储器的内容和借位 ,再对源地址指针增加 1

2

SUBCB Rb , # data3 从字节 GPR 的内容中减去立即数及借位 2

SUBCB reg , # data8 从寄存器的低字节内容中减去立即数及借位 4

SUBCB reg , mem 从寄存器低字节内容中减去直接寻址的字节存储器内容和借位 4

SUBCB mem , reg 从直接寻址字节存储器内容中减去寄存器低字节内容和借位 4

MUL Rw , Rw 将两个字 GPR 的内容有符号相乘 ,结果存放在 MD 中 2

MULU Rw , Rw 将两个字 GPR 的内容无符号相乘 ,结果存放在 MD 中 2

DIV Rw 用 GPR 的内容去除 MDL的内容 2

DIVL Rw 用 GPR 的内容去除 MD的内容 2

DIVLU Rw 用 GPR 的内容去除 MD的内容 ,无符号除 2

DIVU Rw 用 GPR 的内容去除 MDL的内容 ,无符号除 2

逻辑操作指令

AND Rw , Rw 对 GPR 和 GPR 的内容进行按位与 2

AND Rw , [ Rw ] 对 GPR 和间接寻址存储器的内容进行按位与 2

AND Rw , [ Rw + ] 对 GPR 和间接寻址存储器的内容进行按位与 ,然后对源地址指针加 2

2

AND Rw , # da ta3 对 GPR 和立即数进行按位与 2

AND reg , # data16 对寄存器和立即数进行按位与 4

AND reg , mem 对寄存器和直接寻址存储器的内容按位与 4

AND mem , reg 对直接寻址存储器的内容和寄存器的内容按位与 4

ANDB Rb, Rb 对字节 GPR 和字节 GPR 的内容进行按位与 2

ANDB Rb, [ Rw ] 对字节 GPR 和间接寻址的字节存储器的内容进行按位与 2

ANDB Rb, [ Rw + ] 对字节 GPR 和间接寻址的字节存储器的内容进行按位与 ,然后对源地址指针增加 1

2

ANDB Rw , # da ta3 对字节 GPR 和立即数进行按位与 2

ANDB reg , # data8 对寄存器低字节和立即数进行按位与 4

ANDB reg , mem 对寄存器低字节和直接寻址的字节存储器的内容按位与 4

ANDB mem , reg 对直接寻址的字节存储器内容和寄存器低字节的内容按位与 4

OR Rw , Rw 对 GPR 和 GPR 的内容进行按位或 2

OR Rw , [ Rw ] 对 GPR 和间接寻址存储器的内容进行按位或 2

OR Rw , [ Rw + ] 对 GPR 和间接寻址存储器的内容进行按位或 ,然后对源地址指针加 2

2

OR Rw , # da ta3 对 GPR 和立即数进行按位或 2

OR reg , # data16 对寄存器和立即数进行按位或 4

OR reg , mem 对寄存器和直接寻址存储器的内容按位或 4

OR mem , reg 对直接寻址存储器的内容和寄存器的内容按位或 4

ORB Rb , Rb 对字节 GPR 和字节 GPR 的内容进行按位或 2

ORB Rb , [ Rw ] 对字节 GPR 和间接寻址的字节存储器的内容进行按位或 2

附录 1 C166 族单片机指令一览表

Page 391: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

398

续表

助 记 符 说 明 字节数

逻辑操作指令 (续 )

ORB Rb , [ Rw + ] 对字节 GPR 和间接寻址的字节存储器的内容进行按位或 ,然后对源地址指针加 1

2

ORB Rb , # data3 对字节 GPR 和立即数进行按位或 2

ORB reg , # data8 对寄存器低字节和立即数进行按位或 4

ORB reg , mem 对寄存器低字节和直接寻址的字节存储器的内容按位或 4

ORB mem , reg 对直接寻址的字节存储器内容和寄存器低字节的内容按位或 4

XOR Rw , Rw 对 GPR 和 GPR 的内容进行按位异或 2

XOR Rw , [ Rw ] 对 GPR 和间接寻址存储器的内容进行按位异或 2

XOR Rw , [ Rw + ] 对 GPR 和间接寻址存储器的内容进行按位异或 ,然后对源地址指针增加 2

2

XOR Rw , # da ta3 对 GPR 和立即数进行按位异或 2

XOR reg , # data8 对寄存器和立即数进行按位异或 4

XOR reg , mem 对寄存器和直接寻址存储器的内容按位异或 4

XOR mem , reg 对直接寻址存储器的内容和寄存器的内容按位异或 4

XORB Rb, Rb 对字节 GPR 和字节 GPR 的内容进行按位异或 2

XORB Rb, [ Rw ] 对字节 GPR 和间接寻址的字节存储器的内容进行按位异或 2

XORB Rb, [ Rw + ] 对字节 GPR和间接寻址的字节存储器的内容进行按位异或 ,

然后对源地址指针加 12

XORB Rb, # data3 对字节 GPR 和立即数进行按位异或 2

XORB reg , # data8 对寄存器低字节和立即数进行按位异或 4

XORB reg , mem 对寄存器低字节和直接寻址的字节存储器的内容按位异或 4

XORB mem , reg 对直接寻址的字节存储器内容和寄存器的低字节的内容按位异或 4

CPL Rw 对字 GPR 的内容取反 ,仍存放在字 GPR中 2

CPLB Rb 对字节 GPR 的内容取反 ,仍存放在字节 GPR中 2

NEG Rw 对字 GPR 的内容求负 ,仍存放在字 GPR中 2

NEGB Rb 对字节 GPR 的内容求负 ,仍存放在字节 GPR中 2

移位指令

SH L Rw , Rw 对第一个 GPR的内容左移位 ,移位的位数由第二个 GPR给出

SHL Rw, # data4 对 GPR的内容左移位 ,移位的位数由立即数给出 2

SHR Rw , Rw 对第一个 GPR的内容右移位 ,移位的位数由第二个 GPR给出

SHR Rw , # da ta4 对 GPR 的内容右移位 ,移位的位数由立即数给出

ROL Rw , Rw 对第一个 GPR 的内容左循环移位 ,移位的位数由第二个

GPR 给出2

ROL Rw , # da ta4 对 GPR 的内容左循环移位 ,移位的位数由立即数给出 2

ROR Rw , Rw 对第一个 GPR 的内容右循环移位 ,移位的位数由第二个GPR 给出

2

ROR Rw , # da ta4 对 GPR 的内容右循环移位 ,移位的位数由立即数给出 2

ASHR Rw , Rw 对第一个 GPR 的内容算术右移位 ,移位的位数由第二个GPR 给出 ,移位时保留符号位

2

ASHR Rw , # da ta4 对 GPR 的内容算术右移位 ,移位的位数由立即数给出 ,移位

时保留符号位2

亿恒 C164CI 16 位单片机

Page 392: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

399

续表

助 记 符 说 明 字节数

规格化指令

PRIOR Rw , Rw 对第二个 GPR的内容规格化 ,移位的位数放在第一个 GPR中 2

位操作指令

BCLR baddr 对直接寻址位清零 2

BSET baddr 对直接寻址位置“1” 2

BMOV baddr , baddr 将第二个可寻址位传送到第一个可寻址位中 4

BMOVN baddr , baddr 将第二个可寻址位的“反”传送到第一个可寻址位中 4

BAND baddr , baddr 两个可寻址位的“与” 4

BOR baddr , baddr 两个可寻址位的“或” 4

BXOR baddr , baddr 两个可寻址位的“异或” 4

BCMP baddr , baddr 比较两个可寻址位 4

BFLDH bitoff ,

# mask8 , # data8 对可位寻址的直接寻址存储器的高字节的位作屏蔽和修改 4

BFLDL bitoff ,

# mask8 , # data8 对可位寻址的直接寻址存储器的低字节的位作屏蔽和修改 4

比较指令

CMP Rw , Rw 比较两个字 GPR 内容的大小 2

CMP Rw , [ Rw ] 比较 GPR 内容和间接寻址字存储器内容的大小 2

CMP Rw , [ Rw + ] 比较 GPR 和间接寻址存储器的内容后 ,将源地址指针加 2 2

CMP Rw , # da ta3 比较字 GPR 内容和立即数的大小 2

CMP reg , # data16 比较寄存器内容和立即数的大小 4

CMP reg , mem 比较寄存器和直接寻址存储器的内容 4

CMPB Rb , Rb 比较两个字节 GPR内容的大小 2

CMPB Rb , [ Rw ] 比较字节 GPR 内容和间接寻址的字节存储器内容的大小 2

CMPB Rb , [ Rw + ] 比较字节 GPR 和间接寻址的字节存储器内容的大小后 ,将源地址指针加 1

2

CMPB Rw , # da ta3 比较字节 GPR 内容和立即数的大小 2

CMPB reg , # data8 比较寄存器低字节的内容和立即数的大小 4

CMPB reg , mem 比较寄存器低字节和直接寻址的字节存储器的内容的大小 4

CMPD1 Rw , # da ta4 比较 GPR 内容和立即数的大小 ,并将 GPR 内容减 1 2

CMPD1 Rw , # da ta16 比较 GPR 内容和字立即数的大小 ,并将 GPR内容减 1 4

CMPD1 Rw , mem 比较 GPR 和直接寻址存储器的内容后 ,将 GPR内容减 1 4

CMPD2 Rw , # da ta4 比较 GPR 内容和立即数的大小 ,并将 GPR 内容减 2 2

CMPD2 Rw , # da ta16 比较 GPR 内容和字立即数的大小 ,并将 GPR内容减 2 4

CMPD2 Rw , mem 比较 GPR和直接寻址的存储器的内容后 ,并将 GPR内容减 2 4

CMPI1 Rw , # da ta4 比较 GPR 内容和立即数的大小 ,并将 GPR 内容加 1 2

CMPI1 Rw , # da ta16 比较 GPR 内容和字立即数的大小 ,并将 GPR内容加 1 4

CMPI1 Rw , mem 比较 GPR和直接寻址的存储器的内容后 ,并将 GPR内容加 1 4

CMPI2 Rw , # da ta4 比较 GPR 内容和立即数的大小 ,并将 GPR 内容加 2 2

CMPI2 Rw , # da ta16 比较 GPR 内容和字立即数的大小 ,并将 GPR内容加 2 4

CMPI2 Rw , mem 比较 GPR和直接寻址的存储器的内容后 ,并将 GPR内容加 2 4

附录 1 C166 族单片机指令一览表

Page 393: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

400

续表

助 记 符 说 明 字节数跳转和调用指令

JMPA cc, caddr cc条件满足时 ,将 caddr装载入 I P;否则 ,执行下一条指令 4

JMPI cc, [ Rw] cc条件满足时 ,将 GPR 的内容装载入 IP ;否则 ,执行下一条指令

2

JMPR cc, rel cc条件满足时 ,在 IP 上增加一个相对偏移量得到新的 IP ;否则 ,执行下一条指令

2

JMPS seg , caddr 无条件转移 4

JB baddr , rel 可寻址位置“1”时 ,在 I P 上增加一个相对偏移量得到新的 IP ;

否则 ,执行下一条指令4

JBC baddr , rel 可寻址位置“1”时 ,将该位清零 ,并在 IP 上增加一个相对偏移

量得到新的 IP ;否则 ,执行下一条指令4

JNB baddr , rel 可寻址位清零时 ,在 IP 上增加一个相对偏移量得到新的 IP ;

否则 ,执行下一条指令4

JNBS baddr , rel 可寻址位清零时 ,将该位置“1”,并在 IP 上增加一个相对偏移量得到新的 IP ;否则 ,执行下一条指令

4

CALLA cc, caddr cc条件满足时 ,将当前 IP 压入堆栈 , caddr 装载入 IP ,调用位于 caddr处的子程序 ;否则 ,执行 CALLA 的下一条指令

4

CALLI cc, [ Rw] cc条件满足时 ,将当前 IP 压入堆栈 , GPR 的内容装载入 IP ,

调用子程序 ;否则 ,执行 CALLI的下一条指令2

CALLR rel 将当前 IP 压入堆栈 ,在 IP 上增加相对偏移量得到子程序的入口地址

2

CALLS seg , caddr 将当前 CSP 和 IP 压入堆栈 ,第一个操作数放入 CSP 中 ,第二个操作数放入 IP 中 ,调用子程序

4

PCALL reg , caddr 先将寄存器中的字压入堆栈 ,再将当前 IP 也压入堆栈 ,第二个操作数放入 IP 中 ,调用子程序

4

TRAP # trap7 根据陷阱号 t rap7,在中断向量表中找相应处理程序入口地址 2

返回指令

RE T 从堆栈中取出一个字 ,放入 IP 2

RE TS 从堆栈中取出一个字 ,放入 IP ;再取出一个字 ,放入 CSP 2

RE TP reg 从堆栈中取出一个字 ,放入 IP;再取出一个字 ,存放到寄存器中 2

RE TI 从堆栈中取出一个字 ;放入 IP ;当系统使用分段方式时 ,将CSP 的内容从堆栈中取出 ;最后 ,从堆栈中取出 PSW 内容

2

空操作指令

NOP 无任何操作 2

系统控制指令SRST 复位 4

IDL E CPU 停止工作 ,进入休闲模式 4

PWRDN CPU 和所有周边电路都停止工作 ,进入停止模式 ( NMI引脚

低电平时有效 )4

SRVWDT 启动监视定时器。将计时器的低字节清零 ,高字节加载预设值 4

DISWDT 停止监视定时器 4

EINIT 表明初始化结束 ,使引脚RSTOUT输出高电平 4

亿恒 C164CI 16 位单片机

Page 394: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

401

续表

助 记 符 说 明 字节数

系统控制指令 (续 )

ATOMIC # irang2 在 ATOMIC指令后的 irang2 ( 1≤ irang2≤4 )条指令执行期间 ,关闭标准中断和 PEC中断 ,关闭 A 类陷阱

2

EXTR # irang2 在 EXTR 指令后的 irang2 ( 1~ 4 )条指令执行期间 ,对扩展

SFR 空间寻址 ,同时关闭标准中断和 PEC 中断 ,关闭 A 类陷阱2

EXTP Rw , # irang2

在 EXTP 指令后的 irang2 (1~ 4)条指令执行期间 ,长寻址或是间接寻址中的数据页号为 Rw 的内容 ,同时关闭标准中断和PEC中断 ,关闭 A 类陷阱

2

EXTP # pag10 ,

# irang2

在 EXTP 指令后的 irang2 (1~ 4)条指令执行期间 ,长寻址或是间接寻址中的数据页号为立即数 pag ,同时关闭标准中断和PEC中断 ,关闭 A 类陷阱

4

EXTPR Rw , # irang2

在 EXTPR 指令后的 irang2 (1~4 )条指令执行期间 ,长寻址或是间接寻址中的数据页号为 Rw 的内容 ,对扩展 SFR 空间寻址 ,同时关闭标准中断和 PEC中断 ,关闭 A 类陷阱

2

EXTPR # pag10 ,

# irang2

在 EXTPR 指令后的 irang2 (1~4 )条指令执行期间 ,长寻址或是间接寻址中的数据页号为立即数 pag ,对扩展 SFR 空间寻址 ,同时关闭标准中断和 PEC中断 ,关闭 A 类陷阱

4

EXTS Rw , # irang2

在 EXTS指令后的 irang2 ( 1~4)条指令执行期间 ,长寻址或是间接寻址本身作为段偏移量 ,数据段号为 Rw 的内容 ,同时关

闭标准中断和 P EC中断 ,关闭 A 类陷阱

2

EXTS # seg8 ,

# irang2

在 EXTS指令后的 irang2 ( 1~4)条指令执行期间 ,长寻址或是间接寻址本身作为段偏移量 ,数据段号为立即数 seg ,同时关

闭标准中断和 P EC中断 ,关闭 A 类陷阱

4

EXTSR Rw , # irang2

在 EXTSR 指令后的 irang2( 1~4 )条指令执行期间 ,长寻址或

是间接寻址本身作为段偏移量 ,数据段号为 Rw 的内容 ,对扩展SFR 空间寻址 ,同时关闭标准中断和 PEC 中断 ,关闭 A 类陷阱

2

EXTSR # seg8 ,

# irang2

在 EXTSR 指令后的 irang2( 1~4 )条指令执行期间 ,长寻址或是间接寻址本身作为段偏移量 ,数据段号为立即数 seg ,对扩展SFR 空间寻址 ,同时关闭标准中断和 PEC 中断 ,关闭 A 类陷阱

4

附录 1 C166 族单片机指令一览表

Page 395: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

附录 2 专用寄存器速查表

下面是以字母排序的专用寄存器一览表。

可位寻址的 SFR 在“名称”栏中加有标志“b”。扩展 SFR 在“物理地址”栏中加有标

志“E”。位于片内 XBUS周边电路中的寄存器在“物理地址”栏中加有标志“X”。

名 称 物理地址 8 位地址 说 明 复位值

ADCIC b FF98 H CCH A/ D 转换结束中断控制寄存器 0000 H

ADCON b FFA0 H D0 H A/ D 转换控制寄存器 0000 H

ADDAT FEA0 H 50 H A/ D 转换结果寄存器 0000 H

ADDAT2 F0A0 H E 50 H A/ D 转换 2结果寄存器 0000 H

ADDRSEL1 FE18 H 0CH 地址选择寄存器 1 0000 H

ADDRSEL2 FE1 AH 0DH 地址选择寄存器 2 0000 H

ADDRSEL3 FE1CH 0E H 地址选择寄存器 3 0000 H

ADDRSEL4 FE1E H 0FH 地址选择寄存器 4 0000 H

ADEIC b FF9AH CDH A/ D 转换溢出错误中断控制寄存器 0000 H

BUCCON0 b FF0CH 86 H 总线配置寄存器 0 0000 H

BUCCON1 b FF14 H 8AH 总线配置寄存器 1 0000 H

BUCCON2 b FF16 H 8BH 总线配置寄存器 2 0000 H

BUCCON3 b FF18 H 8CH 总线配置寄存器 3 0000 H

BUCCON4 b FF1AH 8DH 总线配置寄存器 4 0000 H

C1BTR EF04 H X --- CAN1 位时序寄存器 UUUUH

C1CSR EF00 H X --- CAN1 控制/ 状态寄存器 XX01 H

C1GMS EF06 H X --- CAN1 全局短屏蔽 UFU UH

C1LARn EFn4 H X --- CAN1 低位仲裁寄存器 (报文 n) UUUUH

C1LGML EF0 AH X --- CAN 低位全局长屏蔽 UUUUH

C1LMLM EF0E H X --- CAN 最后报文的低位屏蔽 UUUUH

C1MCFGn EFn6 H X --- CAN 报文配置寄存器 (报文 n) UUH

C1MCRn EFn0 H X --- CAN 报文控制寄存器 (报文 n) UUUUH

C1PCIR EF02 H X --- CAN1 端口控制/ 中断寄存器 XXXXH

C1 UARn EFn2 H X --- CAN 高位仲裁寄存器 (报文 n) UUUUH

C1 UGML EF08 H X --- CAN1 高位全局长屏蔽 UUUUH

C1 UMLM EF0CH X --- CAN 最后报文的高位屏蔽 UUUUH

CC10IC b FF8CH C6 H 外部中断 2 控制寄存器 0000 H

CC11IC b FF8E H C7 H 外部中断 3 控制寄存器 0000 H

CC16 FE60 H 30 H CAPCOM 寄存器 16 0000 H

CC16IC b F160 H E B0 H CAPCOM 寄存器 16 中断控制寄存器 0000 H

CC17 FE62 H 31 H CAPCOM 寄存器 17 0000 H

CC17IC b F162 H E B1 H CAPCOM 寄存器 17 中断控制寄存器 0000 H

CC18 FE64 H 32 H CAPCOM 寄存器 18 0000 H

CC18IC b F164 H E B2 H CAPCOM 寄存器 18 中断控制寄存器 0000 H

Page 396: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

403

续表

名 称 物理地址 8 位地址 说 明 复位值

CC19 FE66 H 33 H CAPCOM 寄存器 19 0000 H

CC19IC b F166 H E B3 H CAPCOM 寄存器 19 中断控制寄存器 0000 H

CC20 FE68 H 34 H CAPCOM 寄存器 20 0000 H

CC20IC b F168 H E B4 H CAPCOM 寄存器 20 中断控制寄存器 0000 H

CC21 FE6 AH 35 H CAPCOM 寄存器 21 0000 H

CC21IC b F16 AH E B5 H CAPCOM 寄存器 21 中断控制寄存器 0000H

CC22 FE6CH 36 H CAPCOM 寄存器 22 0000 H

CC22IC b F16CH E B6 H CAPCOM 寄存器 22 中断控制寄存器 0000H

CC23 FE6E H 37 H CAPCOM 寄存器 23 0000 H

CC23IC b F16E H E B7 H CAPCOM 寄存器 23 中断控制寄存器 0000H

CC24 FE70 H 38 H CAPCOM 寄存器 24 0000 H

CC24IC b F170 H E B8 H CAPCOM 寄存器 24 中断控制寄存器 0000 H

CC25 FE72 H 39 H CAPCOM 寄存器 25 0000 H

CC25IC b F172 H E B9 H CAPCOM 寄存器 25 中断控制寄存器 0000 H

CC26 FE74 H 3AH CAPCOM 寄存器 26 0000 H

CC26IC b F174 H E BAH CAPCOM 寄存器 26 中断控制寄存器 0000 H

CC27 FE76 H 3BH CAPCOM 寄存器 27 0000 H

CC27IC b F176 H E BBH CAPCOM 寄存器 27 中断控制寄存器 0000 H

CC28 FE78 H 3CH CAPCOM 寄存器 28 0000 H

CC28IC b F178 H E BCH CAPCOM 寄存器 28 中断控制寄存器 0000 H

CC29 FE7 AH 3DH CAPCOM 寄存器 29 0000 H

CC29IC b F184 H E C2 H CAPCOM 寄存器 29 中断控制寄存器 0000 H

CC30 FE7CH 3E H CAPCOM 寄存器 30 0000 H

CC30IC b F18CH E C6 H CAPCOM 寄存器 30 中断控制寄存器 0000H

CC31 FE7E H 3FH CAPCOM 寄存器 31 0000 H

CC31IC b F194 H E CAH CAPCOM 寄存器 31 中断控制寄存器 0000 H

CC60 FE30 H 18 H CAPCOM6 寄存器 0 0000 H

CC61 FE32 H 19 H CAPCOM6 寄存器 1 0000 H

CC62 FE34 H 1AH CAPCOM6 寄存器 2 0000 H

CC6EIC b F188 H E C4 H CAPCOM6 紧急中断控制寄存器 0000 H

CC6CIC b F17E H E BFH CAPCOM6 中断控制寄存器 0000 H

CC6MCON b FF32 H 99 H CAPCOM6 模式控制寄存器 00FFH

CC6MIC b FF36 H 9BH CAPCOM6 模式中断控制寄存器 0000 H

CC6MSEL F036 H E 1BH CAPCOM 模式选择寄存器 0000 H

CC81C b FF88 H C4 H 外部中断 0 控制寄存器 0000 H

CC91C b FF8AH C5 H 外部中断 1 控制寄存器 0000 H

CCM4 b FF22 H 91 H CAPCOM 模式控制寄存器 4 0000 H

CCM5 b FF24 H 92 H CAPCOM 模式控制寄存器 5 0000 H

CCM6 b FF26 H 93 H CAPCOM 模式控制寄存器 6 0000 H

CCM7 b FF28 H 94 H CAPCOM 模式控制寄存器 7 0000 H

CMP13 FE36 H 1BH CAPCOM6 定时器 13 比较寄存器 0000 H

附录 2 专用寄存器速查表

Page 397: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

404

续表

名 称 物理地址 8 位地址 说 明 复位值

CP FE10 H 08 H CPU 上下文指针寄存器 FC00 H

CSP FE08 H 04 H CPU 码段指针寄存器 ( 8位 ,不能直接写 ) 0000 H

CTCON b FF30 H 98 H CAPCOM6 比较定时器控制寄存器 1010 H

DP0 H b F102 H E 81 H P0 H 方向控制寄存器 00 H

DP0L b F100 H E 80 H P0L方向控制寄存器 00 H

DP1 H b F106 H E 83 H P1 H 方向控制寄存器 00 H

DP1L b F104 H E 82 H P1L方向控制寄存器 00 H

DP3 b FFC6 H E3 H P3 口方向控制寄存器 0000 H

DP4 b FFCAH E5 H P4 口方向控制寄存器 00 H

DP8 b FFD6 H EBH P8 口方向控制寄存器 00H

DPP0 FE00 H 00 H CPU 数据页指针 0寄存器 (10位 ) 0000 H

DPP1 FE02 H 01 H CPU 数据页指针 1寄存器 (10位 ) 0001 H

DPP2 FE04 H 02 H CPU 数据页指针 2寄存器 (10位 ) 0002 H

DPP3 FE06 H 03 H CPU 数据页指针 3寄存器 (10位 ) 0003 H

EXICON b F1C0 H E E0 H 外部中断控制寄存器 0000 H

EXISEL b F1DAH E EDH 外部中断源选择寄存器 0000 H

FOCON b FFAAH D5 H 频率输出控制寄存器 0000 H

IDCH IP F07CH E 3E H 标识符 XXXXH

IDMANUF F07E H E 3FH 标识符 1820 H

IDMEM F07 AH E 3DH 标识符 XXXXH

IDMEM2 F076 H E 3BH 标识符 XXXXH

IDPROG F078 H E 3CH 标识符 XXXXH

ISNC b F1DE H E EFH 中断子节点控制寄存器 0000 H

MDC b FF0E H 87 H 乘/ 除控制寄存器 0000 H

MDH FE0CH 06 H 乘/ 除高位字寄存器 0000 H

MDL FE0E H 07 H 乘/ 除低位字寄存器 0000 H

ODP3 b F1C6 H E E3 H P3 口漏极开路控制寄存器 0000 H

ODP4 b F1CAH E E5 H P4 口漏极开路控制寄存器 00 H

ODP8 b F1D6 H E EBH P8 口漏极开路控制寄存器 00 H

ONES b FF1E H 8FH 常量“1”寄存器 (只读) FFFF H

OPAD b EDC2 H X --- OT P 编程接口地址寄存器 0000 H

OPCTRL b EDC0 H X --- OT P 编程接口控制寄存器 0007 H

OPDAT b EDC4 H X --- OT P 编程接口数据寄存器 0000 H

P0 H b FF02 H 81 H P0 口高位字节寄存器 00 H

P0L b FF00 H 80 H P0 口低位字节寄存器 00H

P1 H b FF06 H 83 H P1 口高位字节寄存器 00H

P1L b FF04 H 82 H P1 口低位字节寄存器 00H

P3 b FFC4 H E2 H P3 口寄存器 0000 H

P4 b FFC8 H E4 H P4 口寄存器( 6 位) 00 H

P5 b FFA2 H D1 H P5 口寄存器(只读 ) XXXXH

P5DIDIS b FFA4 H D2 H P5 口数字输入禁止寄存器 0000 H

亿恒 C164CI 16 位单片机

Page 398: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

405

续表

名 称 物理地址 8 位地址 说 明 复位值

P8 b FFD4 H EAH P8 口寄存器( 8 位) 00 H

PECC0 FEC0 H 60 H PEC通道 0 控制寄存器 0000 H

PECC1 FEC2 H 61 H PEC通道 1 控制寄存器 0000 H

PECC2 FEC4 H 62 H PEC通道 2 控制寄存器 0000 H

PECC3 FEC6 H 63 H PEC通道 3 控制寄存器 0000 H

PECC4 FEC8 H 64 H PEC通道 4 控制寄存器 0000 H

PECC5 FECAH 65 H PEC通道 5 控制寄存器 0000 H

PECC6 FECCH 66 H PEC通道 6 控制寄存器 0000 H

PECC7 FECEH 67 H PEC通道 7 控制寄存器 0000 H

PICON b F1C4 H E E2 H 端口输入门限控制寄存器 0000 H

POCON0 H F082 H E 41 H P0 H 口输出控制寄存器 0000 H

POCON0L F080 H E 40 H P0L口输出控制寄存器 0000 H

POCON1 H F086 H E 43 H P1 H 口输出控制寄存器 0000 H

POCON1L F084 H E 42 H P1L口输出控制寄存器 0000 H

POCON20 F0AAH E 55 H 专用引脚输出控制寄存器 0000 H

POCON3 F08 AH E 45 H P3 口输出控制寄存器 0000 H

POCON4 F08CH E 46 H P4 口输出控制寄存器 0000 H

POCON8 F092 H E 49 H P8 口输出控制寄存器 0000 H

PSW b FF10 H 88 H CPU 状态字寄存器 0000 H

RP0H b F108H E 84 H 系统启动配置寄存器 (只读 ) XXH

RSTCON b F1E0 H m --- 复位控制寄存器 00XXH

RTCH F0D6 H E 6BH RTC高位字寄存器

RTCL F0D4 H E 6AH RTC低位字寄存器

S0BG FEB4 H 5AH 串行通道 0 波特率生成器重装载寄存器 0000 H

S0CON b FFB0 H D8 H 串行通道 0 控制寄存器 0000 H

S0EIC b FF70 H B8 H 串行通道 0 错误中断控制寄存器 0000 H

S0RBUF b FEB2 H 59 H 串行通道 0 接收缓冲寄存器(只读 ) 0000 H

S0RIC b FF6E H B7 H 串行通道 0 接收中断控制寄存器 0000 H

S0TBIC b F19CH E CE H 串行通道 0 发送缓冲器中断控制寄存器 0000 H

S0TBUF b FEB0 H 58 H 串行通道 0 发送缓冲寄存器(只写 ) 0000 H

S0TIC b FF6CH B6 H 串行通道 0 发送中断控制寄存器 0000 H

SP FE12 H 09 H CPU 系统堆栈指针 FC00 H

SSCBR F0B4 H 5AH SSC波特率寄存器 0000 H

SSCCON b F0B2 H D9 H SSC控制寄存器 0000 H

SSCEIC b FF76 H BBH SSC错误中断控制寄存器 0000 H

SSCRB F0B2 H 59 H SSC接收缓冲器 XXXXH

SSCRIC b FF74 H BAH SSC接收中断控制寄存器 0000 H

SSCTB F0B0 H 58 H SSC发送缓冲器 0000 H

SSCTIC b FF72 H B9 H SSC发送中断控制寄存器 0000 H

ST KOV FE14 H 0AH CPU 堆栈上溢指针 FA00 H

ST KUN FE16 H 0BH CPU 堆栈下溢指针 FC00 H

附录 2 专用寄存器速查表

Page 399: 亿恒 C164CI 16 位单片机idl.hbdlib.cn/book/00000000000000/pdfbook2/bj/00/3b/dy... · 2010. 7. 24. · c164ci 单片机是亿恒c166 族16 位单片机中很具代表性的一员。

406

续表

名 称 物理地址 8 位地址 说 明 复位值

SYSCON b FF12 H 89 H CPU 系统配置寄存器 0000 H①

SYSCON1 b F1DCH E EE H CPU 系统配置寄存器 1 0000 H

SYSCON2 b F1D0 H E E8 H CPU 系统配置寄存器 2 0000H

SYSCON3 b F1D4 H E EAH CPU 系统配置寄存器 3 0000H

T12IC b F190 H E C8 H CAPCOM6 定时器 12 中断控制寄存器 0000 H

T12OF F034 H E 1AH CAPCOM6 定时器 12 偏移寄存器 0000 H

T12P F030 H E 18 H CAPCOM6 定时器 12 周期寄存器 0000 H

T13IC b F198 H E CCH CAPCOM6 定时器 13 中断控制寄存器 0000 H

T13P F032 H E 19 H CAPCOM6 定时器 13 周期寄存器 0000 H

T14 F0D2 H E 69 H RTC定时器 14 寄存器

T14REL F0D0 H E 68 H RTC定时器 14 重装载寄存器

T2 FE40 20 H GPT1 定时器 2 寄存器 0000 H

T2CON b FF40 H A0 H GPT1 定时器 2 控制寄存器 0000 H

T2IC b FF60 H B0 H GPT1 定时器 2 中断控制寄存器 0000 H

T3 FE42 H 21 H GPT1 定时器 3 寄存器 0000 H

T3CON b FF42 H A1 H GPT1 定时器 3 控制寄存器 0000 H

T3IC b FF62 H B1 H GPT1 定时器 3 中断控制寄存器 0000 H

T4 FE44 H 22 H GPT1 定时器 4 寄存器 0000 H

T4CON b FF44 H A2 H GPT1 定时器 4 控制寄存器 0000 H

T4IC b FF64 H B2 H GPT1 定时器 4 中断控制寄存器 0000 H

T7 F050 H E 28 H CAPCOM 定时器 7 寄存器 0000 H

T78CON b FF20 H 90 H CAPCON 定时器 7和 8 控制寄存器 0000 H

T7IC b F17 AH E BDH CAPCOM 定时器 7 中断控制寄存器 0000 H

T7RE L F054 H E 2AH CAPCOM 定时器 7 重装载寄存器 0000 H

T8 F052 H E 29 H CAPCOM 定时器 8 寄存器 0000 H

T8IC b F17CH E BEH CAPCOM 定时器 8 中断控制寄存器 0000 H

T8RE L F056 H E 2BH CAPCOM 定时器 8 重装载寄存器 0000 H

T FR b FFACH D6 H 陷阱标志寄存器 0000 H

TRCON b FF34 H 9AH CAPCOM6 陷阱使能控制寄存器 00XXH

WDT FEAE H 57 H 监视定时器寄存器 (只读 ) 0000 H

WDTCON FFAEH D7 H 监视定时器控制寄存器 00XXH②

XP0IC b F186 H E C3 H CAN1 模块中断控制寄存器 0000 H

XP1IC b F18E H E C7 H Flas h终止中断控制寄存器 0000 H

XP3IC b F19E H E CFH PL L/ RTC 中断控制寄存器 0000 H

ZEROS b FF1CH 8E H 常量“0”寄存器 (只读) 0000 H

① 系统配置在复位时选择。

② 复位值取决于指定的复位源。

亿恒 C164CI 16 位单片机