当前位置:首页 >> 信息与通信 >>

K60芯片IAR及CW例程和开发环境使用


ARM Cortex M4 嵌入式系统开发实践 -基于飞思卡尔 K60 系列微控制器

王宜怀 王林 编著

内容简介
本书以飞思卡尔半导体公司(原摩托罗拉半导体部)的 32 位 K60 系列微控制器中 MK60N512VMD100 为蓝本阐述嵌入式系统的软件与硬件设计。全书共 17 章,其中第 1 章 为概述,阐述嵌入式系统的

知识体系、学习误区、学习建议及基于硬件构件的嵌入式系统开 发方法。第 2 章给出 MK60N512VMD100 硬件最小系统。第 3 章给出第一个样例程序及 CodeWarrior、IAR 工程组织,完成第一个 MK60N512VMD100 工程的入门。第 4 章阐述串 行通信接口 UART,并给出第一个带中断的实例。1-4 章完成了学习一个新 MCU 完整要素 (知识点)的入门。6-16 章分别给出 GPIO 的应用(键盘、LED 及 LCD) 、定时器、A/D 转 换、SPI、I2C、I2S、Flash、CAN、USB、SDHC、TSI、以太网及 MK60N512VMD100 其他 模块等。第 17 章讲述了嵌入式操作系统有关的知识。 本书提供了所有实例源程序、辅助资料、相关芯片资料及常用软件工具。 本书可供大学有关专业的高年级学生和研究生用作教材或参考读物, 也可供嵌入式系统 开发与研究人员用作参考和进修资料。

I

前言
嵌入式计算机系统简称为嵌入式系统,其概念最初源于传统测控系统对计算机的需求。 随着以微处理器(MPU)为内核的微控制器(MCU)制造技术的不断进步,计算机领域在 通用计算机系统与嵌入式计算机系统这两大分支分别得以发展。 通用计算机已经在科学计算、 事物管理、通信、日常生活等各个领域产生重要的影响。在后 PC 时代,嵌入式系统的广阔 应用将是计算机发展的重要特征。一般来说,嵌入式系统的应用范围可以粗略分为两大类: 一类是电子系统的智能化(如工业控制、现代农业、家用电器、汽车电子、测控系统、数据 采集、传感网应用等) ;另一类是计算机应用的延伸(如手机、电子图书、通信、网络、计 算机外围设备等) 。不论如何分类,嵌入式系统的技术基础是不变的,即要完成一个以 MCU 为核心的嵌入式系统应用产品设计,需要有硬件、软件及行业领域相关知识。但是,随着嵌 入式系统中软件规模日益增大, 对嵌入式底层驱动软件的封装提出了更高的要求, 可复用性 与可移植性受到特别的关注,嵌入式软硬件构件化开发方法逐步被业界所重视。

本书基本思想
本书以嵌入式硬件构件与底层软件构件设计为主线, 按照嵌入式软件工程的要求, 以飞 思卡尔半导体公司(原摩托罗拉半导体部)的 32 位 K60 系列中 MK60N512VMD100 微控制 器为蓝本阐述嵌入式系统的软件与硬件设计。并阐述嵌入式操作系统相关知识。 我从事单片机与嵌入式系统科研与教学工作是从 1991 年开始的。1991-1999 年间,使 用 MCS-51 系列 MCU。2000 年至现在,一直使用飞思卡尔(2004 年以前是摩托若拉半导体 部)的 MCU。十多年来,陆续以飞思卡尔的 HC08/S08(8 位) 、S12/S12X(16 位) 、ColdFire (32 位) 、M*Core(32 位,该内核转给中国后称为 C*Core)进行科研开发与教学工作,并 以这些 MCU 为蓝本先后写了一些嵌入式应用技术入门方面的书, 得到了大多数读者的肯定, 深受感动。 2010-2011 年, 苏州大学嵌入式团队的工作重点是进行 ARM Cortex-M4 核 Kinetis 系列 MCU(K60) 、新型 Zigbee 芯片 MC1323x、DSC 芯片 MC56F825x 等方面的工作,这 些工作成果也将会逐步与读者分享。 在写书方面, 多年来一直在探索如何能够使读者不误入 歧途,如何能够快速入门,如何能够规范编程,如何能够由浅入深、循序渐进,如何能够使 读者打好嵌入式硬件与软件基础。为此从以下几点把握写作: (1)把与芯片无关的通用知识 分离出来, 从涉及底层编程角度对基本原理进行简明扼要的阐述, 分别放入相应章节的前面 或网上光盘中。 这些知识主要包括通用 I/O、 串行通信、 键盘编码原理、 LED 扫描原理、 SPI、 2 PWM、USB、I C、CAN、A/D、D/A、嵌入式以太网等。并在各书中基本保持不变。这一 点是接受了飞思卡尔全球大学计划负责人 Andy Mastronardi 先生的建议, 经过几年不断修改 完善,可把通用部分斟酌得更好一些。也使得 8 位、16 位、32 位的书风格保持一致。新的 芯片出来后,书的修改只要更新与芯片的相关部分。 (2)硬件相关的部分,采用了硬件构件 思想,制定了一些基本规范,对底层驱动进行构件化封装,提高了可复用性与可移植性。使 程序结构更加清晰,初学者可以“先使用、后理解”(3)不论是 8 位、16 位、32 位,也不 。 论是哪个芯片,从编程角度,把与硬件相关的共性和与硬件无关的共性分别抽象出来,力求 做到,硬件相关部分风格一致,硬件无关部分程序一致。这样便于融会贯通,不再纠结芯片 位数、操作系统等问题。

关于飞思卡尔微控制器
II

飞思卡尔半导体是全球最大半导体公司之一, 在微控制器领域长期居全球市场领先地位, 以高可靠性获得业界的一致赞誉。该公司的微控制器产品系列齐全,由不同位数(如 8 位、 16 位、32 位等) 、不同封装形式(如 DIP、SOIC、QFP、LQFP、BGA 等) 、不同温度范围 (0~70℃、-40~85℃、-40~105℃、-40~125℃等) 、所含模块不同等构成了庞大的产品系 列。飞思卡尔的 S08(8 位) 、S12/S12X(16 位) 、ColdFire(32 位) 、ARM Cortex(32 位) 等系列 MCU,广泛地应用于汽车电子、消费电子、工业控制、网络和无线市场等嵌入式系 统各个领域。系列齐全的微控制器产品,为嵌入式系统各种应用提供了选择与解决方案,使 得用户可以各取所需。 不论是电子系统智能化还是计算机应用延伸的嵌入式应用设计, 无论 需要怎样的系统功能和集成度, 总能从飞思卡尔庞大产品系列中选取一款合适的芯片进行应 用开发。这正是嵌入式系统产品设计者所期望的,也节省了嵌入式学习者的时间,可以加快 开发进度,提高开发质量。

本书特点
2009 年,我撰写了《基于 32 位 ColdFire 构建嵌入式系统》一书,2010 年又撰写了《嵌 入式技术基础与实践(第 2 版)。两书中系统阐述和应用了嵌入式构件开发思想,本书秉承 》 这些工作, 按照 “通用知识—芯片编程结构概要—基本编程方法—底层驱动构件封装—应用 方法与举例”的线条,逐步阐述电子系统智能化嵌入式应用的软件与硬件设计。 (1)把握通用知识与芯片相关知识之间的平衡。书中对于嵌入式“通用知识”的基本原 理,以应用为立足点,进行语言简洁、逻辑清晰的阐述,同时注意与芯片相关知识之间的衔 接,使读者在更好地理解基本原理的基础上,理解芯片应用的设计,同时反过来,加深对通 用知识的理解。 (2)把握硬件与软件的关系。嵌入式系统是软件与硬件的综合体,嵌入式系统设计是一 个软件、硬件协同设计的工程,不能像通用计算机那样,软件、硬件完全分开来看。特别是 对电子系统智能化嵌入式应用来说, 没有对硬件的理解就不可能写好嵌入式软件, 同样没有 对软件的理解也不可能设计好嵌入式硬件。 因此, 本书注重把握硬件知识与软件知识之间的 关系。 (3) 对底层驱动进行构件化封装。 书中对每个模块均给出根据嵌入式软件工程基本原则 并按照构件化封装要求编制底层驱动程序,同时给出详细、规范的注释及对外接口,为实际 应用提供底层构件,方便移植与复用,可以为读者进行实际项目开发节省大量时间。 (4)设计合理的测试用例。书中所有源程序均经测试通过,并保留测试用例在本书的随 书光盘中,避免了因例程的书写或固有错误给读者带来烦恼。这些测试用例,也为读者验证 与理解带来方便。 (5)随书光盘提供了所有模块完整的底层驱动构件化封装程序、文档与测试用例,同时 随书光盘中还包含芯片参考手册、写入器安装与使用方法、工具软件(如开发环境、程序写 入与读出软件、串口调试工具等) 、有关硬件原理图及其他技术资料。 (6)提供硬件评估版、写入调试器,并给出单独进行程序写入与读出的软件工具,方便 读者进行实践与应用。

本书主要内容
本书以飞思卡尔半导体的 32 位 K60 系列微控制器中 MK60N512VMD100 为蓝本阐述嵌 入式系统的软件与硬件设计。全书共 17 章,其中第 1 章为概述,阐述嵌入式系统的知识体 系、学习误区、学习建议及基于硬件构件的嵌入式系统开发方法。第 2 章给出 MK60N512VMD100 硬件最小系统。第 3 章给出第一个样例程序及 CodeWarrior、IAR 工程
III

组织,完成第一个 MK60N512VMD100 工程的入门。第 4 章阐述串行通信接口 UART,并 给出第一个带中断的实例。1-4 章完成了学习一个新 MCU 完整要素(知识点)的入门。6-16 章分别给出 GPIO 的应用 (键盘、 LED 及 LCD) 定时器、 、 A/D 转换、 SPI、 I2C、 I2S、 Flash、 CAN、USB、SDHC、TSI、以太网及 MK60N512VMD100 其他模块等。第 17 章讲述了嵌入 式操作系统有关的知识。

致谢
本书除封面署名作者外, 还有苏州大学计算机科学与技术学院嵌入式应用方向研究生姚 丹丹、李翠霞、朱乐乐、冯上栋、石晶、苏勇等协助书稿整理及程序调试工作,他们卓有成 效的工作,使本书更加实用。飞思卡尔半导体有限公司的 Andy Mastronardi 先生、马莉女士 一直关心支持苏州大学飞思卡尔嵌入式系统研发中心的建设, 为本书的撰写提供了硬件及软 件资料, 并提出了许多宝贵建议。 飞思卡尔半导体有限公司的许多技术人员提供了技术支持。 北京航空航天大学出版社的董立娟编辑为本书的出版付出了大量细致的工作。 在此一并表示 诚挚的谢意。 鉴于作者水平有限,书中难免存在不足和错误之处,恳望读者提出宝贵意见和建议,以 便再版时改进。

王宜怀 2011 年 4 月于苏州大学

IV

网上光盘资料目录结构

V

ARM CORTEX M4嵌入式系统开发实践............................................................................ I -基于飞思卡尔K60系列微控制器 ......................................................................................... I 第1章 概述............................................................................................................................... 1 1.1 嵌入式系统定义、由来及特点 ................................................................................ 1 1.1.1 嵌入式系统的定义 ......................................................................................... 1 1.1.2 嵌入式系统的由来及其与微控制器的关系 ................................................. 1 1.1.3 嵌入式系统的特点 ......................................................................................... 3 1.2 嵌入式系统开发所遇到的若干问题 ........................................................................ 4 1.3 嵌入式硬件构件的基本思想与应用方法 ................................................................ 4 1.4 基于硬件构件的嵌入式系统硬件电路设计 ............................................................ 5 1.4.1 设计时需要考虑的基本问题 ......................................................................... 5 1.4.2 硬件构件化电路原理图绘制的简明规则 ..................................................... 7 1.4.3 实验 PCB 板设计的简明规则 ....................................................................... 9 1.5 基于硬件构件的嵌入式底层软件构件的编程方法 .............................................. 13 1.5.1 嵌入式硬件构件和软件构件的层次模型 ................................................... 13 1.5.2 底层构件的实现方法与编程思想 ............................................................... 14 1.5.3 硬件构件及底层软件构件的重用与移植方法 ........................................... 14 第2章 KINETIS概述与MK60N512VMD100硬件最小系统 ............................................. 17 2.1 ARM 公司的发展史及 ARM 架构的发展 .............................................................. 17 2.2 Kinetis 系列微处理器概述 ...................................................................................... 24 2.3 Kinetis 系列微控制器存储器映像与编程结构 ...................................................... 26 2.3.1 K60 系列 MCU 性能概述与内部结构简图 ................................................ 27 2.3.2 K60 系列存储器映像 .................................................................................... 29 2.4 K60 的引脚功能与硬件最小系统 ........................................................................... 31 2.4.1K60 的引脚功能 ............................................................................................. 31 2.4.2K60 硬件最小系统 ......................................................................................... 39 2.4.3 硬件最小系统测试方法 ............................................................................... 42 第3章 第一个样例程序及工程组织..................................................................................... 43 3.1 通用 I/O 接口基本概念及连接方法....................................................................... 43 3.2 MK60N512VMD100 的 GPIO ................................................................................. 44 3.3 开发环境与 JTAG 写入器 ...................................................................................... 45 3.3.1 IAR 开发环境简介与基本使用方法 ............................................................ 45 3.3.2 CW 开发环境简介与基本使用方法............................................................. 46 3.3.3 JTAG 写入器 ................................................................................................. 47 3.3.4 MK60N512VMD100 硬件核心板 ................................................................ 47 3.4 IAR 工程文件组织 ................................................................................................... 48 3.4.1 工程文件的组织........................................................................................... 49 3.4.2 初始化相关文件........................................................................................... 51 3.5 CW 工程文件组织 ................................................................................................... 55 3.5.1 工程文件的组织........................................................................................... 55 3.5.2 初始化相关文件........................................................................................... 55
VI

3.6 第一个应用实例:控制小灯闪烁 .......................................................................... 56 3.6.1 GPIO 构件 ..................................................................................................... 57 3.6.2 Light 构件 ...................................................................................................... 59 3.6.3 Light 测试工程主程序 ................................................................................. 61 3.7 理解第一个 C 工程的执行过程 ............................................................................. 62 第4章 异步串行通信............................................................................................................. 63 4.1 异步串行通信的基础知识 ...................................................................................... 63 4.1.1 基本概念....................................................................................................... 63 4.1.2 RS-232C 总线标准 ........................................................................................ 65 4.1.3 电平转换电路原理 ....................................................................................... 66 4.2 MK60N512VMD100 的 UART 模块功能描述....................................................... 67 4.3 MK60N512VMD100 的 UART 模块的编程结构................................................... 69 4.4 基于构件方法的 UART 编程 ................................................................................. 74 4.4.1 UART 构件的函数原型设计 ........................................................................ 74 4.4.2 UART 构件的头文件 .................................................................................... 75 4.4.3 UART 构件的源程序文件 ............................................................................ 77 4.4.4 UART 构件的测试工程 ................................................................................ 82 4.5 K60 第一个带有中断功能的实例 ........................................................................... 84 4.6 进一步讨论.............................................................................................................. 87 4.6.1 流控制与 Break 信号 ................................................................................... 87 4.6.2 延长串口通信的距离 ................................................................................... 87 4.6.3 串口的扩展................................................................................................... 87 第5章 GPIO的应用实例——键盘、LED与LCD .............................................................. 88 5.1 键盘技术概述........................................................................................................... 88 5.1.1 键盘模型及接口............................................................................................ 88 5.1.2 键盘编程的基本问题 .................................................................................... 88 5.1.3 键盘构件设计与测试实例 ............................................................................ 88 5.2 LED 技术概述 .......................................................................................................... 88 5.2.1 扫描法 LED 显示编程原理 ......................................................................... 88 5.2.2 LED 构件设计与测试实例 ........................................................................... 88 5.3 LCD 技术概述.......................................................................................................... 88 5.3.1 LCD 的特点和分类 ....................................................................................... 88 5.3.2 点阵字符型液晶显示模块 ........................................................................... 88 5.3.3 HD44780 ........................................................................................................ 88 5.3.4 LCD 构件设计与测试实例 ........................................................................... 88 第6章 定时器相关模块......................................................................................................... 89 6.1 计数器/定时器的基本工作原理 .............................................................................. 89 6.2 可编程延时模块 PDB ............................................................................................. 89 6.2.1 PDB 工作原理 ............................................................................................... 89 6.2.2 PDB 相关寄存器 ........................................................................................... 89 6.2.3 PDB 构件设计及测试实例 ........................................................................... 89 6.3 Flex 定时器 FTM ..................................................................................................... 89
VII

6.3.1 FTM 工作原理............................................................................................... 89 6.3.2 FTM 相关寄存器........................................................................................... 89 6.3.3 FTM 中断 ...................................................................................................... 89 6.3.4 FTM 构件设计及测试实例........................................................................... 89 6.4 周期中断定时器 PIT ............................................................................................... 89 6.4.1 PIT 工作原理 ................................................................................................. 89 6.4.2 PIT 相关寄存器 ............................................................................................. 89 6.4.3 PIT 构件设计及测试实例 ............................................................................. 89 6.5 低功耗定时器 LPTMR ............................................................................................ 90 6.5.1 LPTMR 工作原理 ......................................................................................... 90 6.5.2 LPTMR 相关寄存器 ..................................................................................... 90 6.5.3 LPTMR 构件设计及测试实例...................................................................... 90 6.6 载波调制发射器 CMT ............................................................................................. 90 6.6.1 CMT 工作原理 .............................................................................................. 90 6.6.2 CMT 相关寄存器 .......................................................................................... 90 6.6.3 CMT 中断 ...................................................................................................... 90 6.6.4 CMT 构件设计及测试实例 .......................................................................... 90 6.7 实时时钟 RTC .......................................................................................................... 90 6.7.1 RTC 工作原理 ............................................................................................... 90 6.7.2 RTC 相关寄存器 ........................................................................................... 90 6.7.3 RTC 构件设计及测试实例 ........................................................................... 90 第7章 A/D与D/A ................................................................................................................... 91 7.1 A/D 和 D/A 转换的基本问题 .................................................................................. 91 7.2 A/D 转换模块 ........................................................................................................... 91 7.2.1 A/D 转换模块寄存器 .................................................................................... 91 7.2.2 A/D 转换构件设计及测试实例 .................................................................... 91 7.3 D/A 转换模块 ........................................................................................................... 91 7.3.1 D/A 转换模块寄存器 .................................................................................... 91 7.3.2 D/A 转换构件设计及测试实例 .................................................................... 91 7.4 比较器 CMP 概述 ................................................................................................... 91 第8章 SPI .............................................................................................................................. 92 8.1 SPI 的基本工作原理 ................................................................................................ 92 8.1.1 SPI 概述 ......................................................................................................... 92 8.1.2 SPI 的数据传输 ............................................................................................. 92 8.1.3 SPI 模块的时序 ............................................................................................. 92 8.2 SPI 模块的编程基础 ................................................................................................ 92 8.2.1 SPI 模块的引脚 ............................................................................................. 92 8.2.2 SPI 模块的寄存器 ......................................................................................... 92 8.2.3 SPI 编程基本方法 ......................................................................................... 92 8.3 SPI 构件设计及测试实例 ........................................................................................ 92 第9章 I2C与I2S .................................................................................................................... 93 9.1 I2C 总线概述............................................................................................................ 93
VIII

9.1.1 I2C 总线特点................................................................................................. 93 9.1.2 I2C 总线标准的发展历史 ............................................................................. 93 9.1.3 I2C 总线的相关术语 ..................................................................................... 93 9.2 I2C 总线工作原理.................................................................................................... 93 9.2.1 总线上数据的有效性 ................................................................................... 93 9.2.2 总线上的信号............................................................................................... 93 9.2.3 总线上数据的传输格式 ............................................................................... 93 9.2.4 总线寻址约定............................................................................................... 93 9.3 I2C 模块的编程基础 ................................................................................................ 93 9.3.1 I2C 模块寄存器............................................................................................. 93 9.3.2 I2C 模块编程基本方法 ................................................................................. 93 9.4 I2C 构件设计及测试实例 ........................................................................................ 93 9.5 I2S 概述 .................................................................................................................... 93 9.5.1 I2S 的特点 ..................................................................................................... 93 9.5.2 I2S 操作模式 ................................................................................................. 93 9.5.3 I2S 的相关寄存器定义 ................................................................................. 93 9.6 I2S 的构件化设计与测试实例 ................................................................................ 94 第10章 FLASH ..................................................................................................................... 95 10.1 Flash 内存控制寄存器 FMC .................................................................................. 95 10.1.1 FMC 特点 .................................................................................................... 95 10.1.2 FMC 相关寄存器 ........................................................................................ 95 10.1.3 FMC 的功能 ................................................................................................ 95 10.2 Flash 存储器概述与编程模式 ............................................................................... 95 10.2.1 Flash 存储器编程的基本概念 .................................................................... 95 10.2.2 Flash 存储器的编程寄存器 ........................................................................ 95 10.2.3 Flash 存储器的编程过程 ............................................................................ 95 10.2.4 Flash 存储器测试实例 ................................................................................ 95 10.3 FlexBUS 概述 ......................................................................................................... 95 10.3.1 FlexBUS 的特点 .......................................................................................... 95 10.3.2 FlexBUS 相关的寄存器 .............................................................................. 95 10.3.3 FlexBUS 的功能 .......................................................................................... 95 10.4 EzPort 概述 ............................................................................................................. 95 10.4.1 EzPort 的特点 .............................................................................................. 95 10.4.2 EzPort 信号描述 .......................................................................................... 95 10.4.3 EzPort 命令 .................................................................................................. 95 10.5 Flash 存储器的保护特性和安全性 ....................................................................... 96 10.5.1 周期性冗余检测 CRC ................................................................................ 96 10.5.2 存储器映像密码加速单元 MMCAU ........................................................ 96 10.5.3 随机数操作 RNGB..................................................................................... 96 第11章 CAN模块FLEXCAN ............................................................................................... 97 11.1 CAN 总线通用知识 ............................................................................................... 97 11.1.1 CAN 总线协议的历史概况......................................................................... 97 11.1.2 CAN 硬件系统的典型电路......................................................................... 97
IX

11.1.3 CAN 总线的有关基本概念......................................................................... 97 11.1.4 帧结构 ......................................................................................................... 97 11.1.5 位时间 ......................................................................................................... 97 11.2 K60 的 CAN 模块概述与编程结构....................................................................... 97 11.2.1 CAN 特性 .................................................................................................... 97 11.2.2 操作模式 ..................................................................................................... 97 11.2.3 CAN 模块的内存映像及寄存器定义......................................................... 97 11.2.4 CAN 报文缓冲区 ........................................................................................ 97 11.3 K60 的 CAN 模块报文发送与接收函数设计 ....................................................... 97 11.3.1 数据帧发送/接收 ........................................................................................ 97 11.3.2 远程帧发送与接收 ..................................................................................... 97 11.3.3 仲裁处理、匹配处理及报文缓冲区管理 ................................................. 97 11.4 K60 的 CAN 模块编程实例................................................................................... 97 11.4.1 初始化函数设计 .......................................................................................... 97 11.4.2 K60 的 CAN 模块构件化设计及测试实例 ................................................ 98 第12章 USB 2.0 编程 ........................................................................................................... 99 12.1 USB 基本概念及硬件特性 .................................................................................... 99 12.1.1 USB 特性 ..................................................................................................... 99 12.1.2 USB 相关基本概念 ..................................................................................... 99 12.1.3 USB 的物理特性 ......................................................................................... 99 12.2 USB 的通信协议 .................................................................................................... 99 12.2.1 USB 基本通信单元:包 ............................................................................. 99 12.2.2 USB 通信中的事务处理 ............................................................................. 99 12.2.3 从设备的枚举看 USB 数据传输 ............................................................... 99 12.3 K60 的 USB 模块功能简介 .................................................................................. 99 12.3.1 K60 的 USB 模块功能简介 ........................................................................ 99 12.3.2 K60 的 USB 模块主要寄存器介绍 ........................................................... 99 12.4 K60 作为 USB 从机的开发方法 .......................................................................... 99 12.4.1 PC 端 USB 设备驱动程序的选择及基本原理 .......................................... 99 12.4.2 PC 作为 USB 主机的程序设计 .................................................................. 99 12.4.3 K60 作为 USB 从机的程序设计 ................................................................ 99 12.5 K60 作为 USB 主机的开发方法 .......................................................................... 99 12.5.1 K60 作为 USB 主机的基本功能 ................................................................ 99 12.5.2 USB 主机与 USB 设备通信 ..................................................................... 100 12.6 K60 的 USB 设备电量检测模块 USBDCD ........................................................ 100 12.6.1 USBDCD 概述........................................................................................... 100 12.6.2 USBDCD 的内存映射与寄存器定义....................................................... 100 12.6.3 USBDCD 构件化设计与测试实例........................................................... 100 12.7 K60 的 UAB 电压调节器..................................................................................... 100 12.7.1 电压调节器特征 ....................................................................................... 100 12.7.2 电压调节器操作模式 ............................................................................... 100 第13章 高容量SD存储卡SDHC ........................................................................................ 101 13.1 SDHC 基本概念及硬件特性 ............................................................................... 101
X

13.1.1 SD 概述...................................................................................................... 101 13.1.2 SD 相关基本概念...................................................................................... 101 13.1.3 SD 的物理特性.......................................................................................... 101 13.2 SD 的通信协议..................................................................................................... 101 13.2.1 SD 基本通信单元...................................................................................... 101 13.2.2 SD 通信中的事务处理.............................................................................. 101 13.2.3 SD 数据传输.............................................................................................. 101 13.3 K60 的 SD 模块基本编程方法 ............................................................................ 101 13.3.1 K60 的 SD 模块功能简介 ......................................................................... 101 13.3.2 K60 的 SD 模块存储器映像与寄存器定义 ............................................. 101 13.3.3 K60 的 SD 模块构件化设计与测试实例 ................................................. 101 第14章 TSI .......................................................................................................................... 102 14.1 TSI 概述 ................................................................................................................ 102 14.1.1 TSI 特点 ..................................................................................................... 102 14.1.2 TSI 的操作模式 ......................................................................................... 102 14.1.3 TSI 信号描述 ............................................................................................. 102 14.2 TSI 编程 ................................................................................................................ 102 14.2.1 TSI 的相关寄存器定义 ............................................................................. 102 14.2.2 TSI 的功能描述 ......................................................................................... 102 14.2.3 TSI 的构件化设计与测试实例 ................................................................. 102 第15章 基于K60的嵌入式以太网 ..................................................................................... 103 15.1 嵌入式以太网相关基础知识 .............................................................................. 103 15.1.1 以太网的由来与协议模型 ....................................................................... 103 15.1.2 以太网中主要物理设备 ........................................................................... 103 15.1.3 IEEE 1588 概述 ......................................................................................... 103 15.1.4 相关名词解释........................................................................................... 103 15.2 K60 以太网概述 ................................................................................................... 103 15.2.1 K60 以太网特性 ........................................................................................ 103 15.2.2 K60 以太网外部引脚说明 ........................................................................ 103 15.2.3 K60 以太网存储映像与寄存器带那个一 ................................................ 103 15.3 链路层编程.......................................................................................................... 103 15.3.1 MAC 帧格式.............................................................................................. 103 15.3.2 MAC 帧的接收与发送.............................................................................. 103 15.3.3 MAC 帧收发测试实例.............................................................................. 103 15.4 网络层及更高层编程 .......................................................................................... 103 15.4.1 Ipv4 与 Ipv6 简介 ...................................................................................... 103 15.4.2 ICMP 简介 ................................................................................................. 103 15.4.3 UDP 简介................................................................................................... 103 15.4.4 TCP 简介 ................................................................................................... 104 15.4.5 测试实例................................................................................................... 104 15.5 FIFO ...................................................................................................................... 104 15.5.1 FIFO 概述 .................................................................................................. 104 15.5.2 FIFO 的接收与发送 .................................................................................. 104
XI

15.5.3 FIFO 的保护机制 ...................................................................................... 104 15.5.4 FIFO 测试实例 .......................................................................................... 104 15.6 PHY 管理接口与以太网接口 .............................................................................. 104 15.6.1 MDIO 简介 ................................................................................................ 104 15.6.2 以太网接口的发送与接收 ....................................................................... 104 15.7 K60 以太网模块的其他功能 ............................................................................... 104 15.7.1 全双工流控制操作 ................................................................................... 104 15.7.2 魔术包检测............................................................................................... 104 15.7.3 IP 加速器控制 ........................................................................................... 104 15.7.4 复位与停止控制 ....................................................................................... 104 15.7.5 遗留缓冲区描述符 ................................................................................... 104 15.7.6 增强缓冲区描述符 ................................................................................... 104 第16章 系统时钟与其他功能模块..................................................................................... 105 16.1 时钟模块.............................................................................................................. 105 16.2 芯片配置模块...................................................................................................... 105 16.2.1 芯片配置模块简介 ................................................................................... 105 16.2.2 芯片配置模块寄存器定义 ....................................................................... 105 16.3 电源管理模块...................................................................................................... 105 16.3.1 电源模式................................................................................................... 105 16.3.2 低功耗模式............................................................................................... 105 16.4 端口控制与中断模块 .......................................................................................... 105 16.5 复位与启动模块.................................................................................................. 105 16.6 杂项控制模块...................................................................................................... 105 16.7 交叉开关模块...................................................................................................... 105 16.8 看门狗.................................................................................................................. 106 第17章 操作系统的移植..................................................................................................... 106

XII

第1章 概述
作为全书导引,本章主要知识点有:①简要给出嵌入式系统定义、由来及特点;②讨论 嵌入式开发中的硬件、软件的可复用与可移植性问题;③提出嵌入式硬件构件的基本思想, 阐述基于硬件构件的嵌入式系统开发方法; ④给出基于硬件构件的嵌入式系统硬件电路设计 方法与嵌入式底层软件构件的编程方法。

1.1 嵌入式系统定义、由来及特点

1.1.1 嵌入式系统的定义
嵌入式系统(Embedded system)有多种多样的定义,但本质是相同的。本书关于嵌入 式系统的定义取自美国 CMP Books 出版的 Jack Ganssle 和 Michael Barr 著作《Embedded System Dictionary》1。 嵌入式系统的定义:一种计算机硬件和软件的组合,也许还有机械装置,用于实现一个 特定功能。在某些特定情况下,嵌入式系统是一个大系统或产品的一部分。世界上第一个嵌 入式系统是 1971 年 Busicom 公司用 Intel 单芯片 4004 微处理器完成的商用计算器系列。该 词典还给出了嵌入式系统的一些示例:微波炉、手持电话、计算器、数字手表、录像机、巡 航导弹、GPS 接收机、数码相机、传真机、跑步机、遥控器和谷物分析仪等,难以尽数。 通过与通用计算机的对比可以更形象地理解嵌入式系统的定义。 该词典给出的通用计算机定 义是:计算机硬件和软件的组合,用作通用计算平台。PC、MAC 和 Unix 工作站是最流行 的现代计算机。 我国《国家标准 GB/T 5271 信息技术词汇-嵌入式系统与单片机》部分,给出的嵌入式 系统定义是:置入应用对象内部起操作控制作用的专用计算机系统。 国内对嵌入式系统定义曾进行过广泛讨论, 有许多不同说法。 其中嵌入式系统定义的涵 盖面问题是主要争论焦点之一。例如,有的学者认为不能把手持电话叫嵌入式系统,而只能 把其中起控制作用的部分叫嵌入式系统, 而手持电话可以称为嵌入式系统的应用产品。 其实, 这些并不妨碍人们对嵌入式系统的理解, 所以不必对定义感到困惑。 有些国内学者特别指出, 在理解嵌入式系统定义时,不要把嵌入式系统与嵌入式系统产品相混淆。实际上,从口语或 书面语言角度,不区分“嵌入式系统”与“嵌入式系统产品” ,只要不妨碍对嵌入式系统的 理解就没有关系。 为了更清楚阐述嵌入式系统特点,首先介绍大多数嵌入式系统的核心部件-MCU(微 控制器)的基本概念。

1.1.2 嵌入式系统的由来及其与微控制器的关系
1.MCU(微控制器)的基本含义
MCU 是单片微型计算机 (单片机) 的简称, 早期的英文名是 Single-chip Microcomputer, 后来大多数称之为微控制器(Microcontroller)或嵌入式计算机(Embedded computer) 。现
中译本:Jack Ganssle 等著,马广云等译, 《英汉双解嵌入式系统词典》 ,北京航空航天大学出版社, 2006 年。 1
1

在 Microcontroller 已经是计算机中一个常用术语,但在 1990 年代之前,大部分英文词典并 没有这个词。我国学者一般使用中文“单片机”一词,而缩写使用“MCU”2。所以本书后 面的简写一律以 MCU 为准。 MCU 的基本含义是: 在一块芯片上集成了中央处理单元 (CPU) 、 存储器(RAM/ROM 等) 、定时器/计数器及多种输入输出(I/O)接口的比较完整的数字处理 系统。图 1-1 给出了典型的 MCU 组成框图。
CPU 工作支撑模块 RAM Flash 存储器

MCU 内部总线(控制总线、数据总线、地址总线)

定时器接口

串行通信接口

A/D 转换接口

??

其他 I/O 模块

图 1-1 一个典型的 MCU 内部框图 MCU 是在计算机制造技术发展到一定阶段的背景下出现的,它使计算机技术从科学计 算领域进入到智能化控制领域。 从此, 计算机技术在两个重要领域——通用计算机领域和嵌 入式(Embedded)计算机领域都获得了极其重要的发展,为计算机的应用开辟了更广阔的 空间。 就 MCU 组成而言,虽然它只是一块芯片,但包含了计算机的基本组成单元,仍由运算 器、控制器、存储器、输入设备、输出设备五部分组成,只不过这些都集成在一块芯片上, 这种结构使得 MCU 成为具有独特功能的计算机。

2.嵌入式系统的由来
通俗地说, 计算机是因科学家需要一个高速的计算工具而产生的。 直到二十世纪七十年 代,电子计算机在数字计算、逻辑推理及信息处理等方面表现出非凡的能力。在通信、测控 与数据传输等领域, 人们对计算机技术给予了更大的期待。 这些领域的应用与单纯的高速计 算要求不同,主要表现在:直接面向控制对象;嵌入到具体的应用体中,而非计算机的面貌 出现;能在现场连续可靠地运行;体积小,应用灵活;突出控制功能,特别是对外部信息的 捕捉与丰富的输入输出功能等。 由此可以看出, 满足这些要求的计算机与满足高速数值计算 的计算机是不同的。因此,一种称之为 MCU 或微控制器的技术得以产生并发展。为了区分 这两种计算机类型, 通常把满足海量高速数值计算的计算机称为通用计算机系统, 而把嵌入 到实际应用系统中,实现嵌入式应用的计算机称之为嵌入式计算机系统,简称嵌入式系统。

3.嵌入式系统与 MCU 的关系
何立民先生说: “有些人搞了十多年的 MCU 应用,不知道 MCU 就是一个最典型的嵌 3 入式系统” 。 实际上, MCU 是在通用 CPU 基础上发展起来的, MCU 具有体积小、 价格低、 稳定可靠等优点,它的出现和迅猛发展,是控制系统领域的一场技术革命。MCU 以其较高 的性能价格比、灵活性等特点,在现代控制系统中具有十分重要的地位。大部分嵌入式系统 以 MCU 为核心进行设计。MCU 从体系结构到指令系统都是按照嵌入式系统的应用特点专门 设计的,它能很好地满足应用系统的嵌入、面向测控对象、现场可靠运行等方面的要求。因 此以 MCU 为核心的系统是应用最广的嵌入式系统。 在实际应用时, 开发者可以根据具体要求 与应用场合,选用最佳型号的 MCU 嵌入到实际应用系统中。 在 MCU 出现之前,人们必须用模拟电路、数字电路实现大部分计算与控制功能,这样
2 3

MCU 的英文全称是 Microcontroller Unit。 详见《单片机与嵌入式系统应用》 ,2004 年第 1 期。 2

使得控制系统体积庞大,易出故障。MCU 出现以后,情况发生了变化,系统中的大部分计 算与控制功能由 MCU 的软件实现。 其它电子线路成为 MCU 的外围接口电路, 承担着输入、 输出与执行动作等功能,而计算、比较与判断等原来必须用电路实现的功能,可以用软件取 代,大大地提高了系统的性能与稳定性,这种控制技术称之为嵌入式控制技术。在嵌入式控 制技术中,核心是 MCU,其它部分依此而展开。

1.1.3 嵌入式系统的特点
要谈嵌入式系统特点, 不同学者也许有不同说法。 这里从与通用计算机对比的角度谈嵌 入式系统的特点。

1.嵌入式系统属于计算机系统,但不单独以通用计算机的面目 出现
嵌入式系统的本名叫嵌入式计算机系统(Embedded computer system) ,它不仅具有通用 计算机的主要特点,又具有自身特点。嵌入式系统也必须要有软件才能运行,但其隐含在种 类众多的具体产品中。同时,通用计算机种类屈指可数,而嵌入式系统不仅芯片种类繁多, 而且由于应用对象大小各异,嵌入式系统作为控制核心,已经融入到各个行业的产品之中。

2.嵌入式系统开发需要专用工具和特殊方法
嵌入式系统不像通用计算机那样有了计算机系统就可以进行应用开发。一般情况下, MCU 芯片本身不具备开发功能,必须要有一套与相应芯片配套的开发工具和开发环境。这 些工具和环境一般基于通用计算机上的软硬件设备以及各种逻辑分析仪、 混合信号示波器等。 开发时往往有主机和目标机的概念,主机用于程序的开发,目标机作为程序的执行机,开发 时需要交替结合进行。

3.使用 MCU 设计嵌入式系统,数据与程序空间采用不同存储 介质
在通用计算机系统中,程序存储在硬盘上。实际运行时,通过操作系统将要运行的程序 从硬盘调入内存(RAM) ,运行中的程序、常数、变量均在 RAM 中。而以 MCU 为核心的 嵌入式系统,其程序被固化到非易失性存储器中4。变量及堆栈使用 RAM 存储器。

4.开发嵌入式系统涉及软件、硬件及应用领域的知识
嵌入式系统与硬件紧密相关,嵌入式系统的开发需要硬件、软件协同设计、协同测试。 同时, 由于嵌入式系统专用性很强, 通常是用在特定应用领域, 如嵌入在手机、 冰箱、 空调、 各种机械设备、 智能仪器仪表中起核心控制作用, 功能专用。 因此, 进行嵌入式系统的开发, 还需要对领域知识有一定的理解。当然,一个团队协作开发一个嵌入式产品,其中各个成员 可以扮演不同角色, 但对系统的整体理解与把握并相互协作, 有助于一个稳定可靠嵌入式产 品的诞生。

4

目前,非易失性存储器通常为 Flash 存储器,特点见有关“Flash 存储器在线编程”章节。 3

5.嵌入式系统的其他特点
除了以上特点之外,嵌入式系统还具有其他方面的特点。 在资源方面: 嵌入式系统通常专用于某一特定应用领域, 其硬件资源不会像通用计算机 那样丰富;在可靠性方面:嵌入式系统一般要求更高可靠性和稳定性;在实时性方面:相当 多嵌入式系统有实时性要求; 在成本方面: 嵌入式系统通常极其关注成本; 在功耗要求方面: 一些嵌入式系统要求低功耗; 在生命周期方面: 嵌入式系统通常比通用计算机系统生命周期 长,升级换代比通用计算机慢。在知识综合方面:嵌入式系统是将先进的计算机技术、半导 体技术及电子技术与各个行业的具体应用相结合的产物,是一个技术密集、资金密集、高度 分散、不断创新的知识集成系统。它的构成既有硬件又有软件,不仅包括应用软件,也可能 包括系统软件。它既有数字电路又有模拟电路。其产品技术含量高,涉及多种学科,不容易 开发,因此也不容易形成技术垄断。 这些特点决定了嵌入式系统的开发方法、 开发难度、 开发手段等, 均不同于通用计算机, 也不同于常规的电子产品。

1.2 嵌入式系统开发所遇到的若干问题
自从1974年第一款微处理器芯片问世以来,嵌入式系统应用已深入到军事、航空航天、 通信、家电等各个领域。近年来,随着微控制器(MCU)内部Flash存储器可靠性提高及擦 写方式的变化,内部RAM及Flash存储器容量的增大,以及外部模块内置化程度的提高,设 计复杂性、设计规模及开发手段已经发生了根本变化。 在嵌入式系统发展的最初阶段,嵌入式系统开发(包括硬件和软件设计)通常是由一个 工程师来承担, 软件在整个工作中的比例很小。 随着时间的推移, 硬件设计变得越来越复杂, 软件的份量也急剧增长,嵌入式开发人员也由一人发展为由若干人组成的开发团队。 目前,嵌入式系统开发主要存在以下两大问题: 问题 1:硬件设计缺乏重用支持 导致硬件设计缺乏重用支持的主要原因是: 目前缺少可供硬件设计工程师们共同遵守的 设计规范。 设计人员往往是凭借个人工作经验和习惯的积累进行系统硬件电路的设计。 在开 发完一个嵌入式应用系统再进行下一个应用开发时, 硬件电路原理图往往需要从零开始, 重 新绘制;或者在一个类似的原理图上修改,但往往又很麻烦,容易出错。 问题 2:驱动程序可移植性差 驱动程序的开发在嵌入式系统的开发中具有举足轻重的地位。 驱动程序的好坏直接关系 着整个嵌入式系统的稳定性和可靠性。然而,开发出完备、稳定的驱动程序并非易事。长期 以来,开发人员在编写驱动程序时缺少软件工程思想的支撑,软、硬件设计过程孤立,造成 与硬件密切相关的底层软件缺乏通用性, 可移植性和可复用性较差, 开发过程中缺少标准化、 文档化的管理,给开发人员之间的交流以及日后系统的维护带来很大的困难。 上述两个问题导致的结果是系统开发周期长, 效率低。 下面提出的基于硬件构件的软硬 件设计思想可在一定程度上解决这些问题。

1.3 嵌入式硬件构件的基本思想与应用方法
什么是嵌入式硬件构件?它与我们常说的硬件模块有什么不同? 众所周知, 嵌入式硬件是任何嵌入式产品不可分割的重要组成部分, 是整个嵌入式系统
4

的构建基础,嵌入式应用程序和操作系统都运行在特定的硬件体系上。一个以 MCU 为核心 的嵌入式系统通常包括以下硬件模块: 电源、 写入器接口电路、 硬件支撑电路、 UART、 USB、 Flash、A/D、D/A、LCD、键盘、传感器输入电路、通信电路、信号放大电路、驱动电路等 模块。其中有些模块集成在 MCU 内部,有的位于 MCU 之外。 与硬件模块的概念不同, 嵌入式硬件构件是指将一个或多个硬件功能模块、 支撑电路及 其功能描述封装成一个可重用的硬件实体,并提供一系列规范的输入/输出接口。由定义可 知, 传统概念中的硬件模块是硬件构件的组成部分, 一个硬件构件可能包含一个硬件功能模 块,也有可能包含多个。 根据接口之间的生产消费关系, 接口可分为提供接口和需求接口两类。 根据所拥有接口 类型的不同,硬件构件分为核心构件、中间构件和终端构件三种类型。核心构件只有提供接 口, 没有需求接口。 也就是说, 它只为其它硬件构件提供服务, 而不接受服务。 在以单 MCU 为核心的嵌入式系统中,MCU 的最小系统就是典型的核心构件。中间构件既有需求接口又 有提供接口,即它不仅能够接受其它构件提供的服务,而且也能够为其它构件提供服务。而 终端构件只有需求接口,它只接受其它构件提供的服务。这三种类型构件的区别如表 4-1 所 示。 表 1-1 核心构件、中间构件和终端构件的区别
类型 核心构件 中间构件 终端构件 需求接口 无 有 有 提供接口 有 有 无 举例 芯片的硬件最小系统 电源控制构件、232电平转换构件 LCD构件、LED构件、键盘构件

利用硬件构件进行嵌入式系统硬件设计之前, 应该进行硬件构件的合理划分, 按照一定 规则, 设计与系统目标功能无关的构件个体, 然后进行 “组装” 完成具体系统的硬件设计。 , 这样, 这些构件个体也可以被组装到其他嵌入式系统中。 在硬件构件被应用到具体系统中后, 设计人员需要做的仅仅是为需求接口添加接口网标。

1.4 基于硬件构件的嵌入式系统硬件电路设计

1.4.1 设计时需要考虑的基本问题
设计以 MCU 为核心的嵌入式系统硬件电路需要根据需求分析进行综合考虑, 需要考虑 的问题较多,这里给出几个特别要注意的问题。

1.MCU 的选择
选择 MCU 时要考虑 MCU 所能够完成的功能、MCU 的价格、功耗、供电电压、I/O 口 电平、管脚数目以及 MCU 的封装等因素。MCU 的功耗可以从其电气性能参数中查到。供 电电压有 5V、3.3V 以及 1.8V 超低电压供电模式。为了能合理分配 MCU 的 I/O 资源,在 MCU 选型时可绘制一张引脚分配表,供以后的设计使用。

2.电源
(1)考虑系统对电源的需求,例如系统需要几种电源,如 24V、12V、5V 或者 3.3V 等,估计各需要多少功率或最大电流(mA) 。在计算电源总功率时要考虑一定的余量,可按 公式“电源总功率=2×器件总功率”来计算。 (2)考虑芯片与器件对电源波动性的需求。一般允许电源波动幅度在±5%以内。对于 A/D 转换芯片的参考电压一般要求±1%以内。
5

(3)考虑工作电源是使用电源模块还是使用外接电源。

3.普通 I/O 口
(1)上拉、下拉电阻:考虑用内部或者外部上/下拉电阻,内部上/下拉阻值一般在 700 Ω左右,低功耗模式不宜使用。外部上/下拉电阻根据需要可选 10KΩ~1MΩ之间。 (2)开关量输入:一定要保证高低电压分明。理想情况下高电平就是电源电压,低电 平就是地的电平。如果外部电路无法正确区分高低电平,但高低仍有较大压差,可考虑用 A/D 采集的方式设计处理。对分压方式中的采样点,要考虑分压电阻的选择,使该点通过采 样端口的电流不小于采样最小输入电流,否则无法进行采样。 (3)开关量输出:基本原则是保证输出高电平接近电源电压,低电平接近地电平。I/O 口的吸纳电流一般大于放出电流。 对小功率元器件控制最好是采用低电平控制的方式。 一般 情况下,若负载要求小于 10mA,则可用芯片引脚直接控制;电流在 10~100mA 时可用三极 管控制,在 100mA~1A 时用 IC 控制;更大的电流则适合用继电器控制,同时建议使用光 电隔离芯片。

4.A/D 电路与 D/A 电路
(1)A/D 电路:要清楚前端采样基本原理,对电阻型、电流型和电压型传感器采用不 同的采集电路。如果采集的信号微弱,还要考虑如何进行信号放大。 (2)D/A 电路:考虑 MCU 的引脚通过何种输出电路控制实际对象。

5.控制电路
对外控制电路要注意设计的冗余与反测, 要有合适的信号隔离措施等。 在评估设计的布 板时,一定要在构件的输入输出端引出检测孔,以方便排查错误时测量。

6. 考虑低功耗
低功耗设计并不仅仅是为了省电,更多的好处在于降低了电源模块及散热系统的成本。 由于电流的减小也减少了电磁辐射和热噪声的干扰。 随着设备温度的降低, 器件寿命则相应 延长,要做到低功耗一般需要注意以下几点: (1)并不是所有的总线信号都要上拉。上下拉电阻也有功耗问题需要考虑。上下拉电 阻拉一个单纯的输入信号,电流也就几十微安以下。但拉一个被驱动了的信号,其电流将达 毫安级。所以需要考虑上下拉电阻对系统总功耗的影响。 (2)不用的 I/O 口不要悬空,如果悬空的话,受外界的一点点干扰就可能成为反复振 荡的输入信号,而 MOS 器件的功耗基本取决于门电路的翻转次数。 (3)对一些外围小芯片的功耗也需要考虑。对于内部不太复杂的芯片功耗是很难确定 的,它主要由引脚上的电流确定。例如有的芯片引脚在没有负载时,耗电大概不到 1 毫安, 但负载增大以后,可能功耗很大。

7.考虑低成本
(1)正确选择电阻值与电容值。比如一个上拉电阻,可以使用 4.5K-5.3K 的电阻,你 觉得就选个整数 5K,事实上市场上不存在 5K 的阻值,最接近的是 4.99K(精度 1%) ,其次 是 5.1K(精度 5%) ,其成本分别比精度为 20%的 4.7K 高 4 倍和 2 倍。20%精度的电阻阻值
6

只有 1、1.5、2.2、3.3、4.7、6.8 几个类别(含 10 的整数倍) ;类似地,20%精度的电容也 只有以上几种值,如果选了其它的值就必须使用更高的精度,成本就翻了几倍,却不能带来 任何好处。 (2)指示灯的选择。面板上的指示灯选什么颜色呢?有些人按颜色选,比如自己喜欢 蓝色就选蓝色。但是其它红绿黄橙等颜色的不管大小(5mm 以下)封装如何,都已成熟了 几十年,价格一般都在 5 毛钱以下,而蓝色却是近三四年才发明的,技术成熟度和供货稳定 度都较差,价格却要贵四五倍。 (3)不要什么都选最好的。在一个高速系统中并不是每一部分都工作在高速状态,而 器件速度每提高一个等级, 价格差不多要翻倍, 另外还给信号完整性问题带来极大的负面影 响。

1.4.2 硬件构件化电路原理图绘制的简明规则
1.硬件构件设计的通用规则
在设计硬件构件的电路原理图时,需遵循以下基本原则: (1)元器件命名格式:对于核心构件,其元器件直接编号命名,同种类型的元件命名 时冠以相同的字母前缀。 如电阻名称为 R1、 等, R2 电容名称为 C1、 等, C2 电感名称为 L1、 L2 等,指示灯名称为 E1、E2 等,二极管名称为 D1、D2 等,三极管名称为 Q1、Q2 等,开 关名称为 K1、K2 等。对于中间构件和终端构件,其元器件命名格式采用“构件名-标志字 符?” 。例如,LCD 构件中所有的电阻名称统一为“LCD-R?” ,电容名称统一为“LCD-C?” 。 当构件原理图应用到具体系统中时,可借助原理图编辑软件为其自动编号。 (2)为硬件构件添加详细的文字描述,包括中文名称、英文名称、功能描述、接口描 述、注意事项等,以增强原理图的可读性。中英文名称应简洁明了。 (3)将前两步产生的内容封装在一个虚线框内,组成硬件构件的内部实体。 (4)为该硬件构件添加与其它构件交互的输入/输出接口标识。接口标识有两种:接口 注释和接口网标。它们的区别是:接口注释标于虚线框以内,是为构件接口所作的解释性文 字, 目的是帮助设计人员在使用该构件时理解该接口的含义和功能; 而接口网标位于虚线框 之外,且具有电气特性。为使原理图阅读者便于区分,接口注释采用斜体字。 在进行核心构件、中间构件和终端构件的设计时,除了要遵循上述的通用规则外,还要 兼顾各自的接口特性、地位和作用。

2.核心构件设计规则
设计核心构件时,需考虑的问题是: “核心构件能为其他构件提供哪些信号?” 。核心构 件其实就是某型号 MCU 的最小系统。核心构件设计的目标是:凡是使用该 MCU 进行硬件 系统设计时,核心构件可以直接“组装”到系统中,无须任何改动。为了实现这一目标,在 设计核心构件的实体时必须考虑细致、周全,包括稳定性、扩展性等,封装要完整。核心构 件的接口都是为其它构件提供服务的,因此接口标识均为接口网标。在进行接口设计时,需 将所有可能使用到的引脚都标注上接口网标 (不要考虑: 核心构件将会用到怎样的系统中去) 。 若同一引脚具有不同功能, 则接口网标依据第一功能选项命名。 遵循上述规则设计核心构件 的好处是: 当使用核心构件和其它构件一起组装系统时, 只要考虑其它构件将要连接到核心 构件的哪个接口(不是考虑:核心构件将要连接到其它构件的哪个接口) ,这也符合设计人 员的思维习惯。
7

3.中间构件设计规则
设计中间构件时, 需考虑的问题是:中间构件需要接受哪些信号, “ 以及提供哪些信号?” 。 中间构件是核心构件与终端构件之间通信的桥梁。 在进行中间构件的实体封装时, 实体的涉 及范围应从构件功能和编程接口两方面考虑。 一个中间构件应具有明确的且相对独立的功能, 它既要有接受其它构件提供的服务的接口, 即需求接口, 又要有为其他构件提供服务的接口, 即提供接口。描述需求接口采用接口注释,描述提供接口采用接口网标。当中间构件被作为 一个“零件”组装到具体系统中时,设计人员只要考虑为构件提供服务的来源,为接口注释 添加对应的应用网标即可,其它内容无须关心或改动。 中间构件的接口数目没有核心构件那样丰富。为直观起见,设计中间构件时,将构件的 需求接口放置在构件实体的左侧,提供接口放置在右侧。接口网标的命名规则是:构件名称 -引脚信号/功能名称。而接口注释名称前的构件名称可有可无,它的命名隐含了相应的引脚 功能。 电源控制构件(如图 1-2 所示) 、可变频率产生构件(如图 1-3 所示)是常用的中间构 件。图 1-2 中的 Power-IN 和图 1-3 中的 SDI、SCK 和 SEN 均为接口注释,Power-OUT 和 LTC6903-OUT 为接口网标。

4.终端构件设计规则
设计终端构件时,需考虑的问题是: “终端构件需要什么信号才能工作?” 。终端构件是 嵌入式系统中最常见的构件。 终端构件没有提供接口, 它仅有与上一级构件交互的需求接口, 因而接口标识均为斜体标注的接口注释。LCD(YM1602C)构件(如图 1-4 所示) 、LED 构 件、指示灯构件以及键盘构件(如图 1-5)等都是典型的终端构件。

图 1-2 电源控制构件

图 1-3 可变频率产生构件

8

图 1-4 LCD 构件

图 1-5 键盘构件

5.使用硬件构件组装系统的方法
对于核心构件,在应用到具体的系统中时,不必作任何改动。具有相同 MCU 的应用系 统,其核心构件完全相同。对于中间构件和终端构件,在应用到具体的系统中时,仅需为需 求接口添加接口网标,在不同的系统中,接口网标名称不同,但构件实体内部完全相同。 使用硬件构件化思想设计嵌入式硬件系统的过程与步骤是: (1)根据系统的功能划分出若干个硬件构件。 (2)将所有硬件构件原理图“组装”在一起。 (3)为中间构件和终端构件添加接口网标。

1.4.3 实验 PCB 板设计的简明规则
印刷电路板(Printed-Circuit Board,PCB)是由环氧树脂粘合而成的镀了铜的玻璃纤维 板。蚀刻掉部分镀铜,只留下以构成电路互连通路的铜层走线。PCB 可以是单层、双层或 者四层、六层、八层、十二层甚至更多。层数越多,连接的布线就越容易,但成本却越高, 调试也越难。如果 PCB 有专用供电层和接地层,系统将会有更强的燥声抗扰度。 在使用电子设计自动化软件(如 DXP)设计 PCB 时需注意以下几个方面的问题。

1.PCB 板布局
在正式走线之前要对 PCB 的大体格局进行规划。布局规划应遵循下列基本原则。 (1)在 PCB 布板之前首先要打印出相应的原理图,然后根据原理图确定整个 PCB 板 的大体布局,即各个硬件构件的位置安排。 (2)PCB 板的形状如无其他要求,一般为矩形,长宽比为 4:3 或 3:2。 (3)考虑面板上元件的放置要求。 (4)考虑边缘接口。

2.元件放置
(1) 元件放置要求整齐, 尽可能正放, 属于同一硬件构件内的元件尽可能排放在一起。 排列方位尽可能与原理图一致,布线方向最好与电路图走线方向一致。元器件在 PCB 上的
9

排列可采用不规则、规则和网格等三种排列方式中的一种,也可同时采用多种。 不规则排列: 元件轴线方向彼此不一致, 这对印制导线布设是方便的, 且平面利用率高, 分布参数小,特别对高频电路有利。 规则排列:元器件轴线方向排列一致,布局美观整齐,但走线较长且复杂,适于低频电 路。 网格排列:网格排列中的每一个安装孔均设计在正方形网格交点上。 布局的元器件应有利于发热元器件散热,高频时要考虑元器件之间的分布参数,高、低 压之间要隔离,隔离距离与承受的耐压有关。 (2)电容的位置要特别注意,其中电源模块的滤波电容要求靠近电源,而 IC 的滤波电 容要靠近 IC 的引脚。 (3)考虑元件间的距离,防止元件之间出现重叠。还要考虑元器件的引脚间距,元器 件不同,其引脚间距也不相同,在 PCB 设计中必须弄清楚元器件的引脚间距,因为它决定 着焊盘放置间距。 对于非标准器件的引脚间距的确定最直接的方法就是: 使用游标卡尺进行 测量。 (4)PCB 四周留有 5-10mm 空隙不布器件。 (5)先放置占用面积较大的元器件,先集成后分立,先主后次,多块集成电路时先放 置主电路。 (6)可调元件应放置在便于调节的地方,质量超过 15g 的元器件应当用支架,热敏元 件应远离发热元件。晶体应平放,而不要竖直放置。 (7)PLL 滤波电路应尽量靠近 MCU。

3.有关设定
在正式布线之前,需要对软件环境的以下参数进行设置: (1) 线宽。 导线的最小宽度由导线与绝缘基板间的粘附强度和流过它们的电流值决定。 走线时导线尽可能宽,最好不要小于 0.5mm,手工制板应不小于 0.8mm,这样既可以减小 阻抗,又可以防止由于制造工艺的原因导致导线断路。电源线和接地线因电流量较大,宽度 要大于普通信号线, 一般不要小于 1mm。 三者关系为: 地线宽度>电源线宽度>信号线宽度。 (2) 间距。 导线间的间距由它们之间的安全工作电压决定, 相邻导线之间的峰值电压、 基板的质量、 表面涂层、 电容耦合参数等都影响导线的安全工作电压, 为满足电气安全要求, 导线间距离以及导线与元件间距离要尽可能地大,一般不要小于 1mm,这样可以有效解决 焊接时短路的问题。 (3)过孔大小。过孔大小设定要适中。

4.布线
布线时,应该首先对时钟和高速信号进行布线,以确保它们的走线尽可能直接。石英晶 振和对噪声特别敏感的器件下面不要走线。 对总线进行布线时, 尽可能地保持信号线平行走 线,而时钟信号线则要避免平行,且在这些导线之间最好加接地线。布板完成后一定要进行 自动与人工检查。过孔数尽可能少。最小系统中未使用的 I/O 口,可通过电阻接地。走线尽 量少拐弯,线宽不要突变,导线拐角应≥90° ,力求线条简单明了。信号线的拐角应设计成 钝角走向,为圆形或圆弧形,切忌画成 90° 或更小角度形状。

5.测量点
考虑到硬件测试的方便,在 PCB 布板时要留下一些测量点,以便调试之用。测量点要
10

根据原理图确定。以下几处需要留测量点: (1)原理图中模块的输入输出引脚。 (2)最小系统模块中 MCU 的引脚。 (3)各硬件功能模块单元的输入、输出口; 画测量点的步骤是:引出、打孔、标字。孔的大小以万用表头方便测量为原则,一般不 要在线上直接打孔。

6.模块标示
由于在整体布局时,已经将各个硬件构件的组成元件放在一起,因而可在 PCB 板上用 矩形框将各个硬件构件区分开,并用汉字标出构件名(与原理图一致) ,并注意字体字号。

7.铺地
在布板的最后都要铺地,目的是减小干扰,提高 PCB 板的稳定性。铺地需注意: (1)在铺地前,要设定地与导线、地与引脚之间的距离,并要求该距离尽可能大。 (2)铺地本应该双面铺,作为实验用板,为了方便检查,可只铺反面地。 (3)如果电路板中有数字地和模拟地,应将它们隔离开,两者间使用磁珠相连。

8.空余位置的利用并标注相关信息
PCB 板的空余位置可适度作如下用途: (1)电源、地。空白处多留几排电源和地。 (2)双排孔。留出几排两孔相连的排孔,以用来扩展或试验时焊接其他元件。 (3)固定孔。在 PCB 上画固定板的固定孔,一般在板的四个角落。 在完成 PCB 板的铺地之后,要在板的正面适当位置标出以下信息:单位、日期、责任 人、PCB 板的名称、编号等。

9.抗干扰问题的特别考虑
PCB 设计中除了考虑以上问题外, 还要考虑一些隐藏的问题, 这些问题设计时不起眼, 但是解决的时候,却非常麻烦,这就是电路的干扰问题,为此,在 PCB 设计时还应解决如 下问题: 1)热干扰及抑制 元器件在工作中都有一定程度的发热, 尤其是功率较大的器件所发出的热量会对周边比 较敏感的器件产生干扰,若热干扰得不到很好的抑制,整个电路的电性就会发生变化,最后 造成短路.为了对热干扰进行抑制,可采取以下措施: (1)发热元件的放置 不要贴板放置, 也可以单独设计为一个功能单元, 放在靠近边缘容易散热的地方。 另外, 发热量大的器件与小热量的器件应分开放置。 (2)大功率器件的放置 应尽量靠近边缘布置,在垂直方向时应尽量布置在板上方。 (3)温度敏感器件的放置 对温度比较敏感的器件应安置在温度最低的区域, 千万不要将它放在发热器件的正上方。 (4)器件的排列与气流
11

非特定要求,一般设备内部均以空气自由对流进行散热,故元器件应以纵式排列;若强 制散热,元器件可横式排列。另外,为了改善散热效果,可添加与电路原理无关的零部件以 引导热量对流。 2)共阻抗及抑制 共阻干扰是由 PCB 上大量的地线造成,当两个或两个以上的回路共用一段地线时,不 同的回路电流在共用地线上产生一定压降, 此压降经放大就会影响电路性能, 当电流频率很 高时,会产生很大的感抗而使电路受到干扰。为了抑制共阻抗,可采取以下措施: (1)一点接地 使同级单元电路的几个接地点尽量集中,适用于信号的工作频率小于 1MHZ 的低频电 路,如果工作频率在 1 一 1OMHz 而采用一点接地时,其地线长度应不超过波长的 1/20。 (2)就近多点接地 PCB 上有大量公共地线分布在板的边缘,且呈现半封闭回路(防磁场干扰),各级电路采 取就近接地,以防地线太长。适用于信号的工作频率大于 lOMHz 的高频电路。 (3)大面积接地 在高频电路中将 PCB 上所有不用面积均布设为地线,以减少地线中的感抗,从而削弱 在地线上产生的高频信号,并对电场干扰起到屏蔽作用。 (4)加粗接地线 若接地线很细,接地电位则随电流的变化而变化,致使电子设备的定时信号电平不稳, 抗噪声性能变坏,其宽度至少应大于 3mm。 (5)D/A(数/模)电路的地线分开 两种电路的地线各自独立,然后分别与电源端地线相连,以抑制它们相互干扰。 3)电磁干扰及抑制 电磁干扰是由电磁效应而造成的干扰,由于 PCB 上的元器件及布线越来越密集,如果 设计不当就会产生电磁干扰。针对由电源布线、信号布线产生的电磁干扰,可采取不同的措 施。 (1)电源布线引起的电磁干扰 电源布线可采用以下预防措施: 布线要宽。 加去耦电容。 这种电容起到旁路滤波的作用。 要在电源的输入端并联较大的和较小的滤 波电容。 地线环绕。地线要靠近供电电源母线和信号线,因电流沿路径传输会产生回路电感,地 线靠近,回路面积减小,电感量减小,回路阻抗减小,从而减小电磁干扰耦合。 (2)信号布线引起的电磁干扰 信号布线可采用以下预防措施: 不同功能的单元电路(如数字电路与模拟电路,高频与低频)分开设置,布线图形应易于 信号流通且使信号流向尽可能保持一致。 合理使用屏蔽和滤波技术,注意高低压之间的隔离。 尽量不选用比实际需要的速度更快的元件, 在元件的位置安排上, 易受电磁干扰的元器 件不能相距太近,应大于信号波长的四分之一,输入器件与输出器件尽量远离。 做到安全接地。

12

1.5 基于硬件构件的嵌入式底层软件构件的编程方法
嵌入式系统是软件与硬件的综合体, 硬件设计和软件设计相辅相成。 嵌入式系统中的驱 动程序是直接工作在各种硬件设备上的软件, 是硬件和高层软件之间的桥梁。 正是通过驱动 程序,各种硬件设备才能正常运行,达到既定的工作效果。

1.5.1 嵌入式硬件构件和软件构件的层次模型
嵌入式软件构件(Embedded Software Component, ESC)是实现一定嵌入式系统功能的 一组封装的、 规范的、 可重用的、 具有嵌入特性的软件单元, 是组织嵌入式系统的功能单位。 嵌入式软件构件分为高层软件构件和底层软件构件(以下简称高层构件和底层构件) 。 高层构件与硬件无关。而底层构件与硬件密不可分,是硬件驱动程序的封装。前面提到,在 硬件构件中,核心构件为 MCU 的最小系统。通常,MCU 内部包含有 GPIO(即通用 IO) 口和一些内置功能模块,可将通用 I/O 口的驱动程序封装为 GPIO 构件,各内置功能模块的 驱动程序封装为功能构件,如芯片内含模块的功能构件有串行通信构件、Flash 构件、定时 器构件等。 在硬件构件层中,相对于核心构件而言,中间构件和终端构件是核心构件的“外设” 。 由这些“外设”的驱动程序封装而成的软件构件称为底层外设构件。注意,并不是所有的中 间构件和终端构件都可以作为编程对象。例如:键盘、LED、LCD 等硬件构件与编程有关, 而电平转换硬件构件就与编程无关, 因而不存在相应的底层驱动程序, 当然也就没有相应的 软件构件。嵌入式硬件构件与软件构件的层次模型如图 4-5 所示。

高层构件

高层构件层

底层外设构件 底层内部构件 GPIO 构件 功能构件 底层构件层

MCU 头文件

中间构件 终端构件

核心 构件

硬件构件层

图 1-6 嵌入式硬件构件与软件构件的层次模型 由图 1-6 可看出,底层外设构件可以调用底层内部构件,如 LCD 构件可以调用 GPIO 构件、PCF8563 构件(时钟构件)可以调用 I2C 构件等。而高层构件可以调用底层外设构件 和底层内部构件中的功能构件,而不能直接调用 GPIO 构件。另外,考虑到几乎所有的底层 内部构件都涉及到 MCU 各种寄存器的使用,因此将 MCU 的所有寄存器定义组织在一起, 形成 MCU 头文件,以便其它构件头文件中包含该头文件。
13

1.5.2 底层构件的实现方法与编程思想
底层构件是与硬件直接打交道的软件,由头文件和源程序文件两部分组成。 头文件中的内容主要有:包含下层构件头文件的#include 语句、用以描述构件属性的宏 定义语句以及对外接口函数原型说明。 在头文件中使用函数原型, 对于建立代码模块和外部 接口的规范,便于他人使用,都是很有帮助的。使用这些函数的用户,不需要查找源代码去 了解参数的具体类型,直接查看函数原型即可。 源程序文件中存放构件的内部函数和外部函数的定义, 即函数的实现代码, 以完成函数 所要实现的功能。 在对底层构件进行设计时, 最关键的工作是要对构件的共性和个性进行分析, 抽取出构 件的属性和对外接口函数。尽量做到:当一个底层构件应用到不同系统中时,仅需修改构件 的头文件,对于构件的源程序文件则不必修改或改动很小。 例如,串行通信模块 SCI 是大多数 MCU 都具有的内部模块。仔细分析各种 MCU 串行 通信程序发现:在查询方式下,各种 MCU 都是根据状态寄存器中的两个标志位来判断是否 接收到数据和数据是否发送完毕,这就是 SCI 模块的共性。对于不同的 MCU,该状态寄存 器的名称可能不同, 这两个标志位的位号也有可能不同。 此外, 用以设置波特率、 通信格式、 是否校验、是否允许中断等参数的寄存器也不同,这就是 SCI 模块的个性。分析出了共性 和个性之后,就可以抽取出 SCI 构件的属性和操作,编制构件头文件和程序文件了。有关 内容参见第五章。 在编写构件时,一般应注意以下几方面的内容: (1)构件的头文件和源程序文件的主文件名一致,且为构件名。 (2)属性和操作的命名统一以构件名开头。这样做的好处是:当使用底层构件组装软 件系统时,避免构件之间出现同名现象。同时,名称要使人有“顾名思义”的效果。 (3)对 MCU 内的模块寄存器名和端口名进行重定义,在其它的代码里面都将使用宏 名对模块寄存器和端口进行操作。这样,当底层驱动程序移植到其它 MCU 时,只要修改重定 义语句就可以了。 (4)内部函数与外部函数要设计合理,函数参数个数及类型要考虑全面。内部函数仅 提供给同一构件中的其它内部函数或外部函数调用, 作用域仅限于定义该函数的文件。 外部 函数是对外接口函数, 供上层应用程序调用。 在定义外部函数时, 应该对函数名、 函数功能、 入口参数、函数返回值、使用说明、函数适用范围等进行详细描述,以增强程序的可读性。 上层应用程序不能直接对构件的属性进行读取或设置, 必须借助于该构件提供的接口操作函 数来实现。 (5)应用程序在使用底层构件时,严格禁止通过全局变量来传递参数,所有的数据传 递都要通过函数的形式参数来接收。 这样做不但使得接口简洁, 更加避免了全局变量可能引 发的安全隐患。

1.5.3 硬件构件及底层软件构件的重用与移植方法
重用是指在一个系统中, 同一构件可被重复使用多次。 移植是指将一个系统中使用到的 构件应用到另外一个系统中。

1.硬件构件的重用与移植
对于以单 MCU 为核心的嵌入式应用系统而言,当用硬件构件“组装”硬件系统时,核 心构件(即最小系统)有且只有一个,而中间构件和终端构件可有多个,并且相同类型的构
14

件可出现多次。下面以终端构件 LCD 为例,介绍硬件构件的移植方法。

(a) LCD 构件在系统 A 中的应用

(b) LCD 构件在系统 B 中的应用

图 1-7 LCD 构件在实际系统中的应用 在应用系统 A 中,若 LCD 的数据线(LCD-D0~LCD-D7)与芯片 AW60(8 位 MCU) 芯片的通用 IO 口的 B 口相连,C 口作为 LCD 的控制信号传送口,其中,LCD 寄存器选择 信号 LCD-RS 与 C 口第 0 引脚连接,读写信号 LCD-RW 与 C 口第 1 引脚连接,使能信号 LCD_E 与 C 口第 2 引脚连接, LCD 硬件构件实例如图 1-7(a)所示。 则 虚线框左边的文字 (如 PTC0、 PTC1 等) 为接口网标, 虚线框右边的文字 (如 LCD-RS、 LCD-RW 等) 为接口注释。 在应用系统 B 中, LCD 的数据线 若 (LCD-D0~LCD-D7) MCF52233 与 (32 位 MCU) 芯片的通用 IO 口的 AN 口相连, 口的第 0、 2 引脚分别作为寄存器选择信号 LCD-RS、 TA 1、 读写信号 LCD-RW、使能信号 LCD_E,则 LCD 硬件构件实例如图 1-7(b)所示。

2.底层构件的移植
当一个已设计好的底层构件移植到另外一个嵌入式系统中时, 其头文件和程序文件是否 需要改动呢?这要视具体情况而定。例如:系统的核心构件发生改变(即 MCU 型号改变) 时,底层内部构件头文件和某些对外接口函数也要随之改变,例如模块初始化函数。 而对于外接硬件构件,希望不改动程序文件,而只改动头文件,那么,头文件就必须充 分设计。以 LCD 构件为例,与图 1-7(a)相对应的底层构件头文件 LCD.h 可如下编写。
#include ―GPIO.h‖ #define #define #define #define #define LCD_Data LCD_Ctrl LCD_RS LCD_RW LCD_E //包含 GPIO 构件头文件 GPIO_PORTB GPIO_PORTC 0 1 2 //显示数据传送口 //控制信号传送口 //寄存器选择信号 //读写信号 //使能信号 //液晶显示初始化 //填充 LCD,可实现清屏

void LCD_Init(void); void LCD_Fill(INT8U a);

void LCD_PutDot(INT8U x,INT8U y); //画点 void LCD_PutLine(INT8U x1,INT8U y1,INT8U x2,INT8U y2); void LCD_PutChar(INT8U a); void LCD_PutString(INT8U str[]); //显示一个字符 //显示一串字符 //画线

当 LCD 硬件构件发生如图 1-7(b)所示的移植时,显示数据传送口和控制信号传送口发 生了改变,此时,只要将上面的第 1 和第 2 条宏定义语句修改成:
#define LCD_Data GPIO_PORTAN //显示数据传送口 15

#define

LCD_Ctrl

GPIO_PORTTA

//控制信号传送口

必须申明的是,本书提出构件化设计方法的目的是,在进行软硬件移植时,设计人员所 做的改动要尽量小,而不是不作任何改动。希望改动在头文件中进行,而不希望改动程序文 件,事实上,不作任何改动是不现实的。

16

第2章 Kinetis概述与MK60N512VMD100硬件最小系 统
本章简要概述 Kinetis 系列微处理器,给出 K60 系列微控制器存储器映像与编程结构、 寻址方式、 异常向量表; 重点指出学习一个新 MCU 芯片比较快速的学习过程; 给出 K60N512 的引脚功能与硬件最小系统电路。本章的重点是:存储空间的地址分配、中断结构、硬件最 小系统电路。

2.1 ARM公司的发展史及ARM架构的发展
1.ARM 公司的历史
ARM 公司是世界领先的半导体知识产权供应商, 其提供的产品是数字电子产品的核心。 今天 ARM 为世界上四分之一的电子产品提供技术基础,被半导体及电子业界评为过去 30 年全球最有影响力的 10 家公司之一。 ARM 公司于 1990 年 11 月成立于英国, 原名 Advanced RISC Machine 有限公司, 是苹果电脑、 Acorn 电脑集团和 VLSI Technology 的合资企业。 Acorn 曾推出世界首个商用单芯片 RISC 处理器,而苹果电脑当时希望将 RISC 技术应用于自身系 统,ARM 的微处理器新标准因此应运而生。ARM 成功地研制了首个低成本 RISC 架构,迅 速在市场上崭露头角,与此同时 RISC 结构的竞争对手都着眼于提高性能发展高端工作站处 理器的 RISC 结构。 1991 年 ARM 推出首个嵌入式 RISC 核心——ARM6TM 系列处理器,不久 VLSI 率先获 得授权,一年后夏普和 GEC Plessey 也成为授权用户,1993 年德州仪器和 Cirrus Logic 亦签 署了授权协议。 从此 ARM 的知识产权产品和授权用户急剧扩大,1993 年 Nippon Investment and Finance(NIF)成为 ARM 股东后,ARM 开始向全球拓展,分别在亚洲、美国和欧洲设 立了办事处。1998 年 4 月 ARM 在伦敦证券交易所纳斯达克交易所上市。 ARM Holdings 在半导体革新过程中初露峥嵘, Dataquest 誉为世界第一的知识产权供 被 应商。20 世纪 90 年代初 ARM 率先推出 32 位 RISC 微处理器芯片系统(SoC)知识产权公 开授权概念。 现在, ARM 芯片的出货量每年都比上一年多 20 亿片以上。 不像很多其他的半导体公司, ARM 从不制造和销售具体的处理器芯片, 而是把处理器的设计授权给相关的商务合作伙伴, 让他们根据自己的强项设计具体的芯片。更重要的是 ARM 开创了电子新纪元:采用 ARM 技术的微处理器遍及各类电子产品,在汽车、消费、娱乐、成像、工业控制、网络、存储、 安保和无线等市场中,ARM 技术无处不在。

2.ARM 架构发展史
ARM 的设计历史起源是 Acorn 电脑公司(Acorn Computers Ltd)于 1983 年开始的开发 计划。这个团队由 Roger Wilson 和 Steve Furber 带领,着手开发一种新架构,类似进阶的 MOS Technology 6502 处理器。设计团队在 1985 年时开发出 ARM1 Sample 版,而首颗“真
17

正”的产能型 ARM2 于次年量产。ARM2 具有 32 位的数据总线、26 位的寻址空间,并提 供 64MB 的寻址范围与 16 个 32 位的寄存器。这些寄存器其中有一个作为程序计数器,其 前面 6 位和后面 2 位用来保存处理器状态标记。ARM2 可能是全世界最简单实用的 32 位微 处理器,其仅容纳了 30,000 个晶体管。之所以精简的原因在于它不含微码,而与现今大多 数的 CPU 不同,它没有包含任何高速缓存。这个精简的特色使它只需消耗很少的电能,却 能发挥比 Intel 80286 更好的效能。后继的处理器 ARM3 更备有 4KB 的告诉缓存,使它能发 挥更佳的效能。 1991 年, ARM 技术首次发布, 然后苹果电脑使用 ARM6 架构的 ARM610 当作其 Apple Newton PDA 的基础。1994 年,Acorn 使用 ARM610 作为其 RISC PC 电脑内的 CPU。 随着 ARM2 到 ARM6 的技术进阶发展,内核部分却大多维持一样的大小。ARM2 有 30,000 个晶体管,但 ARM6 只增长到 35,000。主要概念是以 ODM 的方式,使 ARM 核心能 搭配一些选配的零件而制成一颗完整的 CPU,而且可在现有的晶圆制造厂里制作并以低成 本的方式达到很大的效能。 随着技术的不断发展,ARM 公司不断推陈出新,发展至今最新的是 ARMv7 架构,要 说明的是,架构版本号和名字中的数字并不是一码事。比如,ARM7TDMI 是基于 ARMv4T 架构的(T 表示支持 Thumb 指令) 。ARMv7 架构采用 Thumb-2 技术,是在 ARM 的 Thumb 代码压缩技术的基础上发展起来的,并且保持了对现存 ARM 解决方案的完整代码兼容性。 Thumb-2 技术比纯 32 位代码少使用 31%的内存,减小了系统开销。同时能够提供比已有的 基于 Thumb 技术的解决方案高出 38%的性能。ARMv7 架构还采用了 NEON 技术,将 DSP 和媒体处理能力提高了近 4 倍,并支持改良的浮点运算,满足下一代 3D 图形、游戏物理应 用以及传统嵌入式控制应用的需求。此外,在这个版本中,内核架构首次从单一款式变成三 种款式。 ? 款式 A:设计用于高性能的“开方应用平台”——越来越接近电脑。 ? 款式 R:用于高端的嵌入式系统,尤其是那些带有实时要求的——既要快又要实时。 ? 款式 M:用于深度嵌入的、单片机风格的系统中——本书的主角。 让我们再近距离的考察这三种模式: ? 款式 A(ARMv7-A) :需要运行复杂应用程序的“应用处理器” 。支持大型嵌入式操作 系统,比如 Symbian(诺基亚智能手机用) 、Linux,以及微软的 Windows CE 和智能手 机操作系统 Windows Mobile。 ? 款式 R(ARMv7-R) :硬实时且高性能的处理器。目标是高端实时市场。像高档轿车的 组件、大型发电机控制器、机器手臂控制器等,它们使用的处理器不但要很好很强大, 还要极其可靠,对事件的反应也要极其敏捷。 ? 款式 M(ARMv7-M) :认准了旧时代单片机应用而量身定制。在这些应用中,尤其是 对于实时控制系统,低成本、低功耗、极速中断反应以及高处理效率都是至关重要的。 Cortex 系列是 v7 架构的第一次亮相。其中 Cortex-M4 就是按款式 M 设计的。 ARM 架构发展版本如表 2-1 所示。 表 2-0-1 ARM 架构发展版本
ARM 版本 系列 ARM1 ARM v1 ARM v2 ARM1 架构 内核名 特色 高速缓存 (I/D) /MMU 无 无 4MIPS@8 MHZ 18 Acorn Architmedes,Chessmachine 常规 MIPS 与 MHz 代表芯片与应用

ARM2

ARM2

Architecture2

ARM 版本 系列 加入了 MUL (乘法) 指令 集成 MEMC(MM U),图像与 ARM v2a I/O 处理器。 ARM250 Architecture2 a 加入了 SWP 和 SWPB(置 换)指令 首次在 ARM ARM3 ARM v2a 架构上使用 ARM2a 处理器高速 缓存 V3 架构首创 ARM6 ARM v3 ARM610 支援寻址 32 位的内存 (针 对 26 位) ARM7 ARM v3 ARM7TD MI(-S) 三级流水线 架构 内核名 特色

高速缓存 (I/D) /MMU

常规 MIPS 与 MHz

代表芯片与应用

无,MEMC1a

7MIPS@1 2MHz

Acorn Architmedes

均为 4KB

12MIPS@ 25MHz

Acorn Architmedes

均为 4KB

28MIPS@ 33MHz

Acorn Risc PC 600, Apple Newton

无 均为

15MIPS@ 16.8MHZz 36MIPS@ 40MHz 60MIPS@ 59.8MHz

Game Boy Advance, Nintendo DS,iPod Acorn Risc PC 700,Psion5 series, Apple eMate 300 Zipit

ARM ARM7 TDMI v4T

ARM710T

8KB,MMU 均为

ARM720T ARM740T ARM v5TEJ ARM7EJ-S Jazelle DBX

8KB,MMU MPU 无

Strong ARM ARM8

ARM v4 ARM v4 ARM9TD MI 五级流水线 无 Armadillo,GP32,GP2X(第一 ARM920T 16KB/16KB, MMU 200MIPS @180MHz 颗内核), TapwareZodiac(Motorola/Free scale i.MX1) ARM922T 8KB/8KB,M 19

ARM9 TDMI

ARM v4T

ARM 版本 系列 架构 内核名 特色

高速缓存 (I/D) /MMU MU

常规 MIPS 与 MHz

代表芯片与应用

ARM940T

4KB/4KB,M MU 可变动,

GP2X(第二颗内核)

ARM946ES ARM v5TE ARM9 E ARM966ES ARM968ES ARM v5TEJ ARM v5TE ARM926EJ -S ARM996H S ARM1020 ARM ARM1 0E ARM v5TEJ v5TE E ARM1022 E ARM1026 EJ-S 80200/IOP 310/IOP31 5 80219 I/O 处理器

tightly coupled memories,MP U 无高速缓存, TCMS 无高速缓存, TCMS 可变动, Jazelle DBX 无振荡器处 理器 (VFP),六级 流水线 (VFP) TCMS,MMU 无高速缓存, TCMS,MMU 32KB/32KB, MMU 16KB/16KB, MMU 可变动, Jazelle DBX MMU,可包 含 MPU 200MIPS @200MHz

Nintendo DS,Nokia N-Gage Conexant 802.11 chips

ST Micro STR91xF

移动电话:Sony Ericsson(K、 W 系列), Siemens 和 Benq(x65 系列)

400/600M Hz 600

Thecus N2100

IOP321 ARM v5TE

BogoMips @600MHz

Iyonix

Xscale

IOP33x 1~2 核, IOP34x RAID 加速 器 PXA210/ PXA250 应用处理器, 七级流水线 32KB/32KB, MMU 20 400 BogoMips @400MHz Gumstix,Palm TungstenE2 Zaurus SL-5600 32K/32KL1,5 12KL2,MMU

PXA255

ARM 版本 系列 PXA26x 架构 内核名 特色

高速缓存 (I/D) /MMU

常规 MIPS 与 MHz 可达 400MHz 800MIPS @624MHz

代表芯片与应用

Palm Tungsten T3 HTC Universal,Zaurus SL-C1000,3000,3100,3200,Del l Axim x30,x50 和 x51 系列

PXA27x

PXA800(E) F Mavell 1000MIPS @1.25GHz PXA300/PXA310/PXA320,Ma x frequency:PXA300@624MHz, PXA310/PXA320@806MHz PXA900 SIMD,Jazelle DBX,(VFP), 八级流水线 SIMD,Thum b-2,(VFP),九 级流水线 可变动, ARM v6KZ ARM1176J Z(F)-S SIMD,Jazelle ,(VFP) 1~4 核对称 ARM v6K ARM11 MPCore 多处理器, SIMD,Jazelle ,(VFP) Application profile,VFP, NEON,Jazell Cortex-A8 ARM v7-A Cortex e RCT,Thumb2,13-stage pipeline Cortex-A9 Cortex-A9 MPCore 可变动高速 ARM v7-R ARM Cortex-R4( F) Cortex-M3 Embedded profile,(FPU) Microcontrol 缓存,MMU 可选配 无高速缓存, 21 600 DMIPS 120 Luminary Micro 微控制器家 可变动 (L1+L2),MM U+TrustZone 2.0DMIPS/ MHz 从 600MHz 到超过 1GHz 的速 度 Freescale i.MX51,Texas Instruments OMAP3 可变动, MMU MMU+TrustZ one Freescale i.MX37 可变动, MPU 可变动, MMU 532-665M Hz(i.MX31 SoC) Blackberry 8700 Blackberry Pearl(8100) Nokia N93,Microsoft Zune(Freescale i.MX31),Nokia N800

Monahans

ARM v6

ARM1136J (F)-S

ARM v6T2 ARM1 1

ARM1156 T2(F)-S

ARM 版本 系列 v7-M ler profile 架构 内核名 特色

高速缓存 (I/D) /MMU (MPU)

常规 MIPS 与 MHz DMIPS @ 100MHz

代表芯片与应用 族

ARM v6-M

Cortex-M0 Cortex-M1 Optional

ARM v7-M E Cortex-M4

8region MPU with sub regions and background region 1.25DMIP S/MHz

3.ARM 处理器命名方法
以前, ARM 使用一种基于数字的命名法。 在早期(1990s), 还在数字后面添加字母后缀, 用来进一步明细该处理器支持的特性。就拿 ARM7TDMI 来说,T 代表 Thumb 指令集,D 是说支持 JTAG 调试(Debugging), 意指快速乘法器, 则对应一个嵌入式 ICE 模块。 M I 后来, 这 4 项基本功能成了任何新产品的标配, 于是就不再使用这 4 个后缀——相当于默许了。 但 是新的后缀不断加入,包括定义存储器接口的,定义高速缓存的,以及定义“紧耦合存储器 (TCM)”的,于是形成了新一套命名法,这套命名法也是一直在使用的。 到了架构 7 时代,ARM 改革了一度使用的,冗长的、需要“解码”的数字命名法,转 到另一种看起来比较整齐的命名法。比如,ARMv7 的三个款式都以 Cortex 作为主名。这不 仅更加澄清并且“精装”了所使用的 ARM 架构,也避免了新手对架构号和系列号的混淆。 例如,ARM7TDMI 并不是一款 ARMv7 的产品,而是辉煌起点——v4T 架构的产品。

4.ARM 专有技术
(1)Thumb ARM 处理器的一种 16 位指令模式,称为 Thumb。Thumb 指令集可以看作是 ARM 指 令压缩形式的子集,它是为减小代码量而提出,具有 16bit 的代码密度。Thumb 指令体系并 不完整,只支持通用功能,必要时仍需要使用 ARM 指令,如进入异常时。其指令的格式与 使用方式与 ARM 指令集类似,而且使用并不频繁 (2)Jazelle Jazelle 是 ARM 体系结构的一种相关技术,用于在处理器指令层次对 JAVA 加速。 ARM 还开发出一项技术,Jazelle DBX (Direct Bytecode eXecution),允许它们在某些架构的 硬件上加速执行 Java bytecode,就如其他执行模式般,当呼叫一些无法支援 bytecodes 的特 殊软件时,能提供某些 bytecodes 的加速执行。它能在现存的 ARM 与 Thumb 模式之间互相 执行。 首颗具备 Jazelle 技术的处理器是 ARM926EJ-S:Jazelle 以一个英文字母'J'标示于 CPU
22

名称中。 它用来让手机制造商能够加速执行 Java ME 的游戏和应用程式, 也因此促使了这项 技术不断地发展。 (3)Thumb-2 Thumb-2 技术首先见于 ARM1156 核心,并于 2003 年发表。Thumb-2 扩充了受限的 16 位 Thumb 指令集,以额外的 32 位指令让指令集的使用更广泛。因此 Thumb-2 的预期目标 是要达到近乎 Thumb 的编码密度,但能表现出近乎 ARM 指令集在 32 位内存下的效能. Thumb-2 至今也从 ARM 和 Thumb 指令集中派生出多种指令,包含位段操作、分支跳 转和条件执行等功能。 (4)ThumbEE ThumbEE,也就是所谓的 Thumb-2EE, ,业界称为 Jazelle RCT 技术,于 2005 年发表, 首见于 Cortex-A8 处理器。ThumbEE 提供从 Thumb-2 而来的一些扩充性,在所处的执行 环境(Execution Environment)下,使得指令集能特别适用于执行阶段(Runtime)的编码产 生(例如即时编译) 。Thumb-2EE 是专为一些语言如 Limbo、Java、C#、Perl 和 Python, 并能让 即时编译器 能够输出更小的编译码却不会影响到效能。 ThumbEE 所提供的新功能,包括在每次存取指令时自动检查是否有无效指标,以及一 种可以执行阵列范围检查的指令,并能够分支到分类器(handlers) ,其包含一小部份经常呼 叫的编码,通常用于高阶语言功能的实作,例如对一个新物件做内存配置。 (5)高级 SIMD(NEON) 高级 SIMD 延伸集,业界称为 NEON 技术,它是一个结合 64 和 128 bit 的 SIMD (Single Instruction Multiple Data 单指令多重数据)指令集,其针对多媒体和讯号处理程式 具备标准化加速的能力。NEON 可以在 10 MHz 的 CPU 上执行 MP3 音效解码,且可以 执行 13 MHz 频率以下的 GSM AMR (Adaptive Multi-Rate) 语音编码。NEON 具有一组广 泛的指令集、各自的寄存器阵列,以及独立执行的硬件。NEON 支援 8-, 16-, 32- 和 64-bit 的整数及单精度浮点数据,并以 SIMD 的方式运算,执行图形和游戏处理中关于语音/视 讯的部分。SIMD 在 向量超级处理机 中是个决定性的要素,它具备同时多项处理功能。在 NEON 技术中,SIMD 最高可支援到同时 16 个运算。 (6)VFP VFP 是在协同处理器针对 ARM 架构的衍生技术。它提供低成本的单精度和倍精度浮 点运算能力,并完全相容于 ANSI/IEEE Std 754-1985 二进制浮点算数标准。VFP 提供大多 数适用于浮点运算的应用, 例如 PDA、 智慧手机、 语音压缩与解压、 图像以及数位音效、 3D 打印机、机上盒,和汽车应用等。VFP 架构也支援 SIMD(单指令多重数据)平行化的短 向量指令执行。这在图像和讯号处理等应用上,非常有助于降低编码大小并增加输出效率。 在 ARM-based 处理器中,其他可见的浮点、或 SIMD 的协同处理器还包括了 FPA, FPE, iwMMXt。他们提供类似 VFP 的功能但在 opcode 层面上来说并不具有相容性。 (7)安全性扩充(TrustZone) TrustZone(TM) 技术出现在 ARMv6KZ 以及较晚期的应用核心架构中。它提供了一种 低成本的方案,针对系统单芯片(SoC)内加入专属的安全核心,由硬件建构的存取控制方 式支援两颗虚拟的处理器。 这个方式可使得应用程式核心能够在两个状态之间切换 (通常改 称为领域(worlds)以避免和其他功能领域的名称混淆) ,在此架构下可以避免资讯从较可 信的核心领域泄漏至较不安全的领域。 这种内核领域之间的切换通常是与处理器其他功能完 全无关联性(orthogonal) ,因此各个领域可以各自独立运作但却仍能使用同一颗内核。内存 和周边装置也可因此得知目前内核运作的领域为何, 并能针对这个方式来提供对装置的机密 和编码进行存取控制。典型的 TrustZone 技术应用是要能在一个缺乏安全性的环境下完整 地执行操作系统,并在可信的环境下能有更少的安全性的编码。
23

Cortex-M4 处理器是由 ARM 专门开发的最新嵌入式处理器, 它完美融合了高效的信号 处理能力以及 Cortex-M 系列处理器诸多无可比拟的优势, 包括低功耗、 低成本和易于使用, 旨在满足那些新兴的、灵活多变的解决方案的需求。 飞思卡尔 Kinetis 系列使用 ARM Cortex-M4 处理器,下一节将阐述 Kinetis 系列。

2.2 Kinetis系列微处理器概述
Kinetis系列微控制器是飞思卡尔公司于2010年下半年推出的基于ARM Cortex-M4内核 的微控制器,是业内首款Cortex-M4内核芯片。Kinetis系列微控制器采用了飞思卡尔 90纳米 薄膜存储器 (TFS) 闪存技术和 Flex存储器功能(可配置的内嵌EEPROM),支持超过1000万 次的擦写。Kinetis 微控制器系列融合了最新的低功耗革新技术,具有高性能、高精度的混 合信号能力,宽广的互连性,人机接口和安全外设。 第一阶段产品由五个微控制器系列组成, 见图2-1所示, 包含超过两百种器件, 在引脚、 外设和软件上可兼容。每个系列提供了不同的性能,存储器和外设特性。通过通用外设、存 储器映射和封装的一致性来实现系列内和各系列间的便捷移植。

图2-1 Kenetis 微控制器产品组合 由图2-1可见,所有的 Kinetis 系列都包含丰富的模拟、通信和定时控制外设,提供多 种闪存容量和输入输出引脚数量。所有Kinetis 系列都具有以下特性: ? 内核: ? ARM Cortex-M4 内核带DSP指令,性能可达1.25 DMIPS/MHz ( 部分Kinetis 系 列提供浮点单元) ? 多达32通道的DMA可用于外设和存储器数据传输并减少CPU干预 ? 提供不同级别的CPU频率,有50 MHz、72 MHz 和100 MHz(部分Kinetis系列提 供120 MHz 和150 MHz ) ? 极低的功耗: ? 10 种低功耗操作模式用于优化外设活动和唤醒时间以延长电池的寿命 ? 低漏唤醒单元、低功耗定时器和低功耗RTC可以更加灵活地实现低功耗 ? 行业领先的快速唤醒时间
24

? 存储器: ? 内存空间可扩展,从32 KB闪存/ 8 KB RAM 到 1 MB 闪存 / 128 KB RAM。多 个独立的闪存模块使同时进行代码执行和固件升级成为可能 ? 可选的16 KB 缓存用于优化总线带宽和闪存执行性能 ? Flex 存储器具有高达512 KB的FlexNVM 和高达16 KB的FlexRAM。FlexNVM 能够被分区以支持额外的程序闪存(例如引导加载程序)、数据闪存 ( 例如存储 大表) 或者EEPROM 备份。FlexRAM 支持EEPROM 字节写/ 字节擦除操作,并 且指示最大 EEPROM 空间 ? EEPROM 最高超过一千万次的使用寿命 ? EEPROM 擦除/ 写速度远高于传统的EEPROM ? 模拟混合信号: ? 快速、高精度的16位ADC、12位DAC、可编程增益放大器、高速比较器和内部 电压参考。提供强大的信号调节、转换和分析性能的同时降低了系统成本 ? 人机接口 (HMI): ? 低功耗感应触摸传感接口在所有低功耗模式均可工作 ? 连接性和通信: ? UART支持ISO7816 和 IrDA, I2S、CAN、I2C 和 SPI ? 可靠性和安全性: ? 硬件循环冗余校验引擎用于验证存储器内容、通信数据和增加的系统可靠性 ? 独立时钟工作的COP 用于防止代码跑飞 ? 外部看门狗监控 ? 定时和控制: ? 强大的FlexTimers 支持通用、PWM 和电机控制功能 ? 载波调制器发射器用于产生红外波形 ? 可编程中断定时器用于RTOS 任务调度或者为ADC 转换和可编程延迟模块提 供触发源 ? 外部接口: ? 多功能外部总线接口提供和外部存储器、门阵列逻辑或LCD 的接口 ? 系统: ? 5 V 容限的GPIO 带引脚中断功能 ? 从 1.71 V 到 3.6 V 的宽操作电压范围,闪存编程电压低至 1.71 V ,并且此时 闪存和模拟外设所有功能正常 ? 运行温度 -40 ° 到105 ° C C 除了以上共性,图 2-2列出了各Kinetis 系列所特有的性能。

25

图 2-2 Kinetis 系列微控制器特性

2.3 Kinetis系列微控制器存储器映像与编程结构
2010年11月,Freescale开始提供K60的样片,2011年上半年K60批量上市。 MK60N512VMD100是K60系列 MCU,是Kinetis系列的代表芯片。本书以该芯片为主要蓝 本阐述嵌入式开发所必备的硬件设计、软件设计及相关技术。一般来说,学习一个新的MCU 芯片,若用C语言进行编程,比较快速的学习过程是: (1)了解性能及内部主要功能模块与存储空间的地址分配。 (2)了解基本的编程结构、编程模式及寻址方式。 (3)了解中断结构。 (4)了解芯片的引脚的总体布局情况,掌握硬件最小系统电路。 (5)理解第一个工程的结构,理解工程中各个文件的基本功能。一般来说,第一个工 程为一个简单的小程序,如利用通用 I/O 模块编程控制几个发光二极管,主要目的是给出程 序框架和工作过程。 (6)进行实际环境的编译(compile) 、链接(link)生成可以下载到芯片内部 Flash 存 储器中的程序(可以运行的机器码) ,基本理解列表文件、机器码文件。 (7)一定要有硬件评估环境,这是学习新 MCU 的必需品。这样就可将程序利用写入 调试器下载到目标 MCU 中,在目标板上,观察运行情况。随后,可进一步利用嵌入式软件 的打桩调试技术, 即在被测程序代码中插入一些函数或语句, 利用这些函数或语句产生可在 硬件板上显示物理现象,供观察程序运行情况之用。 (8)从整个工程组成、各个文件、写入 Flash 存储器的机器码等角度,透彻理解第一 工程的执行过程。 (9)理解第一个带有中断过程的 C 语言工程结构,理解主循环与中断两条程序执行路 线各自的作用。 至此,以上学习过程已经覆盖学习一个新 MCU 硬件设计与软件编程的基本要素。完成 了以上学习步骤,就完成了“基本入门”过程。随后,可以在此框架下,结合嵌入式构件方
26

法,逐个模块学习就方便了。 本章给出上述过程的(1)—(4)步,下一章给出上述过程的(5)—(8)步。这两章 完成了“基本入门”的前 8 步。 “基本入门”的第 9 步(第一个中断例程)将在第 4 章阐述。 为了规范编程, 符合嵌入式软件工程的基本要求, 提高硬件及底层驱动软件的可复用与可移 植性。

2.3.1 K60 系列 MCU 性能概述与内部结构简图
K60 微控制器系列具有IEEE 1588 以太网,全速和高速 USB 2.0 On-The-Go 带设备 充电探测,硬件加密和防窜改探测能力,具有丰富的模拟、通信、定时和控制外设,从100 LQFP 封装 256 KB 闪存开始可扩展到256 MAPBGA 1MB 闪存。 大闪存的 K60 系列器 件还可提供可选的单精度浮点单元、NAND 闪存控制器和DRAM 控制器。 图 2-3 给出了 K60 系列的模块结构框图。

图 2-3 K60 模块结构图 可选的芯片类型有 MK60N256VLQ100、MK60X256VLQ100、MK60N512VLQ100、 MK60N256VMD100、 MK60X256VMD100 和 MK60N512VMD100。 这些芯片的 CPU 频率与 引脚数都一样,但是在封装、Flash 容量、程序空间等方面还是有差别的。表 2-2 给出了可 选芯片的 MCU 简要描述,供选型参考之用。

27

表 2-2 K60 可选择的芯片类型 芯片类型 CPU 频率 引脚 数 144 封装 Flash 容量 256 KB 512 KB 512 KB 256 KB 512 KB 512 KB 程序 空间 256 KB 256 KB 512 KB 256 KB 256 512 KB 4 KB — — 4 KB — EEPROM — SRAM GPIO

MK60N256VLQ100

100 MHz

LQFP

64 KB

100

MK60X256VLQ100

100 MHz

144

LQFP

64 KB 128 KB 64 KB

100

MK60N512VLQ100

100 MHz

144

LQFP MAP BGA MAP BGA MAP BGA

100

MK60N256VMD100

100 MHz

144

100

MK60X256VMD100

100 MHz

144

64 KB 128 KB

100

MK60N512VMD100

100 MHz

144

100

表 2-3 总结了 K60 系列 MCU 的共性 表 2-3. K60 系列器件的共性
工作特性 ?电压范围 1.71V - 3.6V ? 闪存编程电压最低至1.71V ? 温度范围(TA) -40 to 105° C ? 灵活的工作模式 内核特性 ? 32 位 ARM Cortex-M4 内核 ? 支持DSP 指令 ? 嵌套向量中断控制器(NVIC) ? 异步唤醒中断控制器(AWIC) ? 调试和跟踪 ? 2 引脚串口调试 (SWD) ? IEEE 1149.1 JTAG 调试 (JTAG) ? IEEE 1149.7 简洁 JTAG (cJTAG) ? 端口跟踪接口单元(TPIU) ? 闪存片和断点单元 (FPB) ? 数据检测和跟踪单元(DWT) ? 指令跟踪宏单元 (ITM) 系统和功 耗管理 ? 带外部监控引脚的软件和硬件看门狗 ? 带16 个通道的DMA 控制器 ? 低漏唤醒单元 (LLWU) ? 带10 种功耗模式的功耗管理控制器 ? 不可屏蔽中断(NMI) ? 每个芯片 128 位唯一标识(ID) 数 时钟 ? 多用途时钟发生器 ? PLL 和FLL ? 内部参考时钟(32kHz 或 2MHz) ? 4MHz 到 32MHz 晶振 ? 32kHz 到 40kHz 晶振 28

? 内部 1kHz 低功耗振荡器 ? DC 到 50MHz 外部方波输入时钟 存储器和 存储器接 口 ? Flex 存储器有FlexNVM ( 非易失闪存用于执行程序代码、存储数据或者备份 EEPROM 数据) 或者FlexRAM (RAM 存储器被用作传统的RAM 或者高耐擦写 EEPROM 存储和加快闪存程序运行) ? 闪存安全性和保护特性 ? 串行闪存编程接口(EzPort) 安全和集 成性 ? 循环冗余校检(CRC) ? 16 位 SAR ADC ? 可编程的电压参考(VREF) ? 12 位 DAC ? 带 6 位 DAC 的高速模拟比较器 (CMP) 定时器 ? 1x8ch 电机控制/ 通用/PWM 定时器(FTM) ? 2x2ch 正交解码器/ 通用/PWM 定时器 (FTM) ? 载波调制定时器(CMT) ? 可编程延迟模块 (PDB) ? 1x4ch 可编程中断定时器(PIT) ? 低功耗定时器(LPT)

模拟

通信

? 支持IEEE 1588 的以太网接口 ? USB 全速/ 低速 OTG/ 主机/ 从设备接口 ? CAN ? SPI ? I2C,支持SMBUS ? UART ( 带 ISO7816、IrDA 和硬件流控)

人机接口

? GPIO 支持引脚中断、DMA 请求、数字滤波和其他引脚控制选项 ? 最大允许5V 输入 ? 电容式触摸传感输入

2.3.2 K60 系列存储器映像
表 2-4 列出了不同频率、不同封装的 K60 系列微控制器的存储器大小。 表2-4 K60 系列MCU 概述
存储器 CPU 频率 (MHz) 100 100 100 120 150 120 256 512 256 512 512 1024 — — 256 512 512 — 64 128 64 128 128 128 — — 4 16 16 — 闪存 (KB) FlexNVM (KB) SRAM (KB) FlexRAM (KB) 封装 100 LQFP (14x14) + + + — — — 29 104 BGA (8x8) + + + — — — 144 LQFP (20x20) + + + + + + 144 BGA (13x13) + + + + + + 196 BGA (15x15) — — — + + + 256 BGA (17x17) — — — + + +

150

1024



128







+

+

+

+

Flex存储器是飞思卡尔的新一代Flex存储器技术,为需要片上EEPROM、额外程序或数 据的开发者提供非常多样化和强大的解决方案。Flex 存储器和SRAM 一样简单快速,当用 作高耐久性擦写EEPROM 时,在完成程序运行和擦除功能时不需要用户或者系统干预。 Flex 存储器同时能提供平行于主程序闪存的额外闪存 (FlexNVM) 用于数据或者程序存储。 Flex 存储器使您能完全配置 FlexNVM 和 FlexRAM 模块,从而为应用提供最均衡的存储 器资源。用户可配置的参数包括:EEPROM 大小、擦写次数、写大小和额外程序/ 数据闪 存的大小。 FlexNVM能被用作EEPROM 配置的一部分、 额外的程序或者数据闪存。 也可以一部分 用作闪存同时另一部分被用作增强型EEPROM 备份 FlexRAM能被用作EEPROM 配置的一部分或者额外的系统RAM K60 系 列 的 MCU 为 32 位 微 控制 器 , 可 寻 址 4GB 的 地 址 空 间 , 地 址 范围 为 0x0000_0000~0xFFFF_FFFF。K60 系列的存储器空间地址映像见表 2-5 所示。
表 2-5 K60 系列的存储器空间地址映像 地址范围 0x0000_0000–0x0FFF_FFFF 空间大小 256MB 实际的物理对象 可编程 flash 和只读数据(包括一开始 1024 字节的异常中 断向量) 对 MK60N256VLQ100 芯片:未使用 对 MK60X256VLQ100 芯片:FlexNVM 0x1000_0000–0x13FF_FFFF 64MB 对 MK60N512VLQ100 芯片:未使用 对 MK60N256VMD100 芯片:未使用 对 MK60X256VLQ100 芯片:FlexNVM 对 MK60N512VMD100 芯片:未使用 0x1400_0000–0x17FF_FFFF 0x1800_0000–0x1FFF_FFFF 0x2000_0000–0x200F_FFFF 0x2010_0000–0x21FF_FFFF 0x2200_0000–0x23FF_FFFF 0x2400_0000–0x3FFF_FFFF 0x4000_0000–0x4007_FFFF 0x4008_0000–0x400F_EFFF 0x400F_F000–0x400F_FFFF 0x4010_0000–0x41FF_FFFF 0x4200_0000–0x43FF_FFFF 0x4400_0000–0x5FFF_FFFF 0x6000_0000–0xDFFF_FFFF 0xE000_0000–0xE00F_FFFF 0xE010_0000–0xFFFF_FFFF 64MB 128MB 1MB 31MB 32MB 448MB 512KB 508KB 4KB 25MB 32MB 448MB 2GB 1MB 511MB 对有 FlexNVM 的设备:FlexRAM 对只有可编程 Flash 的设备:可编程加速 RAM SRAM_L SRAM_U 未使用 SRAM_U 的混合位宽区 未使用 外设桥 0(AIPS-Lite0) 外设桥 1(AIPS-Lite1) 通用输入输出 未使用 外设桥(AIPS-Lite)与通用输入输出的混合位宽区 未使用 Flexbus 私有外设 未使用

片上 RAM 分为 SRAM_L 和 SRAM_U,从表 2-5 可见它们是连续的存储映射。对于 SRAM_L 和 SRAM_U 如果处于片外时,在请求主机访问总线时将会产生一个错误。外设存 储映射在 0x4000_0000 到 0x400F_FFFF 区有两个从机端口,实现了 2 个外设桥(AIPS-Lite0 和 AIPS-Lite 1): AIPS-Lite0 占 512KB ,AIPS-Lite1 占 508KB,4KB 的 GPIO。 AIPS-Lite0
30

连接到从机端口 2, 可访问区间是 0x4000_0000 到 0x4007_FFFF。 AIPS-Lite1 和 GPIO 共享 从机端口 3,AIPS-Lite1 的可访问区间是 0x4008_0000 到 0x400F_EFFF,GPIO 的 4KB 可访 问区间是 0x400F_F000 到 0x400F_FFFF。它可直接连接到闩开关提供的主机不需要等待 AIPS-Lite 控制器的状态。 本模块的时钟是由 SIM 寄存器的 AIPS 控制位控制的。访问任何 未实现或未使能的外设桥信号将产生错误。 对于可编程模块访问外设桥,只有 4KB 的实现 空间。

2.4 K60的引脚功能与硬件最小系统
本书以 144 引脚 LQFP 封装的 MK60N512VMD100 芯片为例介绍 K60 的编程和应用。

2.4.1K60 的引脚功能
图 2-4 是 144 引脚 LQFP 封装的 MK60N512VMD100 的引脚图。 每个引脚都可能有多个 复用功能,有的引脚有两个复用功能,有的有四个复用功能,还有的有六个复用功能,系统 设计时必须注意只能使用其中的一个功能。一般情况下,需要按引脚功能分类了解 MCU 引 脚功能情况。

图 2-4 是 144 引脚 LQFP 封装的 MK60N512VMD100 的引脚图 表 2-6 按引脚功能分类列出了 MK60N512VMD100 的工作支撑引脚。
31

表 2-6 MK60N512VMD100 工作支撑引脚表
分类 引脚名 引脚号 5、16、43、 VDD 56、 94、 70、 3.3V 108、122、 135 6、17、18、 VSS 电 源 类 VDDA VSSA VREFH VREFL VREF_OUT VREGIN VOUT33 VBAT 复位 44、 71、 57、 0V 93、107、 121、134、 31 34 32 33 37 22 21 42 74 41 40 72 73 51 RTC 晶振输入引脚(32KHz) RTC 晶振输出引脚(32KHz) 外部晶振输入引脚 外部晶振输出引脚 JTAG 测试数据输入引脚 TCK 线上升沿时, 从 线上取数 TCK 线下降沿时, 数 据上线 3.3V 0V 为 AD 转换模块供电源 为 AD 转换模块供参考地 AD 模块参考高电平 AD 模块参考高低平 内部产生的参考输出电压 USB 调节器输入电源 USB 调节器输出电源 32KHz 晶振电源 1.71~3.6 低电平时芯片复位 2.7~5.5 范围 1.71~3.6V 为 I/O 引脚提供参考地 为 I/O 引脚提供电源 范围 1.71~3.6V 典型值 功能描述 备注

RESET
EXTAL32 XTAL32

晶振

EXTAL XTAL JTAG_TDI

JTAG_TDO 写入器 JTAG_TCLK

52

JTAG 测试数据输出引脚

50

JTAG 测试时钟线 用于设置 JTAG 控制 器的状态

JTAG_TMS JTAG_TRST

53 55

JTAG 测试模式选择线 JTAG 复位

除去需要服务的引脚外,其它引脚可以为实际系统提供 I/O 服务。芯片提供服务的引脚 也可称为 I/O 端口资源类引脚。MK60N512VMD100(144 引脚 LQFP 封装)的有多达 100 个 I/O 引脚。其中 A 口 26 个,B 口 20 个,C 口 20 个,D 口 16 个,E 口 18 个,详细情况 见表 2-7 所示。

32

表 2-7 I/O 端口资源表
口 名 引脚 数 引脚 名 PTA0 引脚 号 50 第一 TSI0_C H1 TSI0_C H2 TSI0_C H3 TSI0_C H4 TSI0_C H5 第二 GPIO 第三 UART0_C TS_b UART0_R X UART0_T X UART0_R TS_b FTM0_CH 1 功能描述 第四 FTM0_ CH5 FTM0_ CH6 FTM0_ CH7 FTM0_ CH0 第五 JTAG_TCLK/ SWD_CLK JTAG_TDI JTAG_TDO/ TRACE_SW O JTAG_TMS/ SWD_DIO EZP_DO 第六 EZP_CLK

PTA1

51

GPIO

EZP_DI

PTA2

52

GPIO

PTA3

53

GPIO

PTA4

54

GPIO

NMI_b CMP2 _OUT

EZP_CS_b I2S0_RX_BC LK JTAG_T RST

PTA5

55

GPIO

FTM0 _CH2
FTM0_ CH3 GPIO

RMII0_R XER/MII0 _RXER
TRACE_C LKOUT FTM0_CH 4 FTM1_CH 0

PTA6

58

GPIO ADC0_ SE10 ADC0_ SE11

PTA7

59

TRACE _D3 FTM1_ QD_P HA TRACE_D2

A

26

PTA8

60

GPIO

PTA9

61

GPIO

FTM1 _CH1
FTM2_ CH0

MII0_RX D3
MII0_RXD 2

FTM1 _QD_P HB
FTM2_ QD_P HA FTM2_ QD_P HB FTM1_ CH0 FTM1_ CH1 RMII0_

TRACE_D1

PTA1 0

62

GPIO

TRACE_D0

PTA1 1 PTA1 2 PTA1 3

63

GPIO

FTM2_ CH1

MII0_RXC LK

64

CMP2_ IN0 CMP2_ IN1

GPIO

CAN0_TX

RMII0_RXD1/ MII0_RXD1 RMII0_RXD0/ MII0_RXD0

I2S0_TX D I2S0_TX_ FS

65

GPIO

CAN0_RX

PTA1 4

66

GPIO

SPI0_P CS0

UART0_T X

CRS_ DV/ MII0_R XDV

I2S0_TX_BC LK

33

RMII0_ PTA1 5 67 GPIO SPI0_S Ck UART0_R X TXEN/ MII0_T XEN RMII0_ PTA1 6 68 GPIO SPI0_S OUT UART0_C TS_b TXD0/ MII0_T XD0 PTA1 7 PTA1 8 PTA1 9 PTA2 4 PTA2 5 PTA2 6 PTA2 7 PTA2 8 PTA2 9 ADC1_ SE17 UART0 GPIO SPI0_SIN _RTS _b GPIO FTM0_FLT 2 FTM1_FLT 0 FB_A29 FTM_C LKIN0 FTM_C LKIN1 LPT0_ALT1 RMII0_TXD1/ MII0_TXD1 I2S0_MC LK I2S0_RX_FS I2S0_RXD

69

72

EXTAL

73

XTAL

GPIO MII0_T XD2 MII0_T XCLK MII0_T XD3 MII0_C RS MII0_T XER MII0_C OL

75

GPIO

76

GPIO

FB_A28

77

GPIO

FB_A27

78

GPIO

FB_A26

79

GPIO

FB_A25

80

GPIO ADC0_ SESE8/ ADC1_ SE8/ TSI0_C H0 ADC0_

FB_A24

PTB0

81

GPIO

I2C0_SCL

FTM1_ CH0

RMII0_MDIO/ MII0_MDIO

FTM1_Q D_PHA

B

20 PTB1 82

SE9/ ADC1_ SE9/ TSI0_C H6 ADC0_ PTB2 83 SE12/ TSI0_C H7 GPIO I2C0_SCL UART0 _RTS _b ENET0_1588 _TMR0 GPIO I2C0_SDA FTM1_ CH1 RMII0_MDC/ MII0_MDC

FTM1_Q D_P HB

FTM0_FL T3

34

ADC0_ PTB3 84 SE13/ TSI0_C H8 PTB4 85 ADC1_ SE10 ADC1_ SE11 ADC1_ SE12 ADC1_ SE13 UART3 PTB8 89 GPIO _RTS _b SPI1_P CS1 GPIO FB_AD21 UART3_C TS _b SPI1_PCS 0 SPI1_SCK SPI1_SOU T SPI1_SIN GPIO ENET0_15 88_TMR2 ENET0_15 88TMR3 FB_AD23 FB_AD22 GPIO I2C0_SDA

UART0 _CTS _b FTM1_ FLT0 FTM2_ FLT0

ENET0_1588 _TMR1

FTM0_FL T0

PTB5

86

GPIO

PTB6 PTB7

87 88

GPIO GPIO

PTB9 PTB1 0 PTB1 1 PTB1 6 PTB1 7 PTB1 8 PTB1 9 PTB2 0 PTB2 1 PTB2 2 PTB2 3

90

GPIO ADC1_ SE14 ADC1_ SE15 TSI0_C H9 TSI0_C H10 TSI0_C H11 TSI0_C H12 GPIO

FB_AD 20 UART3 _RX UART3 _TX UART0 _RX UART0 _TX FTM2_ CH0 FTM2_ CH1 CMP0_ OUT CMP1_ OUT CMP2_ OUT FB_AD17 FB_AD19 FB_AD18 FTM0_FL T1 FTM0_FL T2 EWM_IN EWM_OU T_b FB_AD15 HA FB_OE_b

91

92

GPIO

95

GPIO

96

GPIO

FB_AD16 I2S0_TX_BC LK I2S0_TX_FS

97

GPIO

CAN0_TX

98

GPIO SPI2_P CS0 SPI2_S CK SPI2_S OUT SPI2_S IN

CAN)_RX

99

FB_AD31

100

GPIO

FB_AD30

101

GPIO

FB_AD29

102

GPIO ADC0_

FB_AD28

C

20

PTC0

103

SE14/ TSI0_C H13

GPIO

SPI0_PCS 4

PDB0_ EXTR G I2S0_TXD FB_AD14

35

ADC0_ PTC1 104 SE15/ TSI0_C H14 ADC0_ SE4b/ PTC2 105 CMP1_ IN0/ TSI0_C H15 PTC3 106 CMP1_ IN1 GPIO GPIO SPI0_P CS0 PTC5 110 GPIO CMP0_ IN0 CMP0_ IN1 ADC1_ PTC8 113 SE4b/ CMP0_ IN2 ADC1_ PTC9 114 SE5b/ CMP0_ IN3 ADC1_ PTC1 0 115 SE6b/ CMP0_ IN4 PTC1 1 PTC1 2 PTC1 3 PTC1 4 116 ADC1_ SE7b GPIO I2C1_SDA GPIO I2C1_SCL GPIO I2S0_RX_ BC LK GPIO I2S0_MCL K SPI0_S CK GPIO SPI0_PCS 1 UART1_T X LPT0_ALT 2 SPI0_SOU T SPI0_SIN GPIO SPI0_PCS 2 GPIO SPI0_PCS 3

UART1 _RTS _b FTM0_CH0 FB_AD13

UART1 _CTS _b FTM0_CH1 FB_AD12

UART1 _RX FTM0_ CH3 FB_AD 10 PDB0_ EXTRG FB_AD 8

FTM0_CH2

FB_CLK OUT CMP1_O UT

PTC4

109

FB_AD11

CMP0_OUT

PTC6

111

FB_AD9

PTC7

112

GPIO

I2S0_C LKIN

FB_AD7

FB_AD 6

FTM2_FLT0

I2S0_R X_FS

FB_AD5

I2S0_R XD

FB_RW_b

117

GPIO

UART4 _RTSb UART4

FB_AD27

118

GPIO

_CTS_ b

FB_AD26

119

GPIO

UART4 _RX

FB_AD25 36

PTC1 5

120

GPIO

UART4 _TX

FB_AD24 FB_CS5_b/ FB_TSIZ1/ FB_BE23_16 _BLS15_8_b FB_CS4_b/ FB_TSIZ0/ FB_BE31_24 _BLS7_0_b

PTC1 6

123

GPIO

CAN1_ RX

UART3_R X

ENET0 _1588 _TMR0

PTC1 7

124

GPIO

CAN1_ TX

UART3_T X

ENET0 _1588 _TMR1 FB_TB ST_b/ FB_CS 2_b/ FB_BE 15_8_ BLS23 _16_b FB_CS

PTC1 8

UART3 125 GPIO _RTS_ b

ENET0_15 88 _TMR2

PTC1 9

UART3 126 GPIO _CTS _b

ENET0_15 88 _TMR3

3_b/ FB_BE 7_0_B LS31_2 4_b FB_AL FB_TA_b

PTD0

127

GPIO

SPI0_P CS0

UART2_R TS_b

E/FB_C S1_b/ FB_TS _b

PTD1

128

ADC0_ SE5b

UART2 GPIO SPI0_SCK _CTS _b SPI0_S OUT SPI0_S IN SPI0_P CS1 UART2_R X UART2_T X UART0_R TS _b SPI0_PCS 2 37 FB_AD 4 FB_AD 3 FTM0_ CH4 UART0 _CTS _b FTM0_CH5 FB_AD1 FB_CS0_b

D

16

PTD2

129

GPIO

PTD3

130

GPIO

PTD4

131

GPIO

FB_AD2

EWM_IN

PTD5

132

ADC0_ SE6b

GPIO

PTD6

133

ADC0_ SE7b

GPIO

SPI0_PCS 3

UART0 _RX

FTM0_CH6

FB_AD0

PTD7

136

GPIO

CMT_I RO I2C0_S CL I2C0_S DA UART5

UART0_T X UART5_R X UART5_T X

FTM0_ CH7 FB_A1 6 FB_A1 7

FTM0_FLT1

PTD8

137

GPIO

PTD9

138

GPIO

PTD1 0

139

GPIO

_RTS _b SPI2_P CS0 SPI2_S CK SPI2_S OUT SPI2_S IN SPI2_P CS1 GPIO

FB_A18

PTD1 1 PTD1 2 PTD1 3 PTD1 4 PTD1 5 PTE0

UART5_C TS _b SDHC0_D 4 SDHC0_D 5 SDHC0_D 6 SDHC0_D 7 SPI1_PCS 1 SPI1_SOU T

SDHC0 _CLKI N FB_A2 0 FB_A2 1 FB_A2 2 FB_A2 2 UART1 _TX UART1 _RX UART1 SDHC0_D1 I2C1_SD A I2C1_SC L FB_A19

140

GPIO

141

GPIO

142

GPIO

143

GPIO

144

GPIO

1

ADC1_ SE4a ADC1_ SE5a ADC1_ SE6a

PTE1

2

GPIO

SDHC0_D0

PTE2 E 18

3

GPIO

SPI1_SCK

_CTS _b UART1

SDHC0_DCL K

PTE3

4

ADC1_ SE7a

GPIO

SPI1_SIN

_RTS _b

SDHC0_CMD

PTE4

7

GPIO

SPI_P CS0 SPI_P CS2

UART3_T X UART3_R X

SDHC0 _D3 SDHC0 _D2

PTE5

8

GPIO

38

PTE6

9

GPIO

SPI_P CS3 UART3

UART3_C TS_b

I2S0_M CLK

I2S0_CLKIN

PTE7

10

GPIO

_RTS _b

I2S0_RXD

PTE8

11

GPIO

UART5 _TX UART5 _RX UART5 _CTS _b UART5 _RTS _b I2S0_T X_BC LK GPIO

I2S0_RX_ FS I2S0_RX_ BCLK

PTE9

12

GPIO

PTE1 0

13

GPIO

I2S0_TXD

PTE1 1

14

GPIO

I2S0_TX_F S

PTE1 2 PTE2 4 PTE2 5 PTE2 6 PTE2 7 PTE2 8 总 数 100

15

GPIO ADC0_ SE17 ADC0_ SE18 GPIO

45

CAN1_TX

UART4 _TX UART4 _RX RTC_C LKOU T

EWM_OUT_b

46

GPIO

CAN1_RX ENET_158 8_ CLKIN

EWM_IN

47

UART4 _CTSb UART4 _RTSb

USB_CLKIN

48 49

GPIO GPIO

2.4.2K60 硬件最小系统
MCU的硬件最小系统是指可以使内部程序运行的所必须的外围电路,也可以包括写入 器接口电路。使用一个芯片,必须完全理解其硬件最小系统。当MCU工作不正常时,首先 查找最小系统中可能出错的元件。一般情况下,MCU的硬件最小系统由电源、晶振及复位 等电路组成。芯片要能工作,必须有电源与工作时钟,至于复位电路则提供不掉电情况下 MCU重新启动的手段。由于Flash存储器制造技术的发展,大部分芯片提供了在板或在系统 (On System)写入程序功能,即把空白芯片焊接到电路板上后,再通过写入器把程序下载 到芯片中。这样,硬件最小系统应该把写入器的接口电路也包含在其中。基于这个思路, MK60N512VMD100芯片的硬件最小系统包括电源电路、复位电路、晶振电路及JTAG接口 电路。下面分别对这些电路给出简明分析。
39

1.电源及其滤波电路
电路中需要大量的电源类引脚用来提供足够的电流容量。所有的电源引脚必须外接适 当的滤波电容抑制高频噪音。图2-5给出了MK60N512VMD100硬件最小系统的电源和地连 接图。 电源 (VDDx) (VSSx) 与地 包括很多引脚, 如VDDA、 VSSA、 VDD1~VDD6、 VSS1~VSS8、 VREAFH和VREAFL等。 一些电源与地引脚仅用于外接滤波电容, 内部已经连接到电源与地, 芯片参考手册指出不需要再外接电源。至于电容外接,是由于集成电路制造技术所限,无 法在IC内部通过光刻的方法制造这些电容。电源滤波电路,用于改善系统的电磁兼容性, 降低电源波动对系统的影响,增强电路工作稳定性。为标识系统通电与否,可以增加一个 电源指示灯。

图 2-5

MK60N512VMD100 电源电路

2.复位电路
图2-6给出了MK60N512VMD100硬件最小系统的复位电路。复位,意味着MCU一切重 新开始。 复位引脚为RESET。 若RESET信号有效 (低电平) ,MCU复位。 复位电路原理如下: 正常工作时复位输入引脚RESET通过一个10K的电阻接到电源正极,所以应为高电平。若按 下复位按钮,则RESET脚接地,为低电平,导致芯片复位。 从引起MCU复位的内部与外部因素区分,复位分为外部复位与内部复位两种。外部复 位有上电复位、按下“复位按钮”复位。内部复位有看门狗定时器复位、低电压复位、低 漏唤醒(LLWU)复位、MCG丢失时钟复位、软件复位、锁定复位、EzPort复位等。 从复位时芯片是否处于上电状态区分,复位可分为冷复位与热复位。芯片从无电状态 上电的复位属于冷复位,芯片处于带电状态的复位叫热复位。冷复位后,MCU内部RAM的 内容是随机的。而热复位后,MCU内部RAM的内容保持复位前的内容,即热复位并不会引 起RAM中内容的丢失。 从CPU响应快慢区分,复位可分为异步复位与同步复位。异步复位源提出的复位请求一 般表示一种紧要的事件,因此复位控制逻辑不等到当前总线周期结束,复位立即有效。异 步复位源有上电、丢失时钟、低压检测LVD、失去锁定等。同步复位的处理方法与异步复 位不同,当一个同步复位源提出一个复位请求时,复位控制器并不使之立即起作用,而是
40

等到当前总线周期结束,这是为了保护数据的完整性。在该总线周期结束后,下一个系统 时钟的上升沿时,复位才有效。同步复位有看门狗定时器、软件等。

图 2-6 MK60N512VMD100 复位电路

3.晶振电路
晶振电路为芯片提供准确的工作时钟。 晶体振荡器分为无源晶振和有源晶振两种类型。需要外接电源的晶振称为有源晶振。 无源晶振与有源晶振的英文名称不同, 无源晶振为crystal (晶体)而有源晶振则叫做oscillator , (振荡器) 无源晶振是有两个引脚的无极性元件, 。 需要借助于时钟电路才能产生振荡信号,

图 2-7 MK60N512VMD100 晶振电路 自身无法振荡起来。MK60N512VMD100内部集成多用途时钟产生器(Multipurpose Clock Generator ,MCG)模块,用于将晶振输入时钟倍频至系统所需时钟。MK60N512VMD100 共需要两个晶振,一个是芯片的主晶振,用于产生芯片和外设的工作时钟,另一个是实时 定时器的晶振(RTC) 。苏州大学飞思卡尔嵌入式实验室开发的核心板主芯片时钟使用 50MHZ有源晶振,RTC时钟使用32.768KHZ无源晶振,图2-7为系统晶振电路。在硬件布线 时需要注意晶振附近不能走高频信号,晶振应该尽量靠近晶振输入引脚。晶振一旦不能正 常工作,芯片将无法工作。晶振实际上负责给芯片提供心跳。

41

4.JTAG 电路
Kinetis 芯片使用的是 ARM Cortex-M4 内核, 该内核内部集成了 JTAG(Joint Test Action Group)接口,通过 JTAG 接口可以实现程序下载和调试功能。图 2-8 为 JTAG 接口电路。

图 2-8 MK60N512VMD100 JTAG 电路

2.4.3 硬件最小系统测试方法
前面介绍了硬件最小系统的设计, 给出了硬件最小系统元件的参考值。 硬件最小系统电 路原理图见光盘。 根据原理图制作了印刷电路板后,就开始硬件电路板的焊接和测试了。具体过程如下: (1)焊接电源、复位电路、晶振电路、以及 JTAG 接口电路。注意:电源的滤波电容 不可漏焊,否则芯片所受干扰较大,影响调试。 (2)在确保电源和地未短路的情况下接通电源,测量电压是否正常,检查按下复位按 钮是否能够复位(观察复位指示灯) 。 (3)将写入器与电路板连接,启动开发环境 IAR Embedded Workbench for RAM 6.10, 对目标 MCU 进行擦除,如果成功则说明最小系统工作正常。 (4)将第一个样例程序下载到 Flash 中,观察小灯闪烁情况。 (5)硬件最小系统测试通过以后就可以进行其他模块焊接。正确的做法是,焊完一个 模块后,应紧接着测试该模块工作是否正常,切忌焊接多个模块后再进行测试,因为一旦出 现问题,就很难定位具体是哪个模块的问题。

42

第3章 第一个样例程序及工程组织
本章阐述“入门”过程的(5)—(8)步,通过这个过程,完成第一个 CodeWarrior 工 程、 工程的入门。 IAR 利用 GPIO 模块编程控制发光二极管作为入门例子, 给出 CodeWarrior、 IAR 工程组织、框架,阐述各个文件的功能,主要目的是使读者理解程序框架和工作过程。 重点是透彻理解第一工程的执行过程。

3.1 通用I/O接口基本概念及连接方法
1.I/O 接口的概念
I/O 接口,即输入输出接口,是微控制器同外界进行交互的重要通道。这里的接口英文 是 port,也可以翻译为“端口” ,另一个英文单词是 interface,也翻译为接口。从中文字面 看,接口与端口似乎有点区别,但在嵌入式系统中它们的含义是相同的。有时 I/O 引脚称为 接口(interface) ,而把用于对 I/O 引脚进行编程的寄存器称为端口(port) ,实际上它们是紧 密相连的。因此,不必深究它们之间的区别。有些书中甚至直接称 I/O 接口(端口)为 I/O 口。在嵌入式系统中,接口千变万化,种类繁多,有显而易见的人机交互接口,如操纵杆、 键盘、显示器;也有无人介入的接口,如网络接口、机器设备接口。

2.通用 I/O
所谓通用 I/O,也记为 GPIO(General Purpose I/O) ,即基本的输入/输出,有时也称并 行 I/O,或普通 I/O,它是 I/O 的最基本形式。 本书中使用正逻辑, 电源(Vcc)代表高电平, 对应数字信号“1” ;地(GND)代表低电平,对应数字信号“0” 。作为通用输入引脚,MCU 内部程序可以通过端口寄存器读取该引脚,知道该引脚是“1” (高电平)或“0” (低电平) , 即开关量输入。作为通用输出引脚,MCU 内部程序通过端口寄存器向该引脚输出“1” (高 电平)或“0” (低电平) ,即开关量输出。大多数通用 I/O 引脚可以通过编程来设定工作方 式为输入或输出,称之为双向通用 I/O。

3.上拉下拉电阻与输入引脚的基本接法
芯片输入引脚的外部有三种不同的连接方式: 带上拉电阻的连接、 带下拉电阻的连接和 “悬空”连接。通俗地说,若 MCU 的某个引脚通过一个电阻接到电源(Vcc)上,这个电 阻被称为“上拉电阻” 与之相对应,若 MCU 的某个引脚通过一个电阻接到地(GND)上, 。 则相应的电阻被称为“下拉电阻” 。这种做法使得,悬空的芯片引脚被上拉电阻或下拉电阻 初始化为高电平或低电平。根据实际情况,上拉电阻与下拉电阻可以取值在 1KΩ~10KΩ 之间,其阻值大小与静态电流及系统功耗相关。 图 3-1 给出了一个 MCU 的输入引脚的三种外部连接方式,假设 MCU 内部没有上拉或 下拉电阻,图中的引脚 I3 上的开关 K3 采用悬空方式连接就不合适,因为 K3 断开时,引脚 I3 的电平不确定。 在图 3-1 中, R1>>R2, R3<<R4, 各电阻的典型取值为: R1=20K, R2=1K, R3=10K,R4=200K。

43

图 3-1 I/O 口输入电路

4.输出引脚的基本接法
作为通用输出引脚,MCU 内部程序向该引脚输 出高电平或低电平来驱动器件工作,即开关量输出。 如图 3-2 所示。 一种接法是 O1 引脚直接驱动发光二极管 LED, 当 O1 引脚输出高电平时,LED 不亮;当 O1 引脚输 出低电平时,LED 点亮。这种接法的驱动电流一般 在 2mA~10mA。 图 3-2 I/O 口输出电路 另种接法是 O2 引脚通过一个 NPN 三极管驱动 蜂鸣器,当 O2 脚输出高电平时,蜂鸣器响;O2 脚输出低电平时,蜂鸣器不响。这种接法 的驱动电流可达 100mA 左右,而 O2 引脚控制电流可以在几个 mA 左右。 若负载需要更大的驱动电流,就必须另外的驱动电路,但对 MCU 编程来说,没有任何 影响。

3.2 MK60N512VMD100的GPIO
MK60N512VMD100 的大部分引脚具有多重功能, 可以通过编程设定使用其中一种功能。 GPIO 作为基本功能,MK60N512VMD100 有 5 个 GPIO 口,共 100 个引脚。分别为 A 口、 B 口、C 口、D 口、E 口。A 口有 26 个引脚,分别为 PTA0~PTA19、PTA24~PTA29,B 口 有 20 个引脚, 分别为 PTB0~PTB11、 PTB16~PTB23, 口有 20 引脚, C 分别为 PTC0~PTC19, D 口有 16 个引脚,分别为 PTD0~PTD15,E 口有 18 个引脚,分别为 PTE0~PTE12、 PTE24~PTE28。 每个口均包含 6 个寄存器,下面分别介绍一下。 1.数据输出寄存器(GPIOx_PDOR) ,可读写,32 位,复位时为 0。无论引脚上的逻辑 电平为 0 还是为 1,相应的引脚都被配置为输出。 2.数据输入寄存器(GPIOx_PDIR) ,只读,32 位,复位时为 0。读为 0 时,说明相应 引脚上为低电平或配置为数字功能,读为 1 时,说明相应引脚上为高电平。 3.数据方向寄存器(GPIOx_PDDR) ,可读写,32 位,复位时为 0。0——定义为输入, 1——定义为输出。 4.输出设置寄存器(GPIOx_PSOR) ,可写,32 位,复位时为 0。对该寄存器进行写操 作将该表 PDOR 寄存器的值。写 0 时,不改变 PDOR 上的相应位,写 1 时,将 PDOR 上的
44

相应位置 1。 5.输出清除寄存器(GPIOx_ PCOR) ,可写,32 位,复位时为 0。对该寄存器进行写 操作将该表 PDOR 寄存器的值。写 0 时,不改变 PDOR 上的相应位,写 1 时,将 PDOR 上 的相应位清 0。 6.输出触发寄存器(GPIOx _PTOR) ,可写,32 位,复位时为 0。对该寄存器进行写 操作将该表 PDOR 寄存器的值。写 0 时,不改变 PDOR 上的相应位,写 1 时,将 PDOR 上 的相应位反转。 GPIO 的基本编程方法: (1)通过“数据方向寄存器”设置相应引脚为输入或输出; (2)若是输出引脚,则通过“数据输出寄存器”设置引脚输出高电平或低电平; (3)若是输入引脚,则通过“数据输入寄存器”获得引脚的状态。 (4)若是输出引脚,可通过“输出设置寄存器”“输出清除寄存器”“输出触发寄存 、 、 器”来改变引脚的状态。

3.3 开发环境与JTAG写入器
嵌入式软件开发有别于桌面软件开发的一个显著的特点, 是它一般需要一个交叉编译和 调试环境,即编辑和编译软件在通常的 PC 机上进行,而编译好的软件需要通过写入工具下 载到目标机上执行,如 MK60N512VMD100 的目标机上。由于主机和目标机处理器的体系 结构彼此不同, 从而增加了嵌入式软件开发的难度。 所以选择一些好的开发套件有助于对目 标机的学习与开发。 本书将介绍 IAR Systems 公司的 IAR Embedded Workbench for ARM 6.10 集成开发环境(简称 IAR 环境) 、Freescale 公司的 CodeWarrior10.1 集成开发环境(简称 CW 环境) 、苏州大学的 MK60N512VMD100 硬件评估板以及 JTAG 写入器。

3.3.1 IAR 开发环境简介与基本使用方法
1.IAR 环境功能和特点
Embedded Workbench for ARM 6.10 是 IAR Systems 公司为 ARM 微处理器开发的一个 集成开发环境。比较其他的 ARM 开发环境,IAR 具有入门容易、使用方便和代码紧凑等 特点。 IAR 中包含一个全软件的模拟程序(simulator)。用户不需要任何硬件支持就可以模拟各 种 ARM 内核、外部设备甚至中断的软件运行环境。从中可以了解和评估 IAR 的功能和使 用方法。 IAR 的主要特点如下: 1、高度优化的 IAR ARM C/C++ Compiler 2、IAR ARM Assembler 3、一个通用的 IAR XLINK Linker 4、IAR XAR 和 XLIB 建库程序和 IAR DLIB C/C++运行库 5、功能强大的编辑器 6、项目管理器 7、命令行实用程序 8、IAR C-SPY 调试器(先进的高级语言调试器)

45

2.IAR 环境安装与设置
IAR 环境安装并不复杂,按提示步骤一步步来即可,光盘中给出了详细的安装步骤。关 键要注意 IAR 环境的设置,这部分光盘中也给出了操作步骤。IAR 环境的运行界面如图 3-3 所示。

图 3-3 IAR 环境的运行界面

3.3.2 CW 开发环境简介与基本使用方法
1.CW 环境功能和特点
CodeWarrior 开发环境(简称 CW 环境)是 Freescale 公司研发的面向 Freescale MCU 与 DSP 嵌入式应用开发的商业软件工具,其功能强大,是 Freescale 向用户推荐的产品。 CodeWarrior 分为 3 个版本:特别版(Special Edition) 、标准版和专业版。特别版是免 费的,用于教学目的,对生成的代码量有一定限制,C 语言代码不得超过 12KB,对工程包 含的文件数目也限制在 30 个以内。标准版和专业版没有这种限制。3 个版本的区别在于用 户所获取的授权文件 (license) 不同, 特别版的授权文件随安装软件附带, 不需要特殊申请, 标准版和专业版的授权文件需要付费。CodeWarrior 特别版、标准版和专业版的定义随所支 持的微处理器的不同而不同,如 CodeWarrior for HC08 V6.0、CodeWarrior for HC12 V4.6、 CodeWarrior for ColdFire V6.3 等,本书使用 CodeWarrior V10.1,这个版本支持所有系列的芯 片。 CW 环境包括以下几个功能模块: 编辑器、 源码浏览器、 搜索引擎、 构造系统、 调试器、 工程管理器。编辑器、编译器、连接器和调试器对应开发过程的四个主要阶段,其它模块用 以支持代码浏览和构造控制,工程管理器控制整个过程。该集成环境是一个多线程应用,能 在内存中保存状态信息、符号表和对象代码,从而提高操作速度;能跟踪源码变化,进行自
46

动编译和连接。

2.CW 环境安装与设置
CW 环境安装没有什么特别之处,在 Windows 操作系统上,只要按照安装向导单击鼠 标就可以自动完成。

图 3-4 CW10.1 环境运行界面 需要说明的是,安装完毕以后要上网注册以申请使用许可(license key) 。无论是下载的 软件还是申请到的免费光盘,安装后都要通过因特网注册,以申请使用许可(licenseKey) 。 这里可通过登录其网站,单击“Request a Key”实现。由于这一注册过程是在网上自动实现 的,故只要网络通畅,这个往返过程在数分种之内即可过完成。申请后会通过 E-MAIL 得到 一个 License.dat 文件。将该文件复制到相应目录下即可,例如: “C:\Program Files\Freescale\ CW MCU v10.1\” 。对于免费的特别版本,安装好后用 License.dat 覆盖安装目录下的 License.dat。CW 环境的运行界面如图 3-4 所示。

3.3.3 JTAG 写入器
开发人员可以通过 JTAG 写入器对目标板中的 Flash 进行擦除、写入等操作。将机器码 下载到 Flash 后,可以进行程序的运行、调试。图 3-5 给出了写入器的实物图。使用该写入 器时,一端连接 PC 的 USB 口,一端连接目标板的 BDM 口。详细的使用说明请见光盘。

3.3.4 MK60N512VMD100 硬件核心板
MK60N512VMD100 硬件核心板如图 3-6 所示, 该硬件核心板使用 144 引脚的 MAPBGA
47

封装,为 4 层电路板。通过扩展板为其供电,扩展板上实现了 K 系列芯片的大部分模块, 其中包括 LED,CAN,UART,SD 卡,USB OTG,以太网和 LCD 等模块。扩展板使用两 层电路板,提供 12V 电源输入插头,板上使用 LM2576 芯片将 12V 电压转换至 3.3V 电压。 LM2576 产生的 3.3V 电源提供 MK60N512VMD100 核心板和扩展板上的所有元件, LM2576 可以提供 3A 的输出电流,足够核心板和外设使用。扩展板实物图见图 3-7 所示。

图 3-5 写入器的实物图

图 3-6 MK60N512VMD100 硬件核心板

图 3-7 K 系列扩展板

3.4 IAR工程文件组织
嵌入式系统工程往往包含很多文件,如:程序文件、头文件、与编译调试相关的信息文
48

件、 工程说明文件以及工程目标代码文件等。 工程文件的合理组织对一个嵌入式系统工程犹 为重要,它不但会提高项目的开发效率,同时也降低项目的维护难度。 嵌入式系统工程的文件组织方法以硬件对象为核心来展开, 系统中每个对象应包含相关 的头文件、程序文件及说明文件等。以硬件对象的方式来组织文件,会使得工程结构清晰, 调试定位方便,后期维护容易,这也是嵌入式系统软件工程的基本思想。

3.4.1 工程文件的组织
图 3-8 给出了用 I/O 口控制小灯闪烁工程的树形结构模板,该模板是苏州大学飞思卡尔 嵌入式系统实验室专门为 MK60N512VMD100 开发板设计的工程模板。读者在新建工程时 可以选择该模板。该模板方便易懂,与 IAR 提供的 DEMO 的工程模板相比文件少,去掉了 一些初学者不易理解且不是必须的文件, 同时应用底层软件构件的概念改进了程序结构, 目 的是一开始就引导读者进行规范的文件组织与编程。 新建工程有两种方法, 一种是使用工程模板, 另一种是使用已存在的工程来建立另外一 个工程。 第一种方法的操作步骤如下: 选择 file->WorkSpace,建立工作区,然后选择 Project->Create New Project,弹出 Create New Project 对话框,选择“ARM” ,选择编程语言,选中 main,然后点确定,输入文件名, 点保存, 这样就创建了一个工程。 创建工程后需要按照具体的要求来进行配置, 这点详见 “创 建新工程的步骤.docx” 。 第二种方法是使用已存的工程来建立另一个工程。 当在已有工程的基础上, 做另一个项 目时,比如在 light 工程的基础上编写 LCD 程序,需要进行如下设置: (1)更改工程文件夹名为 LCD (2)更改 light.dep 为 LCD. dep (3)更改 light.ewd 为 LCD. ewd (4)更改 light.ewp 为 LCD. Ewp (5)更改 light.eww 为 LCD. eww (6)用记事本方式打开 LCD. Eww,代码如下 <?xml version="1.0" encoding="iso-8859-1"?> <workspace> <project> <path>$WS_DIR$\ light..ewp</path> </project> <batchBuild/> </workspace> 将其中的 light.ewp 改为 LCD..ewp (7)打开该工程,你会看到机器码文件还是 light.map 与 light.out,这时进行编译,编 译结束后,你会看到 light.map 与 light.out 变为 LCD.map 与 LCD.out。 新建工程时,我们建议采用第二种方式,这种方式比较简单,无需配置,不容易出错。 下面以控制小灯闪烁工程为例,介绍基于 IAR 环境的嵌入式工程文件组织方法。图 3-7 给出了该工程相关源文件的树型结构,可分为“工程配置文件” “源程序文件”“机器码 、 、 文件”三个部分。

49

<小灯工程> <工程配置文件夹> <链接文件文件夹> FLASH 链接文件 RAM 链接文件 <启动代码文件夹> 芯片启动汇编文件 芯片启动 C 语言文件 <源程序文件夹> <C 语言程序> <构件 C 文件夹> GPIO 构件源文件 GPIO 构件源文件 看门狗构源头文件 <框架 C 文件夹> 通用函数源文件 芯片初始化源文件 芯片初始化源文件 中断服务例程源文件 主程序源文件 <头文件文件夹> <构件头文件夹> GPIO 构件头文件 小灯构件头文件 串口构件头文件 看门狗构件头文件 <框架头文件夹> 通用函数头文件 存储器映像头文件 芯片初始化头文件 中断向量头文件 总头文件 <机器码文件夹> 机器码文件

图 3-8 工程相关源文件的树型结构 “工程配置文件” 中包含的文件与芯片及工程初始化相关, 包括链接文件与启动代码文 件。启动代码文件有“crt0.s”与“start.c” ,而且前面都有一个 ,展开后会看到好多文件, 这些都是与其相关联的文件。 “链接文件”定义了芯片存储器的分配和可执行代码地址空间 的分配,包括 Pflash.icf 与 Ram.icf 两个文件,通过修改它们可以将可执行代码链接到芯片 RAM 中或 Flash 中。 “源程序文件夹“包括 C 语言程序、头文件。其中 C 语言程序包括构件 C 文件夹” Component_C 框架 C 文件夹” “、 Frame_C 中断服务例程源文件 isr 与主程序源文件 main, “、 头文件包括构件头文件” Component_H 框架头文件夹” “、 Frame_H “与总头文件 includes.h。 系统启动并初始化后,程序根据 main.c 中定义的主循环顺序执行,当遇到中断请求时,转 而执行 isr.c 中定义的相应中断处理程序;中断处理结束,则返回中断处继续顺序执行。由 于 main.c 和 isr.c 文件反映了软件系统的整体执行流程,故而在工程文件组织时,将它与其 余 C 语言程序文件分开管理。 ”Component_C“与”Component_H“包含构件代码,每个构 件都对应一个.c 文件与.h 文件,例如 GPIO.c 与 GPIO.h 文件。以后的章节还会出现“串行
50

通信”“键盘”“LED”“液晶”等构件。与总体框架程序相关的头文件和源文件分别放在 、 、 、 了 Frame_H 和 Frame_C 文 件 夹 中 , 以 归 类 管 理 。 Frame_H 里 包 含 了 common.h 、 MK60N512VMD100.h、sysinit.h 与 vectors.h 四个头文件。MK60N512VMD100.h 是芯片寄存 器及相关位定义头文件,它被视为芯片的接口文件,没有这个文件,就不可能对该芯片进行 任何操作。sysinit.h 与 Frame_C 文件夹中的 sysinit.c 对应,它定义了系统初始化时的基本参 数,如系统时钟等,而 sysinit.c 文件则包含实际初始化代码。common.h 与 common.c 对应, 它提供常用且基本的软件功能性子函数。 “机器码文件”包括.out 文件与.map 文件,写到 Flash 中的文件为.out 文件,该文件在 IAR 下打不开,不过我们可以打开.srec 文件,它相当于 CodeWarrior 下的.s19 文件。

3.4.2 初始化相关文件
1.启动文件 crt0.s 与 start.c 由于芯片启动代码直接面对内核和硬件控制器进行编程, 一般都是用汇编语言实现。 在 芯片上电复位后,初始化 CPU 各寄存器,关闭中断等,需要用 ARM 的汇编语言编写启动 代码(crt0.s 文件) ,然后跳转到用户 C 程序(start.c) ,在这里复制中断向量与代码到 RAM 中,初始化芯片时钟,打开中断,然后跳转到 main 函数继续执行。在 ARM 设计开发中, 启动代码的编写是一个极重要的过程。启动代码随具体的目标系统和开发系统有所区别, MK60N512VMD100 芯片的启动流程见图 3-9 所示。 1)芯片上电 MK60N512VMD100 允许将中断向量放置在 Flash 或者 RAM 中,但是上电时刻中断向 量只能在地址 0x0000_0000 处。上电后,K60 首先从地址 0x0000_0000 处取栈地址,从地址 0x0000_0004 处取复位向量地址,然后跳转至复位向量地址处执行,代码在 vectors.h 处,如 下:
#define VECTOR_000 #define VECTOR_001 (pointer*)__BOOT_STACK_ADDRESS __startup // 0x0000_0004 1 // 初始化 SP 初始化 PC

2)crt0.s 文件 芯片上电后,转至 crt0.s 文件执行代码如下:
_startup MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV CPSIE i import start BL start ; 调用 start 51 r0,#0 r1,#0 r2,#0 r3,#0 r4,#0 r5,#0 r6,#0 r7,#0 r8,#0 r9,#0 r10,#0 r11,#0 r12,#0 ; 屏蔽中断 ; 初始化寄存器

复位向量中首先清零所有 CPU 通用寄存器,关闭总中断,然后调用 start,依次关闭看 门狗、复制中断向量表到 RAM 中、初始化芯片时钟、转到 main 函数继续执行。

芯片上电

读取SP和复位向量,跳 转至复位向量

初始化CPU寄存器,关 闭中断

关闭看门狗

复制中断向量和代码到 RAM中,初始化BSS段

初始化芯片时钟,打开 中断

跳转到main函数执行

图 3-9 MK60N512VMD100 芯片启动流程 3)start.c 文件 该文件的部分代码如下
void start(void) { //关闭看门狗 wdog_disable(); //复制中断向量表到 RAM 中 common_startup(); //系统设置 sysinit(); //进入主函数 main(); }

下面详细讲述下这部分代码。 (1)关闭看门狗 看门狗在嵌入式设计中特别重要, 它可以在芯片代码跑飞或死机的情况下复位芯片。 嵌 入式产品往往 24 小时全天候运行,为了保证程序一直运行正常必须在产品正式发布时使能 看门狗。而在程序调试阶段,为了保证程序执行流程,往往先关闭看门狗中断。 MK60N512VMD100 的看门狗控制寄存器是只写一次寄存器, 即上电后只能对其进行一次写
52

入, 如果想进行多次写入必须首先解锁看门狗。 看门狗解锁是向看门狗的解锁寄存器连续写 入 0xC520 和 0xD928, 两次写入不能超过 20 个时钟周期, 否则解锁失败并产生看门狗中断。 看门狗解锁后,通过配置看门狗控制寄存器的 WDOGEN 位来关闭看门狗。 如果程序在完成启动之后要使用看门狗, 首先要解锁看门狗然后设置 WDOGEN 位来使 能看门狗。看门狗使能以后,会在溢出时间超时后产生看门狗复位。程序中必须在溢出超时 前“喂狗”“喂狗”后看门狗模块重新计时,MK60N512VMD100 的“喂狗”是向看门狗刷 。 新寄存器连续写入 0xB480 和 0xA602。两次写入间隔不能超过 20 个时钟周期。源代码请见 样例程序中的 wdog.c 文件。 (2)复制中断向量表到 RAM 中 代码在 RAM 中执行的效率比在 Flash 中执行高。通常 ARM 芯片都会将中断向量表复 制到 RAM 中。未初始化的数据段(BSS)应该清零。其中涉及到几个 Link 文件中定义的变 量,包括:Flash 中断向量表地址 VECTOR_ROM,RAM 中断向量表地址 VECTOR_RAM。 这些变量定义在 Link 文件两个.icf 中。源代码请见样例程序中的 startup.c 文件、Pflash.icf 文件与 Ram.icf 文件。 (3)系统设置 芯片主时钟是利用 MCG 模块中的 PLL 模块, 通过倍频板上 50MHZ 的有源晶振得到的。 在 Kinetis 芯片内部存在 3 种不同时钟:内核时钟,总线时钟和 Flash 时钟。内核时钟是基 本时钟,其他时钟均从内核时钟分频得到。Kinetis 手册推荐了 3 种时钟配置方式,分别将 内核时钟配置为 50MHZ,96MHZ 和 100MHZ。源代码请见样例程序中的 sysinit.c 文件。 d)跳转至 main 函数执行 上述三步执行结束后,芯片已经进入了正常运行状态,可以执行 main 函数中用户定义 的代码了。代码中直接调用 main 函数即可。 到此为止,芯片开始执行用户功能代码,芯片启动阶段结束。 2.芯片相关文件 1)映像寄存器定义文件 MK60N512VMD100.h MK60N512VMD100.h 中定义了编程时需要访问的外设寄存器,该文件不修改。 2)系统初始化文件 sysinit.c 与 sysinit.h 系统初始化操作是由 sysinit.c 与 sysinit.h 来实现的,具体内容参见样例程序。 3.主程序、中断程序及其它文件 1)总头文件 includes.h 与主程序文件 main.c includes.h 文件包含主函数(main)文件用到的头文件、外部函数或变量引用、有关常 量和全局变量定义以及内部函数声明。而 main.c 文件是工程任务的核心文件,里面包含了 一个主循环,对具体事务过程的操作几乎都是添加在该主循环中。 2)中断文件 isr.h 与 isr.c isr.h 文件包含 isr.c 文件用到的头文件, 外部函数以及内部函数声明等,isr.c 文件执行具 体的操作,具体内容可参见带有中断的样例程序。 4.链接文件 Pflash.icf 文件与 Ram.icf 文件 链接文件定义了芯片存储器的分配和可执行代码地址空间的分配。 可以选择将可执行代 码链接到芯片 RAM 中或 Flash 中。具体内容可参见样例程序。 5.机器码文件 在编译链接过程中,IAR 会产生机器码文件.out 文件,这是写入到 Flash 中的文件,在 IAR 环境中打不开。如果在项目配置时选择在编译链接过程产生.srec 文件,那么在控制小 灯闪烁的工程中我们可以得到 GPIO.srec 文件, 这个文件可以打开, 内容以 S 记录格式表示。 S 记录格式是 Freescale 公司的十六进制目标代码文件,它将目标程序和数据以 ASCII 码格
53

式表示, 可直接显示和打印。 目标文件由若干行 S 记录构成, 每行 S 记录可以用 CR/LF/NUL 结尾。一行 S 记录由下列五部分组成,分别说明如下。 (1)类型 表示 S 记录的类型。有 8 种记录类型 S0、S1、S2、S3、S5、S7、S8、S9。这是为了满 足不同的编码、解码及传送方式的需求,表 3-1 给出了 S 记录的格式。 表 3-1 S 记录格式 类型 2 字节 记录长度 2 字节 地址 2、3 或 4 字节 编码/数据 0~n 字节 校验和 1 字节

S0—该记录包含 S19 文件的文件名信息。 S1—该记录包含代码/数据以及两个字节存储其代码/数据的存储器首地址。 S2—该记录包含要写到 Flash 的扩展地址处的代码/数据以及三个字节存储其代码/数据 的存储器首地址。 S3—该记录包含要写到 Flash 的扩展地址处的代码/数据以及四个字节存储其代码/数据 的存储器首地址。 S7—S3 记录的结束记录。 S8—S2 记录的结束记录。 S9—S1 记录的结束记录。 每个 S 记录块都使用唯一的终止记录。 (2)记录长度 表示该记录行中字符对的数目,不包括类型和记录长度。 (3)地址 它可以是 2 个字节、3 个字节或 4 个字节,取决于记录类型。S1 记录、S9 记录均是 2 个字节,S2 记录、S8 记录是 3 个字节,S3 记录、S7 记录是 4 个字节。它表示其后的代码/ 数据部分将要装入的存储器起始地址。 (4)代码/数据 就是实际的目标代码或数据, 这一部分将被下载到目标芯片的存储器并运行。 其字节数 是由“记录长度”域的实际数值减去地址长度和校验码长度的值而得到的。 (5)校验和 为 1 个字节,它是“记录长度”“地址”“代码/数据”三个部分所有字节之和的反码 、 、 的低 8 位,用于校验。 下面是 01_GPIO 工程中的 GPIO.srec 的部分内容。 S00C00006770696F2E7372656369? S3151FFF0000F8FF00201104FF1FD127FF1FD127FF1F56 ? S7051FFF291F94 第一行为 S0 记录,表示文件名信息。S0 之后的 0C 是十六进制数(十进制数 12) ,表 示后面有 12 个字节的数据;随后的"0000"是 2 字节地址,"0000"表示本行信息不是程序/数 据 , 不 需 要 装 入 存 储 空 间 ; 最 后 的 69 是 本 记 录 的 校 验 和 。 其 中 S3151FFF0000F8FF00201104FF1FD127FF1FD127FF1F56 的前两个符号 S3 表示这一行是 S3 记录,其后的“15”是十六进制数(十进制数的 21) ,表示在此行其后有 21 个字节的数据, 包括 4 个字节的地址 1FFF0000、16 个字节的代码/数据,最后字节 56 为校验和。该行记录 所 表 示的 实际 代码 / 数据 F8FF00201104FF1FD127FF1FD127FF1F 将 被 装入 起 始地 址为 1FFF0000 的 MCU 存储器中。
54

最后一行是 S7 记录,S7 之后的 05 是十六进制 0x05,表示其后有 5 个字节的/数据。 1FFF291F 为 4 个字节的地址,94 是校验和。

3.5 CW工程文件组织
CW 工程文件组织与 IAR 工程文件组织基本一样,但略有不同,下面简单阐述一下。

3.5.1 工程文件的组织
图 3-10 给出了用 I/O 口控制小灯闪烁工程的树形结构模板,该模板是苏州大学飞思卡 尔嵌入式系统实验室专门为 MK60N512VMD100 开发板设计的工程模板。读者在编程时可 以选择该模板。该模板方便易懂,与 CW 提供的 DEMO 工程模板相比,去掉了一些初学者 不易理解且不是必须的文件, 同时应用底层软件构件的概念改进了程序结构, 目的是一开始 就引导读者进行规范的文件组织与编程。 新建工程有两种方法, 一种是使用工程模板, 另一种是使用已存在的工程来建立另外一 个工程。 第一种方法的操作步骤如下: 选择 file->new->Bareboard Project,弹出 New Bareboard Project 对话框,然后根据芯片 型号来选择配置就创建了一个工程,详见“创建新工程的步骤.docx” 。 第二种方法是使用已存的工程来建立另一个工程。 当在已有工程的基础上, 做另一个项 目时,只需更改工程名即可。 新建工程时,我们建议采用第二种方式,这种方式比较简单,无需配置,不容易出错。 下面以控制小灯闪烁工程为例,介绍基于 CW 环境的嵌入式工程文件组织方法。图 3-9 给出了该工程相关源文件的树型结构, 可分为 “头文件路径” 、 “工程配置文件” 、 “输出文件” 、 “应用程序文件”4 大部分。 “头文件路径”为工程配置后自动生成的文件,不用改动。 “输出文件” ,包含.afx 和 S19 等格式的目标机器码。 “工程配置文件”包含与调试相关的配置文件,链接文件,启动代码文件。 “应用程序文件”包含通用函数,构件文件,主程序文件,中断服务例程文件等。

3.5.2 初始化相关文件
这部分与 IAR 环境基本一致,只是机器码文件稍有不同而已。在编译链接过程中,CW 会产生机器码文件.afx 文件,这是写入到 Flash 中的文件,在 CW 环境中打不开。如果在项 目配置时选择在编译链接过程产生.S19 文件,那么在控制小灯闪烁的工程中我们可以得到 Light.afx.S19 文件,这个文件可以打开,内容以 S 记录格式表示。

55

<工程文件夹> <头文件路径文件夹> <FLASH 输出文件夹> <RAM 输出文件夹> <工程配置文件夹> <调试相关文件夹> <链接文件文件夹> RAM 链接文件 FLASH 链接文件 <启动代码文件夹> 芯片启动汇编文件 芯片启动源文件 <源程序文件夹> <C 文件文件夹> <构件 C 文件夹> GPIO 构件源文件 小灯构件源文件 看门狗构件源头文件 <框架 C 文件夹> 通用函数源文件 芯片初始化源文件 中断向量源文件 中断服务例程源文件 主程序源文件 <头文件文件夹> <构件头文件夹> GPIO 构件头文件 小灯构件头文件 看门狗构件头文件 <框架头文件夹> 通用函数头文件 存储器映像头文件 芯片初始化头文件 中断向量头文件 总头文件 输出二进制文件 工程文件

图 3-10 工程相关源文件的树型结构

3.6 第一个应用实例:控制小灯闪烁
本书用 MK60N512VMD100 控制发光二极管指示灯的例子开始我们的程序之旅,程序 中使用了 GPIO 构件来编写指示灯程序。指示灯是最简单不过的硬件对象了,当灯两端引脚 上有足够高的正向压降时,它就会发光。在本书的工程实例中,灯的正端引脚接 MK60N512VMD100 的普通 I/O 口,负端引脚过电阻接地。当在 I/O 引脚上输出高或低电平 时,指示灯就会亮或暗。

56

3.6.1 GPIO 构件
GPIO 引脚可以被定义成输入、 输出两种情况。 若是输入, 程序需要获得引脚的状态 (逻 辑 1 或 0) 。若是输出,程序可以设置引脚状态(逻辑 1 或 0) 。MCU 的 GPIO 引脚分为许多 端口(Port) ,每个口有若干引脚。为了实现对所有 GPIO 引脚统一编程,设计了 GPIO 构件 (由 GPIO.h、GPIO.c 两个文件组成) 。这样,要使用 GPIO 构件,只需要将这两个文件加入 到所建工程中,方便了对 GPIO 的编程操作。实际上,若只是使用构件,只需看头文件中的 相关函数说明。

1.GPIO 构件的头文件 gpio.h
//-------------------------------------------------------------------------* // 文件名: gpio.h * // 说 明: gpio驱动头文件 * //-------------------------------------------------------------------------* #ifndef __GPIO_H__ #define __GPIO_H__ //1 头文件 #include "common.h" //2 宏定义 //2.1 端口宏定义 #define PORTA PTA_BASE_PTR #define PORTB PTB_BASE_PTR #define PORTC PTC_BASE_PTR #define PORTD PTD_BASE_PTR #define PORTE PTE_BASE_PTR //3 函数声明 //-------------------------------------------------------------------------* //函数名: gpio_init * //功 能: 初始化gpio * //参 数: port:端口名 * // index:指定端口引脚 * // dir:引脚方向,0=输入,1=输出 * // data:初始状态,0=低电平,1=高电平 * //返 回: 无 * //说 明: 无 * //-------------------------------------------------------------------------* void gpio_init (GPIO_MemMapPtr port, int index, int dir,int data); //-------------------------------------------------------------------------* //函数名: gpio_ctrl * //功 能: 设置引脚状态 * //参 数: port:端口名 * // index:指定端口引脚 * // data: 状态,0=低电平,1=高电平 * //返 回: 无 * //说 明: 无 * //-------------------------------------------------------------------------* void gpio_ctrl (GPIO_MemMapPtr port, int index, int data);

57

//-------------------------------------------------------------------------* //函数名: gpio_reverse * //功 能: 改变引脚状态 * //参 数: port:端口名; * // index:指定端口引脚 * //返 回: 无 * //说 明: 无 * //-------------------------------------------------------------------------* void gpio_reverse (GPIO_MemMapPtr port, int index); #endif

2.GPIO 构件的程序文件 gpio.c
//-------------------------------------------------------------------------* // 文件名: gpio.c * // 说 明: gpio驱动程序文件 * //-------------------------------------------------------------------------* #include "gpio.h" //包含gpio头文件

//-------------------------------------------------------------------------* //函数名: gpio_init * //功 能: 初始化gpio * //参 数: port:端口名 * // index:指定端口引脚 * // dir:引脚方向,0=输入,1=输出 * // data:初始状态,0=低电平,1=高电平 * //返 回: 无 * //说 明: 无 * //-------------------------------------------------------------------------* void gpio_init (GPIO_MemMapPtr port, int index, int dir,int data) { PORT_MemMapPtr p; switch((uint32)port) { case 0x400FF000u: p = PORTA_BASE_PTR; break; case 0x400FF040u: p = PORTB_BASE_PTR; break; case 0x400FF080u: p = PORTC_BASE_PTR; break; case 0x400FF0C0u: p = PORTD_BASE_PTR; break; case 0x400FF100u: p = PORTE_BASE_PTR; break; default: break; } PORT_PCR_REG(p,index)=(0|PORT_PCR_MUX(1));

58

if(dir == 1)//output { GPIO_PDDR_REG(port) |= (1<<index); if(data == 1)//output GPIO_PDOR_REG(port) |= (1<<index); else GPIO_PDOR_REG(port) &= ~(1<<index); } else GPIO_PDDR_REG(port) &= ~(1<<index); } //-------------------------------------------------------------------------* //函数名: gpio_ctrl * //功 能: 设置引脚状态 * //参 数: port:端口名 * // index:指定端口引脚 * // data: 状态,0=低电平,1=高电平 * //返 回: 无 * //说 明: 无 * //-------------------------------------------------------------------------* void gpio_ctrl (GPIO_MemMapPtr port, int index, int data) { if(data == 1)//output GPIO_PDOR_REG(port) |= (1<<index); else GPIO_PDOR_REG(port) &= ~(1<<index); } //-----------------------------------------------------------------------* //函数名: gpio_reverse * //功 能: 改变引脚状态 * //参 数: port:端口名; * // index:指定端口引脚 * //返 回: 无 * //说 明: 无 * //-----------------------------------------------------------------------* void gpio_reverse (GPIO_MemMapPtr port, int index) { GPIO_PDOR_REG(port) ^= (1<<index); }

3.6.2 Light 构件
控制指示灯的亮或暗,通过调用 GPIO 构件完成。设有两盏灯,分别为运行指示灯 1、 运行指示灯 2,分别叫做 Light_Run1、Light_Run2。它们所接在的 MCU 的 GPIO 口的名字 叫做 Light_Run_PORT。它们具体接在 MCU 的哪个端口,哪个引脚,只要在 light.h 中给出 具体宏定义就可以了。

1.Light 构件的头文件 light.h
//-------------------------------------------------------------------------* // 文件名: light.h * // 说 明: 指示灯驱动程序头文件 * //-------------------------------------------------------------------------*

59

#ifndef LIGHT_H_ #define LIGHT_H_ //1 头文件 #include "common.h" #include "gpio.h" //2 宏定义 //2.1 灯控制引脚定义 #define Light_Run_PORT PORTC #define Light_Run1 13 #define Light_Run2 14 //2.2 灯状态宏定义 #define Light_ON #define Light_OFF

//运行指示灯使用的端口 //运行指示灯使用的引脚 //运行指示灯使用的引脚

0 1

//灯亮(对应低电平) //灯暗(对应高电平)

//3 函 数 声 明 //-----------------------------------------------------------------------* //函数名: light_init * //功 能: 初始化指示灯状态 * //参 数: port:端口名 * // name:指定端口引脚号 * // state:初始状态,1=高电平,0=低电平 * //返 回: 无 * //说 明: 调用GPIO_Init函数 * //-----------------------------------------------------------------------* void light_init(GPIO_MemMapPtr port,int name,int state); //-----------------------------------------------------------------------* //函数名: Light_control * //功 能: 控制灯的亮和暗 * //参 数: port:端口名 * // name:指定端口引脚号 * // state:状态,1=高电平,0=低电平 * //返 回: 无 * //说 明: 调用GPIO_Set函数 * //-----------------------------------------------------------------------* void light_control(GPIO_MemMapPtr port,int name,int state); //-----------------------------------------------------------------------* //函数名: Light_change * //功 能: 状态切换:原来"暗",则变"亮";原来"亮",则变"暗" * //参 数: port:端口名 * // name:指定端口引脚号 * //返 回: 无 * // 说 明 : 调 用 GPIO_Get 、 GPIO_Set 函 数 //-----------------------------------------------------------------------* void light_change(GPIO_MemMapPtr port,int name); #endif

2.Light 构件的程序文件 light.c
//-------------------------------------------------------------------------* // 文件名: light.c * // 说 明: 小灯驱动函数文件 * //-------------------------------------------------------------------------* 60

#include "light.h"

//指示灯驱动程序头文件

//-------------------------------------------------------------------------* //函数名: light_init * //功 能: 初始化指示灯状态 * //参 数: port:端口名 * // name:指定端口引脚号 * // state:初始状态,1=高电平,0=低电平 * //返 回: 无 * //说 明: 调用gpio_init函数 * //-------------------------------------------------------------------------* void light_init(GPIO_MemMapPtr port,int name,int state) { gpio_init(port,name,1,state);//初始化指示灯 } //-------------------------------------------------------------------------* //函数名: light_control * //功 能: 控制灯的亮和暗 * //参 数: port:端口名 * // name:指定端口引脚号 * // state:状态,1=高电平,0=低电平 * //返 回: 无 * //说 明: 调用gpio_ctrl函数 * //-------------------------------------------------------------------------* void light_control(GPIO_MemMapPtr port,int name,int state) { gpio_ctrl(port,name,state); //控制引脚状态 } //-------------------------------------------------------------------------* //函数名: light_change * //功 能: 状态切换:原来"暗",则变"亮";原来"亮",则变"暗" * //参 数: port:端口名 * // name:指定端口引脚号 * //返 回: 无 * //说 明: 调用gpio_reverse函数 * //-------------------------------------------------------------------------* void light_change(GPIO_MemMapPtr port,int name) { gpio_reverse(port,name); }

3.6.3 Light 测试工程主程序
在 includes.h 文件中需要包含 GPIO.h, 这样在该工程中就可以调用 GPIO 构件的接口函 数。首先调用 gpio_init 函数,初始化所需的每一盏指示灯。随后,通过 gpio_reverse 函数将 引脚电平取反,就能够在程序运行时,较明显的看到指示灯闪烁的现象。代码如下:
//-------------------------------------------------------------------------* // 工 程 名: light * // 硬件连接: 将K60核心板与扩展板连接 * // 程序描述: 用GPIO编程控制小灯闪烁 * // 目 的: 第一个Freescale K60系列MCU C语言程序框架 * // 说 明: 提供Freescale MCU的编程框架,供教学入门使用 * //---------------苏州大学飞思卡尔嵌入式系统实验室2011年--------------------* 61

//头文件 #include "includes.h" //全局变量声明 //主函数 void main(void) { //1 主程序使用的变量定义 uint32 runcount; //2 关中断 DisableInterrupts;

//运行计数器

//禁止总中断

//3 模块初始化 light_init(Light_Run_PORT,Light_Run1,Light_OFF); //指示灯初始化 light_init(Light_Run_PORT,Light_Run2,Light_ON); //指示灯初始化 //4 开中断 //主循环 while(1) { //1 主循环计数到一定的值,使小灯的亮、暗状态切换 runcount++; if(runcount>=5000000) { light_change(Light_Run_PORT,Light_Run1);//指示灯的亮、暗状态切换 light_change(Light_Run_PORT,Light_Run2);//指示灯的亮、暗状态切换 runcount=0; } } }

3.7 理解第一个C工程的执行过程
当 MK60N512VMD100 芯片上电复位后或热复位后,系统程序的执行流程如下:从复 位向量处取出程序执行的首地址,跳转并按地址执行;执行 crt0.s 文件中的__startup,复位 所有的通用寄存器,关闭总中断,然后调用 start.c 文件,进行系统初始化,最终跳转到 main 主函数入口继续执行;这部分在“3.4.2 初始化相关文件”的第一部分“1.启动文件 crt0.s 与 start.c”已经讲述,这里不再赘述。

62

第4章 异步串行通信
目前几乎所有的台式电脑都带有 9 芯的异步串行通信口,简称串行口或 COM 口。由于 历史的原因, 通常所说的串行通信就是指异步串行通信。 USB、 以太网等也用串行方式通信, 但与这里所说的异步串行通信物理机制不同。 有的台式电脑带有两个串行口:COM1、COM2 口,部分笔记本电脑也带有串行口。随 着 USB 接口的普及,串行口的地位逐渐降低,但是作为设备间简便的通信方式,在相当长 的时间内,串行口还不会消失,在市场上也可很容易的购买到 USB 到串行口的转接器。因 为简单且常用的串行通信只需要三根线(发送线、接收线和地线) ,所以串行通信仍然是 MCU 与外界通信的简便方式之一。 实现异步串行通信功能的模块在一部分 MCU 中被称为通用异步收发器(Universal Asynchronous Receiver/Transmitters, UART) 在另一些 MCU 中被称为串行通信接口 , (Serial Communication Interface,SCI) 。串行通信接口可以将终端或个人计算机连接到 MCU,也可 将几个分散的 MCU 连接成通信网络。 本章主要介绍 MK60N512VMD100 的 UART 模块的工作原理以及编程实例,这些编程 实例都使用了基于构件的编程思想, 读者在阅读时可以仔细体会, 以求得对编程方法更深刻 的理解。 下文所出现的 UART 字眼, 在没有其他说明的情况下, 都是特指 MK60N512VMD100 的 UART 模块。

4.1 异步串行通信的基础知识
本节简要概括了串行通信中常用的基本概念,为学习 MCU 的串行接口编程做准备。对 于已经了解这方面知识的读者,可以略读本节。

4.1.1 基本概念
“位” (bit)是单个二进制数字的简称,是可以拥有两种状态的最小二进制值,分别用 “0”和“1”表示。在计算机中,通常一个信息单位用 8 位二进制表示,称为一个“字节” (Byte) 。串行通信的特点是:数据以字节为单位,按位的顺序(例如最高位优先)从一条 传输线上发送出去。这里至少涉及到以下几个问题:第一,每个字节之间是如何区分开的? 第二,发送一位的持续时间是多少?第三,怎样知道传输是正确的?第四,可以传输多远? 这些问题属于串行通信的基本概念。 串行通信分为异步通信与同步通信两种方式, 本节主要 给出异步串行通信的一些常用概念。正确理解这些概念,对串行通信编程是有益的。

1.异步串行通信的格式
在 MCU 的英文芯片手册上,通常说的异步串行通信采用的是 NRZ 数据格式,英文全 称是: “standard non-return-zero mark/space data format” ,可以译为: “标准不归零传号/空号 数据格式” 。这是一个通信术语, “不归零”的最初含义是:用负电平表示一种二进制值,正 电平表示另一种二进制值,不使用零电平。 “mark/space”即“传号/空号”分别是表示两种 状态的物理名称,逻辑名称记为“1/0” 。对学习嵌入式应用的读者而言,只要理解这种格式 只有“1”“0”两种逻辑值就可以了。图 4-1 给出了 8 位数据、无校验情况的传送格式。 、

63

开始位

第0位

第1位

第2位

第3位

第4位

第5位

第6位

第7位

停止位

图 4-1 串行通信数据格式 这种格式的空闲状态为“1” ,发送器通过发送一个“0”表示一个字节传输的开始,随 后是数据位(在 MCU 中一般是 8 位或 9 位,可以包含校验位) 。最后,发送器发送 1 到 2 位的停止位,表示一个字节传送结束。若继续发送下一字节,则重新发送开始位,开始一个 新的字节传送。若不发送新的字节,则维持“1”的状态,使发送数据线处于空闲。从开始 位到停止位结束的时间间隔称为一帧(frame)。所以,也称这种格式为帧格式。 每发送一个字节,都要发送“开始位”与“停止位” ,这是影响异步串行通信传送速度 的因素之一。同时因为每发送一个字节,必须首先发送“开始位” ,所以称之为“异步” (Asynchronous)通信。

2.串行通信的波特率
位长(Bit Length) ,也称为位的持续时间(Bit Duration) 。其倒数就是单位时间内传送 的位数。人们把每秒内传送的位数叫做波特率(Baud Rate) 。波特率的单位是:位/秒,记为 bps。bps 是英文 bit per second 的缩写,习惯上这个缩写不用大写,而用小写。通常情况下, 波特率的单位可以省略。 通常使用的波特率有 600、 900、 1200、 1800、 2400、 4800、 9600、 19200、 38400、 57600、 115200 等。在包含开始位与停止位的情况下,发送一个字节需 10 位,很容易计算出,在各 波特率下, 发送 1K 字节所需的时间。 显然, 这个速度相对于目前许多通信方式而言是慢的, 那么,异步串行通信的速度能否提得很高呢?答案是不能。因为随着波特率的提高,位长变 小, 以致于很容易受到电磁源的干扰, 通信就不可靠了。 当然, 还有通信距离问题, 距离小, 可以适当提高波特率,但这样毕竟提高的幅度非常有限,达不到大幅度提高的目的。

3.奇偶校验
在异步串行通信中, 如何知道传输是正确的?最常见的方法是增加一个位 (奇偶校验位) , 供错误检测使用。 字符奇偶校验检查 (Character Parity Checking) 称为垂直冗余检查 (Vertical Redundancy Checking,VRC) ,它是为每个字符增加一个额外位使字符中“1”的个数为奇 数或偶数。奇数或偶数依据使用的是“奇校验检查”还是“偶校验检查”而定。当使用“奇 校验检查”时,如果字符数据位中“1”的数目是偶数,校验位应为“1” ,如果“1”的数目 是奇数,校验位应为“0” 。当使用“偶校验检查”时,如果字符数据位中“1”的数目是偶 数,则校验位应为“0” ,如果是奇数则为“1” 。 这里列举奇偶校验检查的一个实例,看看 ASCII 字符“R” ,其位构成是 1010010。由于 字符“R”中有 3 个位为“1” ,若使用奇校验检查,则校验位为 0;如果使用偶校验检查, 则校验位为 1。 在传输过程中,若有 1 位(或奇数个数据位)发生错误,使用奇偶校验检查,可以知道 发生传输错误。若有 2 位(或偶数个数据位)发生错误,使用奇偶校验检查,就不能知道已 经发生了传输错误。但是奇偶校验检查方法简单,使用方便,发生 1 位错误的概率远大于 2 位的概率,所以“奇偶校验”这种方法还是最为常用的校验方法。几乎所有 MCU 的串行异 步通信接口,都提供这种功能。

64

4.串行通信的传输方式
在串行通信中,经常用到“单工”“双工”“半双工”等术语。它们是串行通信的不同 、 、 传输方式。下面简要介绍这些术语的基本含义。 (1)单工(Simplex) :数据传送是单向的,一端为发送端,另一端为接收端。这种传 输方式中,除了地线之外,只要一根数据线就可以了。有线广播就是单工的。 (2)全双工(Full-duplex) :数据传送是双向的,且可以同时接收与发送数据。这种传 输方式中,除了地线之外,需要两根数据线,站在任何一端的角度看,一根为发送线,另一 根为接收线。一般情况下,MCU 的异步串行通信接口均是全双工的。 (3)半双工(Half-duplex) :数据传送也是双向的,但是在这种传输方式中,除地线之 外,一般只有一根数据线。任何时刻,只能由一方发送数据,另一方接收数据,不能同时收 发。

4.1.2 RS-232C 总线标准
现在回答“可以传输多远”这个问题。MCU 引脚输入/输出一般使用 TTL(Transistor Transistor Logic)电平,即晶体管-晶体管逻辑电平。而 TTL 电平的“1”和“0”的特征电 压分别为 2.4V 和 0.4V(目前使用 3V 供电的 MCU 中,该特征值有所变动) ,即大于 2.4V 则识别为“1” ,小于 0.4V 则识别为“0” 。它适用于板内数据传输。若用 TTL 电平将数据传 输到 5m 之外,那么可靠性就很值得考究了。为使信号传输得更远,美国电子工业协会 EIA (Electronic Industry Association) 制订了串行物理接口标准 RS-232C。 RS-232C 采用负逻辑, -15V~-3V 为逻辑“1” ,+3V~+15V 为逻辑“0” 。RS-232C 最大的传输距离是 30m,通信 速率一般低于 20Kbps。当然,在实际应用中,也有人用降低通信速率的方法,通过 RS-232 电平,将数据传送到 300m 之外,这是很少见的,且稳定性很不好。 RS-232C 总线标准最初是为远程数据通信制订的, 但目前主要用于几米到几十米范围内 的近距离通信。有专门的书籍介绍这个标准,但对于一般的读者,不需要掌握 RS-232C 标 准的全部内容, 只要了解本节介绍的这些基本知识就可以使用 RS-232。 目前一般的 PC 机均 带有 1 到 2 个串行通信接口,人们也称之为 RS-232 接口,简称“串口” ,它主要用于连接 具有同样接口的室内设备。早期的标准串行通信接口是 25 芯插头,这是 RS-232C 规定的标 准连接器(其中:2 条地线,4 条数据线,11 条控制线,3 条定时信号,其余 5 条线备用或 未定义) 。 后来,人们发现在计算机的串行通信中,25 芯线中的大部分并不使用,逐渐改为使用 9 芯串行接口。一段时间内,市场上还有 25 芯与 9 芯的转接头,方便了两种不同类型之间的 转换。后来,使用 25 芯串行插头极少见到,25 芯与 9 芯转接头也极少有售。因此,目前几乎所有计算机上 9 6 7 8 的串行口都是 9 芯接口。 4-2 给出了 9 芯串行接口的 图 1 5 4 2 3 排列位置,相应引脚含义见表 4-1。 嵌 在 RS-232 通信中, 常常使用精简的 RS-232 通信, 图 4-2 9 芯串行接口排列 通信时仅使用 3 根线: (接收线) TXD RXD 、 (发送线) 和 GND(地线) 。其他为进行远程传输时接调制解调器之用,有的也可作为硬件握手信号, 初学时可以忽略这些信号的含义。 表 4-1 9 芯串行接口引脚含义表
引脚号 1 功 能 接收线信号检测(载波检测DCD) 引脚号 6 65 功 能 数据通信设备准备就绪(DSR)

2 3 4 5

接收数据线(RXD) 发送数据线(TXD) 数据终端准备就绪(DTR) 信号地(SG)

7 8 9

请求发送(RTS) 允许发送(CTS) 振铃指示

4.1.3 电平转换电路原理
在 MCU 中, 若用 RS-232C 总线进行串行通信, 则需外接电路实现电平转换。 在发送端, 需要用驱动电路将 TTL 电平转换成 RS-232C 电平;在接收端,需要用接收电路将 RS-232C 电平转换为 TTL 电平。电平转换器不仅可以由晶体管分立元件构成,也可以直接使用集成 电路。目前使用 MAX232 芯片较多,该芯片使用单一+5V 电源供电实现电平转换。图 4-3 给出了 MAX232 的引脚说明。 引脚含义简要说明如下: Vcc(16 脚) :正电源端,一般接+5V GND(15 脚) :地 VS+(2 脚) :VS+=2Vcc-1.5V=8.5V VS-(6 脚) :VS-=-2Vcc-1.5V=-11.5V C2+、C2-(4、5 脚) :一般接 1? 的电解电容 F C1+、C1-(1、3 脚) :一般接 1? 的电解电容 F 输入输出引脚分两组, 基本含义见表 4-2。 在实际使用时, 若只需要一路串行通信接口, 可以使用其中的任何一组。利用 MAX232 将 TTL 电平转换为 RS-232 电平的电路接法稍后 结合串行通信接口的外围硬件电路讨论。 焊接到 PCB 板上的 MAX232 芯片检测方法: 正常情况下,1) ( T1IN=5V, T1OUT=-9V; 则 T1IN=0V,则 T1OUT=9V。 (2)将 R1IN 与 T1OUT 相连,令 T1IN=5V,则 R1OUT=5V;令 T1IN=0V,则 R1OUT=0V。 所有型号 MCU 的串行通信接口,都具有发送引脚 TxD、接收引脚 RxD,它们是 TTL 电平引脚。要利用这两个引脚与外界实现异步串行通信,还必须将 TTL 电平转为 RS-232 电 平, 这可利用上节介绍的 MAX232 来完成。 本节从通用角度讨论串行通信接口的电路设计、 基本编程结构与编程原理,为实际编程做准备。 表 4-2 MAX232 芯片输入输出引脚分类与基本接法
组别 1 2 TTL电平引脚 11 12 10 9 方向 输入 输出 输入 输出 典型接口 232电平引脚 接MCU的TXD 13 接MCU的RXD 14 接MCU的TXD 8 接MCU的RXD 7 方向 输入 输出 输入 输出 典型接口 接到9芯接口的2脚RXD 接到9芯接口的3脚TXD 接到9芯接口的2脚RXD 接到9芯接口的3脚TXD

66

232 电平

TTL 电平

T1IN R1IN R1OUT T1OUT

相关文章:
中文用户手册(WORD)K10-60S 通讯模块RS232C99
K60芯片IAR及CW例程和开... 119页 1下载券 KinetisK10系列产品概述 44页 1下载...(块校验特性) * 大字符: 读/写/监视不用BCC * 小字符: 读/写/监视用BC...
K60快速使用手册
K60芯片IAR及CW例程和开... 119页 1下载券 Kinetis实战开发——IAR... 25页...K60 核心开发板 快速使用说明 1、K60 连接方式: K 60 的 JTAG 的 10pin ...
K60快速使用手册
K60(客户资料)\开发软件 这个文件夹下有相关的开发软件,一般推荐 IAR 开发软件...将程序烧写到 FLASh 上,使用 RAM 的方式 仿真程序是为了避免频繁烧写芯片的 ...
K60 IAR配置文件
K60 Flash 的配置: IAR 环境的编译文件 $PROJ_DIR$\..\..\src\app $PROJ...K60在IAR下使用教程 12页 1下载券 K60芯片IAR及CW例程和开... 119页 免费...
Kinetis60——用IAR创建工程
——用IAR创建工程在IAR开发环境中可以使用两种方法...app_k60.ewp只是user_app.eww中的一个适用于K60...cw_crt0.s”文件以外: 此文件是CodeWarrior中用到...
IAR的破解、K60项目的设置
IAR集成开发环境如何设置... 2页 免费 STM8 FOR IAR 安装教程 ... 8页 ...IAR-ARM 7.5安装与破解 18页 免费 K60芯片IAR及CW例程和开... 119页 免费...
IAR基本使用及其构造
MK60N512VMD100.h 是芯片寄存器及相关位定义头文件,它被视为芯片的接口文件,...IAR/arm/bin/armjlink.dll 找不到指定程序的问题解决方案: 需要替换 IAR/arm...
基于飞思卡尔k60芯片控制下的智能汽车 皇甫_图文
组委会允许下的32位微控 制器k60作为核心控制器,在IAR开发环境中进行软件开发。...在计算及程序编写上都比较简单, 也可以实现控制赛车行驶的目标,但是由于规则制定...
IAR中cortex-m4启动流程分析
软件环境:windows7 旗舰版,IAR V6105(EWARM-EV-WEB-6105) ARM 芯片:飞思卡尔 K60N512VMD100 (cortex-m4 核心) 示例程序:飞思卡尔官方的 KINETIS512_SC ===...
K60实验
K60 实验 一、CW 快速入门:安装 CW 软件→安装 ...LED 流水灯实验 1.1 实验目的 熟悉 IAR 的编译...四个灯全部熄灭 1.3 程序修改 首先,在 led.c ...
更多相关标签:
野火k60例程 | k60官方例程 | k60外部中断例程 | k60例程 | k60 oled显示例程用法 | k60官方例程下载 | k60 spi 例程 | iar for k60 |