基于 32 位 ColdFire 构建嵌入式系统
王宜怀 陈建明 蒋银珍 著
电子工业出版社
内容简介
本书以飞思卡尔半导体公司(原摩托罗拉半导体部)的 32 位 ColdFire 系列微控制器 中带以太网接口的 MCF52233、带 CAN 总线接口 MCF52235、带 USB2.0 接口 MCF52223 三个型号为蓝本阐述嵌入式系统的软件与硬件设计。全书共 16 章,其中第 1 章为概述,
阐述嵌入式系统的知识体系、学习误区、学习建议。2-3 章概述 ColdFire 系列微处理器特 点,给出 MCF52233 的引脚功能与硬件最小系统电路,给出第一个样例程序及 ColdFire 工程组织,完成第一个 ColdFire 工程的入门。4-10 章分别给出 UART、键盘、LED 与 LCD、
AD、定时器、QSPI、I2C 与 Flash 存储器在线编程等。11-15 分别给出 MCF52235 的 CAN 总线、基于 MCF52233 嵌入式以太网、MCF52233 的其他模块、 MCF52223 的 USB 2.0 编程、µC/OS-Ⅱ在 ColdFire 上的移植与应用,第 16 章给出基于硬件构件的嵌入式系统开 发方法。
附录含有有关实践资料索引。本书配有光盘,包含了书中提供的所有实例源程序、辅 助资料、相关芯片资料及常用软件工具。
本书可供大学有关专业的高年级学生和研究生用作教材或参考读物,也可供嵌入式系 统开发与研究人员用作参考和进修资料。
前 言
嵌入式计算机系统简称嵌入式系统,其概念最初源于传统测控系统对计算机的需求。
随着以微处理器(MPU)为内核的微控制器(MCU)制造技术的不断进步,计算机领域 在通用计算机系统与嵌入式计算机系统这两大分支分别得以发展。通用计算机已经在科学 计算、事物管理、通信、日常生活等各个领域产生重要影响。在后 PC 时代, 嵌入式系 统的广阔应用将是计算机发展的重要特征。一般来说,嵌入式系统的应用范围可以粗略分 为两大类:一类是电子系统的智能化(工业控制、现代农业、家用电器、汽车电子、测控 系统、数据采集等);另一类是计算机应用的延伸(MP4、手机、通信、网络、计算机外 围设备等)。不论如何分类,嵌入式系统的技术基础是不变的,即要完成一个以 MCU 为 核心的嵌入式系统应用产品设计,需要有硬件、软件及行业领域相关知识。但是,随着嵌 入式系统中软件规模日益增大,对嵌入式底层驱动软件的封装提出了更高的要求,可复用 性与可移植性受到特别关注,嵌入式软件构件化开发方法逐步被业界所重视。本书以嵌入 式硬件构件与底层软件构件设计为主线,按照嵌入式软件工程的要求,以飞思卡尔半导体 公司的 32 位 ColdFire 系列微控制器中带以太网接口的 MCF52233、带 CAN 总线接口的 MCF52235、带 USB2.0 接口的 MCF52223 三个型号为蓝本,按照“通用知识—芯片编程 结构概要—基本编程方法—底层驱动构件封装—应用方法与举例”的线条,逐步阐述电子 系统智能化嵌入式应用的软件与硬件设计。
关于飞思卡尔 ColdFire 系列微控制器:
飞思卡尔半导体是全球最大半导体公司之一,在微控制器领域长期居全球市场领先地 位,以高可靠性获得业界一致赞誉。该公司的微控制器产品系列齐全,由不同位数(8 位、
16 位、32 位等),不同封装形式(DIP、SOIC、QFP 等),不同温度范围,所含模块不同 等构成了庞大的飞思卡尔微控制器产品系列,广泛应用于汽车电子、消费电子、工业控制、
网络和无线市场等嵌入式系统各个领域。该公司每年的研发投入超过 12 亿美元。飞思卡 尔公司的 ColdFire 系列单芯片微控制器解决方案主要面向工业/家庭自动化、远程数据采 集与控制、医疗仪表、照明控制节点、以太网应用、USB 应用、ZigBeeTM 控制节点等领 域。该公司自 2006 年开始提供 32 微控制器 MCF5223x、MCF5222x 部分样片以来,已经 逐步形成了不同的功能、价格、集成度和调试能力的 32 位单芯片嵌入式应用的解决方案,
使得用户可以各取所需。也就是说,面向电子系统智能化嵌入式应用的设计,无论需要怎 样的系统功能和集成度,总能从 ColdFire 庞大产品系列中选取一款合适的芯片进行应用开 发。这正是嵌入式系统产品设计者所期望的。本书是第一本以完整实例方式阐述飞思卡尔 MCF5223x 与 MCF5222x 应用设计的著作。
本书特点:
(1)把握通用知识与芯片相关知识之间的平衡。书中对于嵌入式“通用知识”的基
本原理,以应用为立足点,进行语言简洁、逻辑清晰的阐述,同时注意与芯片相关知识之 间的衔接,使读者在更好地理解基本原理的基础上,理解芯片应用的设计,同时反过来,
加深对通用知识的理解。
(2)把握硬件与软件的关系。嵌入式系统是软件与硬件的综合体,嵌入式系统设计 是一个软件、硬件协同设计的工程,不能像通用计算机那样,软件、硬件完全分开来看。
特别是对电子系统智能化嵌入式应用来说,没有对硬件的理解就不可能写好嵌入式软件,
同样没有对软件的理解也不可能设计好嵌入式硬件。因此,本书注重把握硬件知识与软件 知识之间的关系。
(3)对底层驱动进行构件化封装。书中对每个模块均给出根据嵌入式软件工程基本 原则并按照构件化封装要求编制底层驱动程序,同时给出详细规范的注释及对外接口,为 实际应用提供底层构件,方便移植与复用,可以为读者进行实际项目开发节省大量时间。
(4)设计合理的测试用例。书中所有源程序均经测试通过,并保留测试用例在随书 所附的网上光盘中,避免了因例程的书写或固有错误给读者带来烦恼。这些测试用例,也 为读者验证与理解带来方便。
(5)网上光盘提供了所有模块完整的底层驱动构件化封装程序、文档与测试用例,
同时网上光盘中还包含芯片参考手册、写入器安装与使用方法、工具软件(开发环境、程 序写入与读出软件、串口调试工具、USB 工具、以太网工具)、有关硬件原理图及其他技 术资料。
(6)提供硬件评估板、写入调试器,并给出单独进行程序写入与读出的软件工具,
方便读者进行实践与应用。
主要内容:
全书共 16 章,其中第 1 章为概述,阐述嵌入式系统的知识体系、学习误区、学习建 议。2-3 章概述 ColdFire 系列微处理器特点,给出 MCF52233 的引脚功能与硬件最小系统 电路,给出第一个样例程序及 ColdFire 工程组织,完成第一个 ColdFire 工程的入门。4-10 章分别给出 UART、键盘、LED 与 LCD、AD、定时器、QSPI、I2C 与 Flash 存储器在线 编程等。11-15 分别给出 MCF52235 的 CAN 总线、基于 MCF52233 嵌入式以太网、
MCF52233 的其他模块、 MCF52223 的 USB 2.0 编程、µC/OS-Ⅱ在 ColdFire 上的移植与 应用,第 16 章给出基于硬件构件的嵌入式系统开发方法。附录 A 给出了本书使用的 ColdFire 系列 MCU 芯片封装;附录给出了写入器、评估板及购买方法;附录 C 给出了常 见实践问题解答。
本书网上光盘下载地址:
为方便读者,本书网上光盘可从下列地址之一进行下载,给出多个地址的目的是防止 从某一地址下载不成功。作者可能每半年对下载内容进行更新,敬请读者关注。
电子工业出版社:http:www.phei.com.cn;苏州大学飞思卡尔嵌入式系统研发中心:
http://sumcu.suda.edu.cn;苏州苏大万佳技术有限公司:http://sueee.com.cn;昆山鑫盛盟创
科技有限公司:http://www.xsmc.net;上海卓嘉电子有限公司:http://www.can-lin.com。
致谢:
本书除封面署名作者外,还有苏州大学计算机科学与技术学院嵌入式应用方向研究生 王玉丽、屯娜、姚键东、王凤林、钱仇圣、舒胜强、钟海林等协助书稿整理及程序调试工 作,他们卓有成效的工作,使本书更加实用。飞思卡尔半导体有限公司的 Andy Mastronardi 先生、马莉女士一直关心支持苏州大学飞思卡尔嵌入式系统研发中心的建设,为本书的撰 写提供了硬件及软件资料,并提出了许多宝贵建议。飞思卡尔半导体有限公司的许多技术 人员提供了技术支持。电子工业出版社的田宏峰先生为本书的出版付出了大量细致工作。
在此一并表示诚挚的谢意。
鉴于作者水平有限,书中难免存在不足和错误之处,恳望读者提出宝贵意见和建议,
以便再版时改进。
作 者
2009 年 7 月于苏州大学
I
目 录
第1章 概述 ... 1
1.1 嵌入式系统定义、由来及特点 ... 1
1.1.1 嵌入式系统的定义 ... 1
1.1.2 嵌入式系统的由来及其与微控制器的关系 ... 1
1.1.3 嵌入式系统的特点 ... 3
1.2 嵌入式系统的知识体系、学习误区及学习建议... 4
1.2.1 嵌入式系统的知识体系 ... 4
1.2.2 嵌入式系统的学习误区 ... 5
1.2.3 基础阶段的学习建议 ... 8
1.3 嵌入式系统常用术语 ... 9
1.3.1 与硬件相关的术语 ... 9
1.3.2 与通信相关的术语 ... 10
1.3.3 与功能模块及软件相关的术语 ... 11
1.4 嵌入式系统常用的标准 C 语言基本语法概要 ... 12
1.5 本书学习与实践资料索引 ... 22
第2章 COLDFIRE概述与MCF52233硬件最小系统 ... 24
2.1 ColdFire 系列微处理器概述 ... 24
2.2 MCF5223x 系列微控制器存储器映像与编程结构 ... 25
2.2.1 MCF5223x 性能概述与内部结构简图 ... 26
2.2.2 MCF5223x 存储器映像 ... 27
2.2.3 编程模式与寻址方式 ... 28
2.2.4 ColdFire 异常和中断控制 ... 32
2.3 MCF52233 的引脚功能与硬件最小系统 ... 33
2.3.1 MCF52233 的引脚功能 ... 33
2.3.2 MCF52233 的硬件最小系统 ... 35
2.3.3 硬件最小系统测试方法 ... 39
第3章 第一个样例程序及COLDFIRE工程组织 ... 41
3.1 通用 I/O 接口基本概念及连接方法 ... 41
3.2 MCF52233 的 GPIO... 42
3.2.1 MCF52233 GPIO 编程的基本原理 ... 42
3.2.2 GPIO 模块寄存器与 GPIO 的编程基本方法 ... 43
3.3 开发套件 CodeWarrior 开发环境与 ColdFire 写入器 ... 46
目录
II
3.3.1 CodeWarrior 开发环境简介与基本使用方法 ... 46
3.3.2 WA-Ⅰ型 32 位 ColdFire 写入器 ... 47
3.3.3 MCF52233EVB 硬件评估板 ... 48
3.4 CW 工程文件组织 ... 48
3.4.1 工程文件的组织 ... 48
3.4.2 初始化相关文件 ... 51
3.4.3 主程序、中断程序及其他文件 ... 54
3.4.4 链接文件及机器码文件 ... 56
3.5 第一个应用实例:控制小灯闪烁 ... 60
3.5.1 GPIO 构件 ... 60
3.5.2 Light 构件 ... 64
3.5.3 Light 测试工程主程序 ... 66
3.6 理解第一个 C 工程的执行过程 ... 67
第4章 异步串行通信与直接存储器访问DMA ... 70
4.1 异步串行通信的基础知识 ... 70
4.1.1 基本概念 ... 70
4.1.2 RS-232C 总线标准 ... 72
4.1.3 电平转换电路原理 ... 73
4.2 MCF52233 的 UART 模块的物理结构 ... 74
4.3 MCF52233 的 UART 模块的编程结构 ... 78
4.4 基于构件方法的 UART 编程 ... 81
4.4.1 UART 构件的函数原型设计 ... 81
4.4.2 UART 构件的头文件 ... 81
4.4.3 UART 构件的源程序文件 ... 84
4.4.4 UART 构件的测试工程 ... 88
4.5 ColdFire 第一个带有中断功能的实例 ... 90
4.6 MCF52233 的四通道 DMA 控制器 ... 92
4.6.1 DMA 概述 ... 92
4.6.2 MCF52233 四通道 DMA 特点 ... 93
4.6.3 MCF52233 的 DMA 控制器编程结构 ... 93
4.7 MCF52233 的 DMA 编程要点 ... 96
4.7.1 DMA 初始化 ... 97
4.7.2 DMA 启动序列与重启序列 ... 97
4.8 基于构件的带 DMA 的 UART 编程实例... 98
4.8.1 DMA 构件的函数原型设计 ... 98
4.8.2 DMA 构件的头文件 ... 98
4.8.3 DMA 构件的源程序文件 ... 101
III
4.8.4 DMA 方式收发测试实例 ... 105
4.9 进一步讨论 ... 106
4.9.1 流控制与 Break 信号 ... 106
4.9.2 延长串口通信的距离 ... 107
4.9.3 串口的扩展 ... 107
第5章 GPIO的应用实例--键盘、LED与LCD ... 109
5.1 键盘 ... 109
5.1.1 键盘模型及接口 ... 109
5.1.2 键盘编程的基本问题 ... 110
5.1.3 键盘编程实例 ... 110
5.2 数码管 LED ... 116
5.2.1 扫描法编程原理 ... 117
5.2.2 数码管编程实例 ... 118
5.3 液晶 LCD ... 121
5.3.1 HD44780 的编程结构 ... 121
5.3.2 点阵字符型 LCD 编程实例 ... 122
第6章 MCF52233的AD转换模块 ... 129
6.1 AD 转换的基本问题 ... 129
6.2 MCF52233 的 AD 转换结构与特性 ... 130
6.3 MCF52233 的 AD 模块编程寄存器 ... 131
6.4 基于构件的 AD 编程... 140
6.4.1 AD 构件的函数原型设计 ... 140
6.4.2 AD 构件的头文件 ... 140
6.4.3 AD 构件的源程序文件 ... 141
6.5 MCF52233 AD 模块编程实例——物理量采集回归系统 ... 144
6.5.1 低端软件设计 ... 144
6.5.2 高端软件设计 ... 146
6.6 常用传感器简介及一个典型信号采样电路设计... 147
6.6.1 常用传感器简介 ... 147
6.6.2 电阻型传感器采样电路设计 ... 149
第7章 定时器相关模块及其应用 ... 151
7.1 可编程中断定时器 PIT ... 151
7.1.1 PIT 模块的编程寄存器 ... 151
7.1.2 PIT 模块的运行模式与编程方法 ... 152
7.1.3 PIT 模块的编程实例 ... 153
目录
IV
7.2 通用定时器 GPT 模块 ... 155
7.2.1 计数器/定时器的基本工作原理 ... 155
7.2.2 定时器模块的定时计数功能 ... 157
7.2.3 定时器模块的输入捕捉功能 ... 160
7.2.4 定时器模块的输出比较功能 ... 164
7.2.5 定时器模块的脉冲累加功能 ... 168
7.3 脉宽调制模块 PWM 与 D/A 转换 ... 171
7.3.1 脉宽调制模块 PWM 基本概念 ... 171
7.3.2 脉宽调制模块 PWM 的编程寄存器 ... 172
7.3.3 脉宽调制模块 PWM 的编程实例 ... 175
7.3.4 脉宽调制模块 PWM 的进一步讨论 ... 182
7.3.5 用 PWM 实现 D/A 转换 ... 182
第8章 队列式串行外设接口QSPI ... 184
8.1 SPI 的基本工作原理... 184
8.1.1 SPI 基本概念... 184
8.1.2 SPI 的数据传输... 185
8.1.3 SPI 模块的时序... 185
8.1.4 模拟 SPI ... 187
8.2 MCF52233 队列串行外设接口 QSPI 模块编程结构 ... 188
8.2.1 QSPI 概述 ... 188
8.2.2 QSPI 工作原理 ... 188
8.2.3 QSPI 功能描述 ... 190
8.2.4 QSPI 模块寄存器 ... 190
8.2.5 发送延时 ... 194
8.3 MCF52233 的串行外设接口 QSPI 模块编程实例 ... 195
第9章 I2C模块及应用实例 ... 201
9.1 I2C 模块 ... 201
9.1.1 I2C 总线特点 ... 201
9.1.2 I2C 总线标准的发展历史 ... 202
9.1.3 I2C 总线的相关术语 ... 202
9.2 I2C 总线工作原理 ... 202
9.2.1 总线上数据的有效性 ... 203
9.2.2 总线上的信号 ... 203
9.2.3 总线上数据传输格式 ... 204
9.2.4 I2C 总线寻址约定 ... 205
9.2.5 主机向从机读写 1 个字节数据的过程... 205
V
9.3 I2C 模块的编程基础 ... 206
9.3.1 MCF52233 的 I2C 模块 ... 206
9.3.2 MCF52233 的 I2C 模块寄存器介绍 ... 207
9.3.3 MCF52233 的 I2C 模块编程 ... 210
9.4 MCF52233 的 I2C 模块的进一步讨论 ... 215
9.4.1 仲裁程序 ... 215
9.4.2 实现数据传输同步交换 ... 216
第10章 FLASH在线编程 ... 217
10.1 Flash 存储器概述 ... 217
10.2 ColdFire Flash 存储器编程方法... 218
10.2.1 ColdFire Flash 模块寄存器... 219
10.2.2 ColdFire Flash 存储器擦除与写入的步骤 ... 221
10.3 ColdFire Flash 擦写函数的测试工程 ... 226
10.4 ColdFire Flash 存储器的保护特性和安全性 ... 227
10.4.1 ColdFire Flash 存储器的保护特性 ... 227
10.4.2 ColdFire Flash 存储器的安全性 ... 227
第11章 MCF52235 FLEXCAN模块编程方法 ... 232
11.1 CAN 总线通用知识 ... 232
11.1.1 CAN 总线协议的历史概况 ... 232
11.1.2 CAN 硬件系统的典型电路 ... 232
11.1.3 CAN 总线的有关基本概念 ... 234
11.1.4 帧结构 ... 238
11.1.5 位时间 ... 242
11.2 MCF52235 FlexCAN 模块概述与编程结构 ... 243
11.2.1 FlexCAN 特性 ... 243
11.2.2 操作模式 ... 244
11.2.3 FlexCAN 模块的内存映像以及寄存器定义 ... 245
11.2.4 FlexCAN 报文缓冲区(Message Buffer,MB) ... 251
11.3 MCF52235 FlexCAN 模块报文发送与接收函数设计 ... 254
11.3.1 数据帧发送/接收 ... 254
11.3.2 远程帧发送/接收 ... 258
11.3.3 仲裁处理、匹配处理及报文缓冲区管理 ... 261
11.4 MCF52235 FlexCAN 模块编程实例 ... 262
11.4.1 初始化函数设计 ... 262
11.4.2 MCF52235 FlexCAN 模块测试工程说明 ... 264
11.5 进一步讨论 ... 266
目录
VI
第12章 基于MCF52233的嵌入式以太网 ... 270
12.1 嵌入式以太网相关基础知识 ... 270
12.1.1 以太网的由来与协议模型 ... 270
12.1.2 以太网中主要物理设备 ... 273
12.1.3 相关名词解释 ... 275
12.2 MCF52233 以太网模块外部连接及编程基础 ... 278
12.2.1 以太网模块引脚及硬件连接 ... 278
12.2.2 以太网物理层收发器 EPHY 的编程基础 ... 280
12.2.3 第一个测试实例:网络连接 ... 285
12.2.4 快速以太网控制器 FEC 的编程基础 ... 289
12.3 链路层编程 ... 298
12.3.1 FEC 初始化函数 FEC_Init ... 298
12.3.2 以太帧发送 ... 302
12.3.3 以太帧接收 ... 304
12.3.4 第二个测试实例:以太帧的发送和接收... 305
12.3.5 第三个测试实例:链路层 ARP 协议编程 ... 308
12.4 网络层的 IP 协议与 ICMP 协议编程 ... 310
12.4.1 IP 协议简介 ... 311
12.4.2 第四个测试实例:使用 ICMP 协议响应 Ping 请求... 313
12.5 运输层的 UDP 与 TCP 协议编程 ... 314
12.5.1 UDP 协议概述 ... 314
12.5.2 第五个测试实例:UDP 报文的发送和接收 ... 315
12.5.3 TCP 协议概述 ... 316
12.5.4 第六个测试实例:TCP 报文的发送和接收 ... 317
12.6 应用层的 HTTP 协议编程 ... 320
12.6.1 HTTP 协议概述 ... 320
12.6.2 第七个测试实例:HTTP 协议静态页面的实现 ... 322
第13章 其它模块 ... 324
13.1 时钟模块 ... 324
13.2 芯片配置模块 ... 325
13.2.1 芯片配置模块简介 ... 326
13.2.2 芯片配置模块寄存器定义 ... 326
13.3 系统控制模块 ... 327
13.3.1 系统控制模块功能概述 ... 327
13.3.2 系统控制模块的可编程寄存器 ... 327
13.3.3 对系统初始化过程的理解 ... 329
13.4 实时时钟模块 ... 331
VII
13.5 电源管理模块 ... 333
13.5.1 低功耗模式 ... 333
13.5.2 低功耗模式下的外设行为 ... 333
13.5.3 电源管理模块寄存器定义 ... 334
13.6 复位控制模块 ... 334
第14章 基于MCF52223的USB 2.0编程 ... 336
14.1 USB 基本概念及硬件特性 ... 336
14.1.1 USB 概述 ... 336
14.1.2 USB 相关基本概念 ... 337
14.1.3 USB 的物理特性 ... 342
14.2 USB 的通信协议 ... 344
14.2.1 USB 基本通信单元:包 ... 344
14.2.2 USB 通信中的事务处理 ... 346
14.2.3 从设备的枚举看 USB 数据传输 ... 347
14.3 MCF52223 硬件最小系统及 USB 模块功能简介 ... 352
14.3.1 MCF52223 硬件最小系统 ... 352
14.3.2 MCF52223 的 USB 模块功能简介 ... 353
14.3.4.MCF52223 的 USB 模块主要寄存器介绍 ... 354
14.4 MCF52223 作为 USB 从机的开发方法 ... 357
14.4.1 PC 方 USB 设备驱动程序的选择及基本原理 ... 357
14.4.2 PC 机作为 USB 主机的程序设计 ... 361
14.4.3 MCF52223 作为 USB 从机的程序设计 ... 364
14.5 MCF52223 作为 USB 主机的开发方法 ... 367
14.5.1 MCF52223 作为 USB 主机的基本功能 ... 367
14.5.2 USB 主机与 CDC 类 USB 设备通信 ... 369
14.5.3 USB 主机与 MassStorage 类 USB 设备通信 ... 369
14.6 采用 OTG 技术的 USB 系统开发方法 ... 370
第15章 µC/OS-Ⅱ在COLDFIRE上的移植与应用 ... 373
15.1 实时操作系统概述 ... 373
15.1.1 实时操作系统基本含义和要求 ... 373
15.1.2 任务和多任务 ... 374
15.1.3 RTOS 的常用术语 ... 374
15.1.4 RTOS 的现状 ... 375
15.2 嵌入式实时操作系统 µC/OS-Ⅱ ... 377
15.2.1 µC/OS-Ⅱ简介 ... 377
15.2.2 µC/OS-Ⅱ与几种 RTOS 的比较 ... 377
目录
VIII
15.2.3 µC/OS-Ⅱ中的任务 ... 378
15.2.4 µC/OS-Ⅱ用户应用程序的一般结构 ... 379
15.3 µC/OS-Ⅱ的任务划分 ... 380
15.3.1 任务划分的目标 ... 380
15.3.2 任务划分的方法 ... 380
15.4 µC/OS-Ⅱ在 MCF52233 上的应用实例 ... 382
15.4.1 基于 µC/OS-Ⅱ的应用实例 ... 382
15.4.2 与无 RTOS 实例的比较 ... 384
15.5 µC/OS-Ⅱ在 MCF52233 上的移植 ... 384
15.5.1 定义内核的大小和功能 ... 385
15.5.2 与硬件相关的代码 ... 386
第16章 基于硬件构件的嵌入式系统开发方法 ... 390
16.1 嵌入式系统开发所遇到的若干问题 ... 390
16.2 嵌入式硬件构件的基本思想与应用方法... 390
16.3 基于硬件构件的嵌入式系统硬件电路设计原则 ... 391
16.3.1 设计时需要考虑的基本问题 ... 391
16.3.2 硬件构件化电路原理图绘制规则 ... 392
16.3.3 PCB 设计基本原则 ... 394
16.4 基于硬件构件的嵌入式底层软件构件的编程方法 ... 395
16.4.1 嵌入式硬件构件和软件构件的层次模型... 395
16.4.2 底层构件的实现方法与编程思想 ... 396
16.4.3 硬件构件及底层软件构件的重用与移植方法 ... 397
16.5 硬件构件化嵌入式开发技术的应用实例... 399
16.5.1 系统功能 ... 399
16.5.2 硬件设计 ... 399
16.5.2 软件设计 ... 404
附录 A 本书使用的 ColdFire 系列 MCU 芯片封装... 407
附录 B 写入器、评估板及购买方法 ... 408
附录 C 常见实践问题解答 ... 410
主要参考书目 ... 415
第1章 概述
作为全书导引,本章内容与具体芯片无关。主要内容有:简要给出嵌入式系统定义、
由来及特点;简要阐述嵌入式系统的知识体系,分析如何避免进入嵌入式系统的学习误区,
根据嵌入式系统的特点,就如何学习嵌入式系统提出几点建议;归纳嵌入式系统的常用术 语;给出嵌入式系统常用的标准 C 语言基本语法概要;对本书提供的学习与实践资料给 出概要说明与索引。
1.1 嵌入式系统定义、由来及特点
1.1.1 嵌入式系统的定义
嵌入式系统(Embedded system)有多种多样的定义,但本质是相同的。本书关于嵌 入式系统的定义取自美国 CMP Books 出版的 Jack Ganssle 和 Michael Barr 著作《Embedded System Dictionary》①。
嵌入式系统的定义:一种计算机硬件和软件的组合,也许还有机械装置,用于实现一 个特定功能。在某些特定情况下,嵌入式系统是一个大系统或产品的一部分。世界上第一 个嵌入式系统是 1971 年 Busicom 公司用 Intel 单芯片 4004 微处理器完成的商用计算器系 列。该词典还给出了嵌入式系统的一些示例:微波炉、手持电话、计算器、数字手表、录 像机、巡航导弹、GPS 接收机、数码相机、传真机、跑步机、遥控器和谷物分析仪等,难 以尽数。通过与通用计算机的对比可以更形象地理解嵌入式系统的定义。该词典给出的通 用计算机定义是:计算机硬件和软件的组合,用做通用计算平台。PC、MAC 和 Unix 工 作站是最流行的现代计算机。
我国《国家标准 GB/T 5271 信息技术词汇-嵌入式系统与单片机》部分,给出的嵌入 式系统定义是:置入应用对象内部起操作控制作用的专用计算机系统。
国内对嵌入式系统定义曾进行过广泛讨论,有许多不同说法。其中嵌入式系统定义涵 盖面问题是主要争论焦点之一。例如,有的学者认为不能把手持电话叫嵌入式系统,而只 能把其中起控制作用的部分叫嵌入式系统,而手持电话可以称为嵌入式系统的应用产品。
其实,这些并不妨碍人们对嵌入式系统的理解,所以不必对定义感到困惑。有些国内学者 特别指出,在理解嵌入式系统定义时,不要把嵌入式系统与嵌入式系统产品相混淆。实际 上,从口语或书面语言角度,不区分“嵌入式系统”与“嵌入式系统产品”,只要不妨碍 对嵌入式系统的理解就没有关系。
为了更清楚阐述嵌入式系统特点,首先介绍大多数嵌入式系统的核心部件-单片机
① 中译本:Jack Ganssle 等著,马广云等译,《英汉双解嵌入式系统词典》,北京航空航天大学出版社,
2006 年。
第 1 章 概述
(微控制器)的基本概念。
1.1.2 嵌入式系统的由来及其与微控制器的关系
1.单片机(微控制器)的基本含义
单片机是单片微型计算机的简称,早期的英文名是 Single-chip Microcomputer,后来 大多数称之为微控制器或嵌入式计算机(Embedded computer)。现在 Microcontroller 已经 是计算机中一个常用术语,但在 1990 年代之前,大部分英文词典并没有这个词。我国学 者一般使用中文“单片机”一词,而缩写使用“MCU”①。所以本书后面的简写一律以 MCU 为准。MCU 的基本含义是:在一块芯片上集成了中央处理单元(CPU)、存储器
(RAM/ROM 等)、定时器/计数器及多种输入输出(I/O)接口的比较完整的数字处理系统。
图 1-1 给出了典型的 MCU 组成框图。
MCU 是在计算机制造技术发展到一定阶段的背景下出现的,它使计算机技术从科学 计算领域进入到智能化控制领域。从此,计算机技术在两个重要领域——通用计算机领域 和嵌入式(Embedded)计算机领域都获得了极其重要的发展,为计算机的应用开辟了更 广阔的空间。
就 MCU 组成而言,虽然它只是一块芯片,但包含了计算机的基本组成单元,仍由运 算器、控制器、存储器、输入设备、输出设备五部分组成,只不过这些都集成在一块芯片 上,这种结构使得 MCU 成为具有独特功能的计算机。
2.嵌入式系统的由来
通俗地说,计算机是因科学家需要一个高速的计算工具而产生的。直到二十世纪七十 年代,电子计算机在数字计算、逻辑推理及信息处理等方面表现出非凡的能力。在通信、
测控与数据传输等领域,人们对计算机技术给予了更大的期待。这些领域的应用与单纯的 高速计算要求不同,主要表现在:直接面向控制对象;嵌入到具体的应用体中,而非计算 机的面貌出现;能在现场连续可靠地运行;体积小,应用灵活;突出控制功能,特别是对 外部信息的捕捉与丰富的输入输出功能等。由此可以看出,满足这些要求的计算机与满足 高速数值计算的计算机是不同的。因此,一种称之为单片机或微控制器的技术得以产生并 发展。为了区分这两种计算机类型,通常把满足海量高速数值计算的计算机称为通用计算
① MCU 的英文全称是 Microcontroller Unit。
图1-1 一个典型的MCU内部框图 MCU 内部总线(控制总线、数据总线、地址总线)
CPU RAM Flash 存储器
A/D 转换接口
工作支撑模块定时器接口 串行通信接口 „„ 其他 I/O 模块
机系统,而把嵌入到实际应用系统中,实现嵌入式应用的计算机称之为嵌入式计算机系统,
简称嵌入式系统。
3.嵌入式系统与MCU的关系
何立民先生说:“有些人搞了十多年的单片机应用,不知道单片机就是一个最典型的 嵌入式系统”①。实际上,MCU 是在通用 CPU 基础上发展起来的,MCU 具有体积小、价 格低、稳定可靠等优点,它的出现和迅猛发展,是控制系统领域的一场技术革命。MCU 以其较高的性能价格比、灵活性等特点,在现代控制系统中具有十分重要的地位。大部分 嵌入式系统以 MCU 为核心进行设计。MCU 从体系结构到指令系统都是按照嵌入式系统的 应用特点专门设计的,它能很好地满足应用系统的嵌入、面向测控对象、现场可靠运行等 方面的要求。因此以 MCU 为核心的系统是应用最广的嵌入式系统。在实际应用时,开发者 是根据具体要求选用最佳型号的 MCU 嵌入到实际应用系统中。
在 MCU 出现之前,人们必须用模拟电路、数字电路实现大部分计算与控制功能,这 样使得控制系统体积庞大,易出故障。MCU 出现以后,情况发生了变化,系统中的大部 分计算与控制功能由 MCU 的软件实现。其它电子线路成为 MCU 的外围接口电路,承担 着输入、输出与执行动作等功能,而计算、比较与判断等原来必须用电路实现的功能,可 以用软件取代,大大地提高了系统的性能与稳定性,这种控制技术称之为嵌入式控制技术。
在嵌入式控制技术中,核心是 MCU,其它部分依此而展开。
1.1.3 嵌入式系统的特点
要谈嵌入式系统特点,不同学者也许有不同说法。这里从与通用计算机对比角度谈嵌 入式系统的特点。
1.嵌入式系统是计算机系统,但不单独以通用计算机面目出现
嵌入式系统的本名叫嵌入式计算机系统(Embedded computer system),它不仅具有通 用计算机的主要特点,又具有自身特点。嵌入式系统也必须要有软件才能运行,但其隐含 在种类众多的具体产品中。同时,通用计算机种类屈指可数,而嵌入式系统不仅芯片种类 繁多,而且由于应用对象大小各异,嵌入式系统作为控制核心,已经融入到各个行业的产 品之中。
2.嵌入式系统开发需要专用工具和特殊方法
嵌入式系统不像通用计算机那样有了计算机系统就可以进行应用开发。一般情况下,
MCU 芯片本身不具备开发功能,必须要有一套与相应芯片配套的开发工具和开发环境。
这些工具和环境一般基于通用计算机上的软硬件设备以及各种逻辑分析仪、混合信号示波 器等。开发时往往有主机和目标机的概念,主机用于程序的开发,目标机作为程序的执行 机,开发时需要交替结合进行。
① 《单片机与嵌入式系统应用》,2004 年第 1 期。
第 1 章 概述
3.使用MCU设计嵌入式系统,数据与程序空间采用不同存储介质
在通用计算机系统中,程序存储在硬盘上。实际运行时,通过操作系统将要运行的程 序从硬盘调入内存(RAM),运行中的程序、常数、变量均在 RAM 中。而以 MCU 为核 心的嵌入式系统,其程序被固化到非易失性存储器中①。变量及堆栈使用 RAM 存储器。
4.开发嵌入式系统涉及软件、硬件及应用领域的知识
嵌入式系统与硬件紧密相关,嵌入式系统的开发需要硬件、软件协同设计、协同测试。
同时,由于嵌入式系统专用性很强,通常是用在特定应用领域,如嵌入在手机、冰箱、空 调、各种机械设备、智能仪器仪表中起核心控制作用,功能专用。因此,进行嵌入式系统 的开发,还需要对领域知识有一定的理解。当然,一个团队协作开发一个嵌入式产品,其 中各个成员可以扮演不同角色,但对系统的整体理解与把握并相互协作,有助于一个稳定 可靠嵌入式产品的诞生。
5.嵌入式系统的其他特点
除了以上特点之外,嵌入式系统还具有其他方面的特点。
在资源方面:嵌入式系统通常专用于某一特定应用领域,其硬件资源不会像通用计算 机那样丰富;在可靠性方面:嵌入式系统一般要求更高可靠性和稳定性;在实时性方面:
相当多嵌入式系统有实时性要求;在成本方面:嵌入式系统通常极其关注成本;在功耗要 求方面:一些嵌入式系统要求低功耗;在生命周期方面:嵌入式系统通常比通用计算机系 统生命周期长,升级换代比通用计算机慢。在知识综合方面:嵌入式系统是将先进的计算 机技术、半导体技术及电子技术与各个行业的具体应用相结合的产物,是一个技术密集、
资金密集、高度分散、不断创新的知识集成系统。它的构成既有硬件又有软件,不仅包括 应用软件,也可能包括系统软件。它有数字电路又有模拟电路。其产品技术含量高,涉及 多种学科,不容易开发,因此也不容易形成技术垄断。
这些特点决定了嵌入式系统的开发方法、开发难度、开发手段等,均不同于通用计算 机,也不同于常规的电子产品。
1.2 嵌入式系统的知识体系、学习误区及学习建议
1.2.1 嵌入式系统的知识体系
嵌入式系统的应用范围可以粗略分为两大类:(1)电子系统的智能化(工业控制,现 代农业、家用电器、汽车电子、测控系统、数据采集等);(2)计算机应用的延伸(MP3、
手机、通信、网络、计算机外围设备等)。从这些应用可以看出,要完成一个以 MCU 为 核心的嵌入式系统应用产品设计,需要有硬件、软件及行业领域相关知识。硬件主要有 MCU 的硬件最小系统、输入/输出外围电路、人机接口设计。软件设计有固化软件的设计,
① 目前,非易失性存储器通常为 Flash 存储器,特点见“第 10 章 Flash 存储器在线编程”。
也可能含 PC 机软件的设计。行业知识需要通过协作、交流与总结获得。
概括地说,学习以 MCU 为核心的嵌入式系统,需要以下软件硬件基础知识与实践训 练:
(1)硬件最小系统(包括电源、晶振、复位、写入调试接口);
(2)通用 I/O(开关量输入/输出,涉及各种二值量检测与控制);
(3)模数转换 A/D(各种传感器信号的采集与处理,如红外、温度、光敏、超声波、
方向等);
(4)数模转换 D/A(对模拟量设备利用数字进行控制);
(5)通信(串行通信接口 SCI、串行外设接口 SPI、集成电路互联总线 I2C,CAN、
USB、嵌入式以太网、ZigBee 技术等);
(6)显示(LED、LCD 等);
(7)控制(控制各种设备,包括 PWM 等控制技术);
(8)数据处理(图形、图像、语音、视频等处理或识别);
(9)各种具体应用。
事实上,万变不离其宗,任何应用都可以归入这几类。而应用中的硬件设计、软件设 计、测试等都必须遵循嵌入式软件工程的方法、原理与基本原则。所以,嵌入式软件工程 也是嵌入式系统知识体系的有机组成部分,只不过,它融于具体项目的开发过程之中。
以上实践训练涉及硬件基础、软件基础及相关领域知识。计算机语言、操作系统、开 发环境等均是完成这些目的的工具。有些初学者,容易把工具的使用与所要达到的真正目 的相混淆。例如,有的学习者,学了很长时间的嵌入式操作系统移植,而不进行实际嵌入 式系统产品的开发,到了最后,做不好一个嵌入式系统小产品,偏离了学习目标,甚至放 弃了嵌入式系统领域。这就是进入了嵌入式系统学习误区的情况,下面对此做一些分析。
1.2.2 嵌入式系统的学习误区
关于嵌入式系统的学习方法,因学习经历、学习环境、学习目的、已有的知识基础等 不同,可能在学习顺序、内容选择、实践方式等方面有所不同。但是,应该明确哪些是必 备的基础知识,哪些应该先学,哪些应该后学;哪些必须通过实践才能获得的;哪些是与 具体芯片无关的通用知识,哪些是与具体芯片或开发环境相关的知识。
由于微处理器与微控制器种类繁多,也可能由于不同公司、不同机构出于自身的利益,
给出一些误导性宣传,特别是我国嵌入式微控制器制造技术的落后及其他相关情况,使得 人们对微控制器的发展,在认识与理解上存在差异,导致一些初学者,进入了嵌入式系统 的学习误区,浪费了宝贵的学习时间。下面分析初学者可能存在的几个误区。
1.嵌入式系统学习误区1-操作系统的困惑
如果说,学习嵌入式系统不是为了开发其应用产品,那就没有具体目标了,许多诸如 学习方法问题也就不必谈了。实际上,这正是许多人想学,又不知从何开始学习的关键问 题所在,不知道自己学习的具体目标。于是,看了一些培训广告,看了书店中书架上种类 繁多的嵌入式系统的书籍,或上网以“嵌入式系统”为关键词进行查询,然后参加培训或
第 1 章 概述
看书,开始“学习起来”。对于有计算机阅历的人,往往选择一个嵌入式操作系统就开始 学习了。不好听的比喻,有点象“瞎子摸大象”,只了解其一个侧面。这样如何能对嵌入 式产品的开发过程有个全面了解呢?针对许多初学者选择“xxx 嵌入式操作系统+xxx 处理 器”的嵌入式系统入门学习模式,我认为是不合适的。我的建议是:首先把嵌入式系统软 件与硬件基础打好了,再根据实际需要,选择一种实时操作系统(RTOS)进行学习实践。
要记住:RTOS 是开发某些类嵌入式产品的辅助工具,是手段,不是目的。许多类嵌入式 产品,并不需要 RTOS。所以,一开始就学习 RTOS,并不符合“由浅入深、循序渐进”
的学习规律。
RTOS 本身由于种类繁多,实际使用何种 RTOS,一般需要工作单位确定。基础阶段 主要学习 RTOS 的基本原理与在 RTOS 之上的软件开发方法,而不是学习如何设计 RTOS。
以开发实际嵌入式产品为目标的学习者,不要把过多的精力花在设计或移植 RTOS 上面。
正如很多人使用 Windows 操作系统,而设计 Windows 操作系统只有 Microsoft。许多人“研 究”Linux,但不使用它,浪费时间了,人的精力是有限的,学习必须有所选择。
2.嵌入式系统学习误区2-硬件与软件的困惑
以 MCU 为核心的嵌入式技术的知识体系必须通过具体的 MCU 来体现、实践与训练。
但是,选择任何型号的 MCU,其芯片相关的知识只占知识体系的 20%,80%是通用知识。
但是 80%的通用知识,必须通过具体实践才能进行,所以学习嵌入式技术要选择一个系列 的 MCU。但不论如何,系统含有硬件与软件两大部分,它们之间的关系如何?
有些学者,仅从电子角度认识嵌入式系统。认为“嵌入式系统=MCU 硬件系统+小程 序”。这些学者,大多具有良好的电子技术基础知识。实际情况是,早期 MCU 内部 RAM 小、程序存储器外接,需要外扩各种 I/O,没有象现在这样 USB、嵌入式以太网等较复杂 的接口,因此,程序占总设计量小于 50%,使人们认为嵌入式系统(单片机)是“电子系 统”,以硬件为主、程序为辅。但是,随着 MCU 制造技术的发展,不仅 MCU 内部 RAM 越来越大,Flash 进入 MCU 内部改变了传统的嵌入式系统开发与调试方式,固件程序可 以被更方便地调试与在线升级,许多情况与开发 PC 机程序方便程度相差无几,只不过开 发环境与运行环境不是同一载体而已。这些情况使得嵌入式系统的软件硬件设计方法发生 了根本变化。
有些学者,仅从软件开发角度认识嵌入式系统。甚至有的仅从嵌入式操作系统认识嵌 入式系统。这些学者,大多具有良好的计算机软件开发基础知识,认为硬件是生产厂商的 事,没有认识到,嵌入式系统产品的软件与硬件均是需要开发者设计的。我常常接到一些 关于嵌入式产品稳定性的咨询电话,发现大多数是由于软件开发者对底层硬件的基本原理 不理解造成的。特别是,有些功能软件开发者,过分依赖于底层硬件的驱动软件设计完美,
自己对底层驱动原理知之甚少。实际上,一些功能软件开发者,名义上在做嵌入式软件,
但仅仅是使用嵌入式编辑、编译环境而已,本质与开发通用 PC 机软件没有两样。而底层 硬件驱动软件的开发,若不全面考虑高层功能软件对底层硬件的可能调用,也会使得封装 或参数设计得不合理或不完备,导致高层功能软件的调用困难。从这段描述可以看出,若 把一个嵌入式系统的开发孤立地分为硬件设计、底层硬件驱动软件设计、高层功能软件设
计,一旦出现了问题,就可能难以定位。实际上,嵌入式系统设计是一个软件、硬件协同 设计工程,不能象通用计算机那样,软件、硬件完全分开来看,要在一个大的框架内协调 工作。
面对学习嵌入式系统以软件为主还是以硬件为主,或是如何选择切入点,如何在软件 与硬件之间取得一些平衡。对于这个困惑的建议是:要想成为一名真正的嵌入式系统设计 师,在初学阶段,必须重视打好嵌入式系统的硬件与软件基础。以下是从事嵌入式系统设 计二十多年的一个美国学者 John Catsoulis 在《Designing Embedded Hardware》一书中关 于这个问题的总结:嵌入式系统与硬件紧密相关,是软件与硬件的综合体,没有对硬件的 理解就不可能写好嵌入式软件,同样没有对软件的理解也不可能设计好嵌入式硬件。
3.嵌入式系统学习误区3-片面认识嵌入式系统
嵌入式系统产品种类繁多,应用领域各异。在 1.2.1 小节中,把嵌入式系统的应用范 围粗略分为电子系统的智能化与计算机应用的延伸两大类,从初学者角度,可能有分别从 这两个角度片面认识嵌入式系统的问题。因此,一些从电子系统智能化角度认识嵌入式系 统的学习者,可能会忽视编程结构、编程规范、软件工程的要求、操作系统等知识的积累。
另一些从计算机应用的延伸角度认识嵌入式系统的学习者,可能会把通用计算机学习过程 中的概念与方法生搬硬套到嵌入式系统的实践中,忽视嵌入式系统与通用计算机的差异。
实际上,在嵌入式系统学习与实践的初始阶段,应该充分了解嵌入式系统的特点,根 据自身的已有知识结构,制定适合自身情况的学习计划。目标应该是打好嵌入式系统的硬 件与软件基础,通过实践,为成为良好的嵌入式系统设计师建立起基本知识结构。学习过 程,可以通过具体应用系统为实践载体,但不能拘泥于具体系统,应该有一定的抽象与归 纳。例如,有的初学者开发一个实际控制系统,没有使用实时操作系统,但不要认为实时 操作系统不需要学习。又例如,有的初学者以一个带有实时操作系统的样例为蓝本进行学 习,但不要认为,任何嵌入式系统都需要使用实时操作系统,甚至把一个十分简明的实际 系统加上一个不必要的实时操作系统。因此,片面认识嵌入式系统,可能导致学习困惑。
应该根据实际项目需要,锻炼自己分析实际问题、解决问题的能力。这是一个比较长期的 学习与实践过程,不能期望通过短期培训完成整体知识体系的建立,应该重视自身实践,
全面地理解嵌入式系统的知识体系。
4.嵌入式系统学习误区4-入门芯片选择的困惑
嵌入式系统的大部分初学者需要选择一个微控制器(MCU)进行入门级学习,面对 众多厂家生产的微控制器系列,不知如何是好。
首先是关于位数问题,目前主要有 8 位、16 位、32 位,面对嵌入式系统应用的多样 性,不同位数的 MCU 各有应用领域,这一点与通用微机有很大不同。你做一个遥控器,
不需要使用一个 32 位 MCU,可能一个 MCU 芯片价格已经超过遥控器价格需求。对于首 次接触嵌入式系统的学习者,可以根据自己的知识基础选择入门芯片的位数。建议大多数 初学者,可以选择一个 8 位 MCU 作为快速入门芯片,了解一些汇编与底层硬件知识,之 后再选一个 16 位或 32 位芯片进行学习实践。
关于芯片选择的另一个误区,认为有“主流芯片”存在,嵌入式系统也可以形成芯片
第 1 章 概述
垄断。这完全是一种误解,是套用通用计算机系统的思维模式,而忽视了嵌入式系统应用 的多样性。
关于学习芯片选择还有一个误区,是系统的工作频率。误认为选择工作频率高的芯片 进行入门学习,表示更先进。实际上,工作频率高可能给初学者带来学习过程中的不少困 难。
实际嵌入式系统设计不是追求芯片位数、工作频率、操作系统等因素,而是追求稳定 可靠、维护、升级、功耗、价格等指标。而初学者选择入门芯片,是通过某一 MCU 作为 蓝本获得嵌入式系统知识体系的通用基础,其基本原则是:入门时间较快、硬件成本较少,
知识要素较多,学习难度较低。
1.2.3 基础阶段的学习建议
基于以上讨论,下面对广大渴望学习嵌入式系统的学子提出几点基础阶段的学习建议:
(1)嵌入式系统软件硬件密切相关,一定要打好软件硬件基础。其实,只要找到正确 的方法,加上努力,任何理工科学生,甚至非理工科学生,都能学好嵌入式系统。
(2)选择一个芯片及硬件评估板(入门芯片最好是简单一点,例如 8 位 MCU)、选择 一本好书(最好有规范的例子)、找一位好老师(最好是有经验且热心的)。硬件评估板的 价格一定要在 1000 元以下,不要太贵,最好能有自己动手的空间。不花一分硬件钱,要 想学好嵌入式系统不实际。因为,这是实践性很强的学科。好书,可以使你少走弯路,不 会被误导,要知道有的书是会使人进入学习误区的。好老师也可以是做过一些实际项目的 学长(一定要找做过几个成功项目的学长或老师做指导,否则,经验不足也可能误导), 有教师指导,学习进程会加快(人工智能学科里有个术语叫无教师指导学习模式与有教师 指导学习模式,无教师指导学习模式比有教师指导学习模式复杂许多)。
(3)许多人怕硬件,其实嵌入式系统硬件比电子线路好学多了。只要深入理解 MCU 的硬件最小系统,对 I/O 口、串行通信、键盘、LED、LCD、SPI、I2C、PWM、A/D(包 括一些传感器)、D/A 等逐个实验理解,逐步实践。再通过自己做一个实际的小系统,底 层硬件基础就有了。各个硬件模块驱动程序的编写是嵌入式系统的必备基础。学习嵌入式 系统的初期,这个过程是必须的。
(4)至于嵌入式实时操作系统 RTOS,一定不要一开始就学,这样会走很多弯路,也 会使你对嵌入式系统感到畏惧。等你软件硬件基础打好了,再学习就感到容易理解。实际 上,众多嵌入式应用,并不一定需要操作系统。也可以根据实际项目需要再学习特定的 RTOS。一定不要被一些嵌入式实时操作系统培训班宣传所误导,而忽视实际嵌入式系统 软件硬件基础知识的学习。
(5)要避免片面地单纯从“电子”或“计算机软件”角度认识嵌入式系统。前面说 过,嵌入式系统是软件与硬件的综合体。因此,要逐步从 MCU 的最小系统开始,一点一 点理解硬件原理及底层硬件驱动编程方法。要通过规范的例子,理解软件工程封装、可复 用等思想。通过规范编程,积累底层构件(Component),也就是一个一个模块,但是要 封装得比较好,可复用。
(6)注重实验与实践。这里说的实验主要指通过重复或验证他人的工作,目的是学 习基础知识,这个过程一定要经历。实践是自己设计,有具体的“产品”目标。如果你能 花 500 元左右自己做一个具有一定功能的小产品,且能稳定运行 1 年以上,就可以说接近 入门了。
(7)关于入门芯片的选择。不要选太复杂的微控制器作为入门芯片,不能超越学习 过程。不要一下子学习几种芯片,可以通过一个芯片入门并具有一个实践经验后,根据实 际需要选择芯片开发实际产品。注意,不要把微处理器(MPU)与微控制器(MCU)概 念相混淆,微处理器只是微控制器的内核。
(8)关于嵌入式操作系统的选择。可以等到你具有一定实践后,选择一个简单容易 理解原理的进行学习,不要一开始就学习几种操作系统,理解了基本原理,实践中确有实 际需要再学习也不迟。人总是要不断学习的。
(9)关于汇编与 C 语言的取舍。随着 MCU 对 C 编译的优化支持,对于汇编可以只 了解几个必须的语句,直接使用 C 语言编程。但必须通过第一个程序理解芯片初始化过 程、中断机制、程序存储情况等区别于 PC 机程序的内容。另外,为了测试的需要,最好 掌握一门 PC 机编程语言。
(10)要明确自己的学习目的,并注意学习方法。关于学习目的要明确是打基础,还 是为了适应某些工作而进行的短训;而学习方法方面,要根据学习目的选择合适的学习途 径,注意理论学习与实践、通用知识与芯片相关知识、硬件知识与软件知识的平衡,要在 理解软件工程基本原理基础上理解硬件构件与软件构件等基本概念。
以上建议,仅供参考。当然,以上只是基础阶段的学习建议,要成为良好的嵌入式系 统设计师,还需要在实际项目中锻炼,并不断学习与积累经验。
1.3 嵌入式系统常用术语
在学习嵌入式应用技术的过程中,经常会遇到一些名词术语。从学习规律角度,初步 了解这些术语有利于随后的学习。因此,本节对嵌入式系统中所用的一些常用术语给出简 要说明,以便有个初始印象。
1.3.1 与硬件相关的术语
1.封装(Package)
集成电路的封装是指用塑料、金属或陶瓷材料等把集成电路封在其中。封装可以保护 芯片,并使芯片与外部世界连接。常用的封装形式可分为通孔封装和贴片封装两大类。
通孔封装主要有:单列直插 SIP(Single-in-line Package)、双列直插 DIP(Dual-in-line Package)、Z 字型直插式封装 ZIP(Zigzag-in-line Package)等。
常见的贴片封装主要有:小外形封装 SOP(Small Outline Package)、紧缩小外形封装 SSOP(Shrink Small Outline Package)、四方扁平封装 QFP(Quad-Flat Package)、薄方封 装 LQFP(Plastic-Low-profile Quad-Flat Package)、塑料扁平组件式封装 PFP(Plastic Flat
第 1 章 概述
Package)、带载封装 TCP(Tape Carrier Package)、插针网格阵列封装 PGA(Ceramic Pin Grid Array Package)、球栅阵列封装 BGA(Ball Grid Array Package)等。
2.印刷电路板(PCB,Printed Circuit Board)
印刷电路板 PCB 是组装电子元件用的基板,是在通用基材上按预定设计形成点间连 接及印制元件的印制板,是电路原理图的实物化。PCB 的主要功能是提供集成电路等各 种电子元器件固定、装配的机械支撑;实现集成电路等各种电子元器件之间的布线和电气 连接(信号传输)或电绝缘;为自动装配提供阻焊图形,为元器件插装、检查、维修提供 识别字符和图形等。
3.动态可读写随机存储器(DRAM,Dynamic Random Access Memory)
动态可读写随机存储器 DRAM,由一个 MOS 管组成一个二进制存储位。MOS 管的 放电导致表示“1”的电压会慢慢降低。一般每隔一段时间就要控制刷新信息,给其充电。
DRAM 价格低,但控制烦琐,接口复杂。
4.静态可读写随机存储器(SRAM,Static Random Access Memory)
静态可读写随机存储器 SRAM,一般由四个或者六个 MOS 管构成一个二进制位。当 电源有电时,SRAM 不用刷新,可以保持原有的数据。
5.只读存储器(ROM,Read Only Memory)
只读存储器 ROM,数据可以读出,但不可以修改,所以称之为只读存储器。通常存 储一些固定不变的信息,如:常数、数据、换码表、程序等。它具有断电后数据不丢失的 特点。ROM 有固定 ROM、可编程 ROM(即 PROM)和可擦除 ROM(即 EPROM)三种。
PROM 的编程原理是通过大电流将相应位的熔丝熔断,从而将该位改写成 0,熔丝熔 断后不能再次改变,所以只改写一次。
EPROM(Erase PROM)是可以擦除和改写的 ROM,它用 MOS 管代替了熔丝,所以 可以反复擦除、多次改写。擦除是用紫外线擦除器来完成的,很不方便。有一种用低电压 信号即可擦除的 EPROM 称为电可擦除 EPROM,简写为 E2PROM 或 EEPROM。
6.闪速存储器(Flash Memory)
闪速存储器简称闪存,是一种新型快速的 E2PROM。由于工艺和结构上的改进,闪存 比普通的 E2PROM 的擦除速度更快,集成度更高。如:飞思卡尔目前生产的微控制器芯 片中大多采用第三代闪存技术,可以达到 10 万次重复读/写能力,页整体擦除和写入只需 要几十毫秒。
闪存相对于传统的 E2PROM 来说,其最大的优点是系统内编程,也就是说不需要另 外的器件来修改内容。闪存的结构随着时代的发展而有些变动,尽管现代的快速闪存是系 统内可编程的,但仍然没有 RAM 使用起来方便。擦写操作必须通过特定的程序算法来实 现。
第 1 章 概述
7.模拟量
模拟量是指时间连续、数值也连续的物理量,如温度、压力、流量、速度、声音等。
在工程技术上,为了便于分析,常用传感器、变换器将模拟量转换为电流、电压或电阻等 电学量。
8.开关量
开关量是指一种二值信号,用两个电平(高电平和低电平)分别来表示两个逻辑值(逻 辑 1 和逻辑 0)。
1.3.2 与通信相关的术语
1.并行通信
并行通信是指数据的各位同时在多根并行数据线上进行传输的通信方式,数据的各位 同时由源到达目的地。适合近距离、高速通信。常用有 4 位、8 位、16 位、32 位等同时 传输。
2.串行通信
串行通信是指数据在单线(电平高低表征信号)或双线(差分信号)上,按时间先后 一位一位地传送,其优点是节省传输线,但相对于并行通信来说,速度较慢。在嵌入式系 统中,串行通信一词一般特指用串行通信接口 SCI(Serial Communication Interface)与 RS232 芯片连接的通信方式。SPI、I2C、USB 等也是串行通信,但它们使用专用名词。
3.串行外设接口SPI
串行外设接口(SPI,Serial Peripheral Interface):也是一种串行通信方式,主要用于 MCU 扩展外围芯片使用。这些芯片可以是具有 SPI 接口的 A/D 转换、时钟芯片等。
4.集成电路互连总线I
2C
I2C(Inter Integrated Circuit),是一种由 PHILIPS 公司开发的两线式串行总线,有的 书籍也记为 IIC 或 I2C,主要用于用户电路板内 MCU 与其外围电路的连接。
5.通用串行总线USB
通用串行总线(USB,Universal Serial Bus),是 MCU 与外界进行数据通信的一种新 的方式,其速度快,抗干扰能力强,在嵌入式系统中得到了广泛的应用。
6.控制局域网CAN
控制器局域网(CAN,Control Area Network),是一种全数字、全开放的现场总线控 制网络,目前在汽车电子中应用最广。
7.背景调试模式BDM
背景调试模式(BDM,Background Debug Mode),是 Freescale 半导体公司提出的一 福昕软件(C)2005-2009,版权所有,
仅供试用。
第 1 章 概述
种调试接口,主要用于嵌入式 MCU 的程序下载与程序调试。
8.边界扫描测试协议JTAG
边界扫描测试协议(JTAG,Joint Test Action Group),是由国际联合测试行动组开发,
对芯片进行测试的一种方式,可将其用于对 MCU 的程序进行载入与调试。JTAG 能获取 芯片寄存器等内容,或者测试遵守 IEEE 规范的器件之间引脚连接情况。
关于通信相关的术语还有嵌入式以太网、无线传感器网络、Zigbee、射频通信等,本 章不再进一步介绍。
1.3.3 与功能模块及软件相关的术语
1.通用输入/输出GPIO
通用输入/输出(GPIO,General Purpose I/O),即基本的输入/输出,有时也称并行 I/O。
作为通用输入引脚时,MCU 内部程序可以读取该引脚,知道该引脚是“1”(高电平)或
“0”(低电平),即开关量输入。作为通用输出引脚时,MCU 内部程序向该引脚输出“1”
(高电平)或“0”(低电平),即开关量输出。
2.A/D与D/A
A/D 转换模块的功能是将电压信号(模拟量)转换为对应的数字量。实际应用中,这 个电压信号可能由温度、湿度、压力等实际物理量经过传感器和相应的变换电路转化而来。
经过 A/D 转换,MCU 就可以处理这些物理量。而与之相反,D/A 转换则是将数字量转换 为电压信号(模拟量)。
3.脉冲宽度调制器PWM
脉冲宽度调制器(PWM,Pulse Width Modulator),是一个 D/A 转换器,可以产生一 个高电平和低电平之间重复交替的输出信号,这个信号就是 PWM 信号。
4.看门狗
看门狗(Watch Dog),是一个为了防止程序跑飞而设计的一种自动定时器。当程序跑 飞时,由于无法正常执行清看门狗定时器,看门狗定时器会自动溢出,使系统程序复位。
5.液晶显示LCD
液晶显示(LCD,Liquid Crystal Dispaly),是电子信息产品的一种显示器件,可分为 字段型、点阵字符型、点阵图形型三类。
6.发光二极管LED
发光二极管(LED,Light Emitting Diode),是一种将电流顺向通到半导体 PN 结处而 发光的器件。常用于家电指示灯、汽车灯和交通警示灯。
7.键盘
键盘是嵌入式系统中最常见的输入设备。识别键盘是否有效被按下的方法有查询法、
本页已使用福昕阅读器进行编辑。
福昕软件(C)2005-2009,版权所有,
仅供试用。
定时扫描法与中断法等。
8.实时操作系统RTOS
实时操作系统(Real Time Operating System,RTOS),是指一种运行于嵌入式系统上 的操作环境,可以提供建立多任务的能力。RTOS 为每个任务建立一个可执行的环境,可 以很方便地在任务之间传递消息,在一个中断处理程序和任务之间传递事件,区分任务执 行的优先级,并协调多个任务对同一个 I/O 设备的调用。通常一个规模大、结构复杂的嵌 入式系统可以分解为一系列较小、较简单的并行任务来实现,各个任务之间互不干扰,使 用 RTOS 排除并行任务中的人为因素,降低复杂度,增强模块化,使工程由更简易和标准 化的模块组成,处理起来更加轻松、快捷。
与软件相关术语很多,本章不再进一步介绍。
1.4 嵌入式系统常用的标准C语言基本语法概要
C 语言是在 70 年代初问世的。1978 年美国电话电报公司(AT&T)贝尔实验室正式 发表了 C 语言。由 B.W.Kernighan 和 D.M.Ritchit 合著的《THE C PROGRAMMING LANGUAGE》一书,被简称为《K&R》,也有人称之为 K&R 标准。但是,在《K&R》中 并没有定义一个完整的标准 C 语言,后来由美国国家标准学会在此基础上制定了一个 C 语言标准,于 1983 年发表,通常称之为 ANSI C 或标准 C。
本节简要介绍 C 语言的基本知识,特别是和嵌入式系统编程密切相关的基本知识,
未学过标准 C 语言的读者可以通过本节了解 C 语言,以后通过实例逐步积累相关编程知 识。对 C 语言很熟悉的读者,可以跳过本节。
1.数据类型
C 语言的数据类型有基本类型和构造类型两大类。基本类型如表 1-1 所示。
表 1-1 C 语言基本数据类型
数据类型 简明含义 位数 字节数 值域
字节型 signed char 有符号字节型 8 1 -128~+127
unsigned char 无符号字节型 8 1 0~255
整型
signed short 有符号短整型 16 2 -32768~+32767 unsigned short 无符号短整型 16 2 0~65535
signed int 有符号短整型 16 2 -32768~+32767
unsigned int 无符号短整型 16 2 0~65535
signed long 有符号长整型 32 4 -2147483648~+2147483647 unsigned long 无符号长整型 32 4 0~4294967295 实型 float 浮点型 32 4 约±3.4×(10-38~10+38)
double 双精度型 64 8 约±1.7×(10-308~10+308) 注:常用的嵌入式 C 语言中的 double 类型长度为 4 字节。
构造类型有数组、结构、联合、枚举、指针和空类型。结构和联合是基本数据类型的 组合。枚举是一个被命名为整型常量的集合。空类型字节长度为 0,主要有两个用途:一
第 1 章 概述
是明确地表示一个函数不返回任何值;二是产生一个同一类型指针(可根据需要动态地分 配给其内存)。
2.运算符
C 语言的运算符分为算术、逻辑、关系和位运算及一些特殊的操作符。表 1-2 列出了 C 语言的运算符及使用方法举例。
表 1-2 C 语言的运算符
运算类型 运算符 简明含义 举 例
算术运算
+ - * / 加、减、乘、除 N=1,N=N+5等同于N+=5,N=6
^ 幂 A=2,B=A^3,B=8
% 取模运算 N=5,Y=N%3,Y=2
逻辑运算
|| 逻辑或 A=TRUE,B=FALSE,C=A||B,C=TRUE
&& 逻辑与 A=TRUE,B=FALSE,C=A&&B,C=FALSE
! 逻辑非 A=TRUE,B=!A,B=FALSE
关系运算
> 大于 A=1,B=2,C=A>B,C=FALSE
< 小于 A=1,B=2,C=A<B,C=TRUE
>= 大于等于 A=2,B=2,C=A>=B,C=TRUE
<= 小于等于 A=2,B=2,C=A<=B,C=TRUE
== 等于 A=1,B=2,C=(A==B),C=FALSE
!= 不等于 A=1,B=2,C=(A!=B),C=TRUE
位运算
~ 按位取反 A=0b00001111,B=~A,B=0b11110000
<< 左移 A=0b00001111,A<<2=0b00111100
>> 右移 A=0b11110000,A>>2=0b00111100
& 按位与 A=0b1010,B=0b1000,A&B=0b1000
^ 按位异或 A=0b1010,B=0b1000,A^B=0b0010
| 按位或 A=0b1010,B=0b1000,A|B=0b1010
增量和减量运算 ++ 增量运算符 A=3,A++,A=4
-- 减量运算符 A=3,A--,A=2
复合赋值运算
+= 加法赋值 A=1,A+=2,A=3
-= 减法赋值 A=4,A-=4,A=0
>>= 右移位赋值 A=0b11110000,A>>=2,A=0b00111100
<<= 左移赋值 A=0b00001111,A<<=2,A=0b00111100
*= 乘法赋值 A=2,A*=3,A=6
|= 按位或赋值 A=0b1010,A|=0b1000,A=0b1010
&= 按位与赋值 A=0b1010,A&=0b1000,A=0b1000
^= 按位异或赋值 A=0b1010,A^=0b1000,A=0b0010
%= 取模赋值 A=5,A%=2,A=1
/= 除法赋值 A=4,A/=2,A=2
指针和地址运算 * 取内容
& 取地址
输出格式转换
0x 无符号十六进制数 0xa=0d10
0o 无符号八进制数 0o10=0d8
0b 无符号二进制数 0b10=0d2
0d 带符号十进制数 0d10000001=-127
0u 无符号十进制数 0u10000001=129
第 1 章 概述
注:增量运算符和减量运算符存在运算和取数先后次序,例如,A++是先取变量 A 的 值再对 A 加 1,而++A 是先对变量 A 加 1 再取 A 的值。
3.流程控制
在程序设计中主要有三种基本控制结构:顺序结构、选择结构和循环结构。
1)顺序结构
顺序结构就是从前向后依次执行语句。从整体上看,所有程序的基本结构都是顺序结 构,中间的某个过程可以是选择结构或循环结构。
2)选择结构
在大多数程序中都会包含选择结构。其作用是,根据所指定的条件是否满足,决定执 行哪些语句。在 C 语言中主要有 if 和 switch 两种选择结构。
(1)if 结构
if (表达式) 语句项; 或 if (表达式) 语句项;
else 语句项;
如果表达式取值真(除 0 以外的任何值),则执行 if 的语句项;否则,如果 else 存在 的话,就执行 else 的语句项。每次只会执行 if 或 else 中的某一个分支。语句项可以是单 独的一条语句、也可以是多条语句组成的语句块(要用一对大括号“{}”括起来)。
if 语句可以嵌套,有多个 if 语句时 else 与最近的一个配对。对于多分支语句,可以使 用 if ... else if ... else if ... else ...的多重判断结构,也可以使用下面讲到的 switch 开关语句。
(2)switch 结构
switch 是 C 语言内部多分支选择语句,它根据某些整型和字符常量对一个表达式进行 连续测试,当一常量值与其匹配时,它就执行与该变量有关的一个或多个语句。switch 语 句的一般形式如下:
格式:
switch(表达式) {
case 常数 1:
语句项 1 break;
case 常数 2:
语句项 2 break;
„„„„
default:
语句项 }
根据 case 语句中所给出的常量值,按顺序对表达式的值进行测试,当常量与表达式 福昕软件(C)2005-2009,版权所有,
仅供试用。