《32位MCU开发全攻略》(上)

163
1

Transcript of 《32位MCU开发全攻略》(上)

Page 1: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 1/163

1

Page 2: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 2/163

32位MCU开发全攻略--工程师创新宝典  上册 前言

前 言

单片机可能是中国工程师最熟悉的一种器件了,几乎每个工科大学生都接触过这个器

件,20多年前,在陈章龙、何立民、邵贝贝等我国单片机应用前辈的推动下,单片机走入中

国,在工业控制、家庭应用等方面发挥出巨大的作用!目前,虽然8位单片机如51等依然是单

片机应用的主体,但是32位单片机(也称MCU)的应用呈现出高速增长势态,有数据显示:

仅在过去一年,基于 ARM Cor tex-M3的MCU的出货量增长率就达到200%!这些高性能、

低功耗的MCU广泛应用于汽车电子、工业应用、医疗电子等领域,而据研究机构预测,中国

MCU的可用市场总量(TAM)将从2009年的20亿美元增长到2013年的30亿美元以上,其增

幅为全球水平的两倍。市场对稳定、可靠而又有着丰富外设集成的通用微控制器有着迫切需

求,这也从侧面说明普及MCU开发知识有充足的必要性。

另一个有趣的现象是当我在书店查找有关书籍时,却发现在查找的400多本有关单片

机的图书中,有9 5%左右的是关于51单片机的,还有3%左右是关于16位单片机的,只有

2%左右的是关于32位MCU的,可见需求和供给之间出现了巨大的落差,这也是电子创新

网推出《32位MCU开发全攻略》电子书的初衷之一。

基于上述原因,本电子书主要讲述32位MCU应用开发知识,对于8位单片机的开发,因

为已经有大量书籍,这里不再赘述。本书的第一章主要介绍了嵌入式系统的背景知识、基

本概念和目前发展状况,让大家对嵌入式系统的发展有大致的了解。第二章主要介绍了微

控制器的基本原理、结构和32位 ARM MCU供应商的信息。第三章主要介绍了 ARM内核的

一些特点及 ARM指令集。第四章以恩智浦公司的MCU为例详细介绍了32位ARM   MCU的

具体结构、功能和特点。第五章是本书的重点内容,以恩智浦的LPC17xx系列MCU为例,

分模块详细介绍了MCU的应用开发,这些介绍把软硬件结合在一起,这是本书和其他类似

书籍的区别之一。第六章介绍了MCU开发工具及开发流程。第七章我们搜集了多个MCU

开发应用实例,通过这些实例,进一步强化MCU开发技巧和系统设计方法。第八章我们以

问答的形式介绍MCU开发的技巧,这些问答具有一定的基础性和代表性,可以帮助工程师

解决MCU应用开发中遇到的难题。第九章我们罗列了一些MCU开发资源信息,工程师朋

友可以通过链接获得所需的知识。第十章是有关本书的编委信息。第十一章是本书的版权

声明,我们授权工程师朋友和媒体免费下载此书并进行推广,但是不得以本书进行商业活

动。

Page 3: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 3/163

32位MCU开发全攻略--工程师创新宝典  上册 前言

本文因为内容很多,分为上下册,上册为基础知识篇,从第一章到第五章,下册为开发

技巧篇,为第六章以后内容。

本书可以作为MCU应用工程师、大中专学生或MCU爱好者学习32位MCU开发的参考教

材。

在本书的开发过程中,恩智浦相关工作人员对本书的内容编写给予了大力支持,上海丰

宝电子有限公司牛晓东先生以及南京航空航天学院白延敏老师也编写了部分章节。此外,南

京航空航天大学的解书钢、王钦玉、浙江大学的余凯、上海交通大学的喻焰以及福州大学黄

鹏程等同学对本电子书编写给予了大力支持,在此表示衷心地感谢!

科技在不断进步,工程师对知识的渴求是无止境的,本书对32位MCU应用开发进行了

粗浅地探讨,难免存在疏漏之处,我们愿意收集来自工程师朋友的改进建议以便提供更好

的内容,任何有关该书的建议见请发信到[email protected] ,谢谢大家的支持!

 

《32位MCU开发全攻略》电子书主编张国斌

  电子创新网CEO

2009年9月

Page 4: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 4/163

32位MCU开发全攻略--工程师创新宝典  上册 目录

4

目 录

前言• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 2

第1章 嵌入式系统概述 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 6

1.1 嵌入式系统概述  • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 6

1.2  嵌入式系统的定义 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 7

1. 3  嵌入式系统的发展历程 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 8 

1. 4  嵌入式系统的特征 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 9

1.5  嵌入式系统的组成• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •

10

1. 6  嵌入式操作系统简介 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 12

1.7  嵌入式系统在不同领域的应用 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 17

第2章 微控制器(MCU)概述 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 20

2.1 什么是哈佛结构和冯 • 诺伊曼结构 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 20

2. 2 微控制器的发展历程 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 21

2.3 微控制器的应用领域 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 22

2.4 微控制器的组成 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 24

2.5 微控制器内核体系结构 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 26

第3章  ARM内核详解 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 30

3.1 ARM嵌入式处理器简介 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 30

3.2 ARM9内核介绍 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 36

3.3 ARM Cortex-M3内核介绍 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 38

3.4 ARM指令特点 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 50

第4章 典型MCU架构详解与主流MCU介绍 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 53

4.1 恩智浦LPC1000系列MCU  • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 53 

4.2 恩智浦LPC3000系列MCU  • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 60

4.3 恩智浦LPC2000系列MCU  • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 63

第5章  MCU软硬件基本知识• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 77 

5.1 LPC17xx系列处理器简介  • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 77

5.2 LPC17xx处理器引脚配置  • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 78

Page 5: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 5/163

32位MCU开发全攻略--工程师创新宝典  上册 目录

5

5.3 存储器管理  • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 80 

5.4 中断向量控制器  • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 84

5.5 电源电路  • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 86

5.6 复位电路  • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 87

5.7 时钟电路  • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 91

5.8 锁相环PLL0  • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 93

5.9 锁相环PLL1  • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 96

5.10 时钟分频  • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 100

5.11 功率控制:低功耗模式  • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 102

5.12 通用输入/输出接口 GPIO • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •

106

5.13 定时器 0/1/2/3  • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 109

5.14 系统节拍定时器  • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 113

5.15 看门狗   • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 115

5.16 实时时钟  • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 117

5.17 UART串口通信  • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 121

5.18 I2C接口  • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 127

5.19 SPI接口  • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 131

5.20 CAN控制器   • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 133

5.21 USB接口  • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 136

5.22 以太网接口  • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 141

5.23 数模转换器和模数转换器• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 150

5.24 电机控制PWM  • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 152

5.25 LPC17xx的调试手段 • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •

154

5.26 LCD接口简介  • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 156

5.27 基于Cortex-M3内核编程简述  • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 159

附录一 MCU开发资源总汇• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 160

附录二 编委信息与后记  • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 161

附录三  版权声明  • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 162

附录四  参考文献• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •

163

Page 6: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 6/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

6

第1章 嵌入式系统概述

1.1 嵌入式系统概述很多人认为PC市场是堪称全球第一的大市场,2008年,全球PC出货量近3亿台!也就是说英特

尔、 AMD等卖出了近3亿个芯片,但是你知道吗?2008年仅用于嵌入式系统的嵌入式处理器出货量就

超过了100亿片!这是PC芯片的30倍以上!而2009年这个数字还将增长到107.6亿!不过09年PC市场

却萎缩近4%,所以,其实嵌入式系统才是当之无愧的全球第一大市场。

可以毫不夸张地说,我们现在的时代是一个完全被嵌入式系统垄断的世界,全球95%以上的电子

产品都属于嵌入式系统,大到航空航天设备小到袖珍的数码产品,可以进入人体的电子药丸,嵌入式

产品深入到我们生活的方方面面,PC机主要应用于办公自动化、家庭领域,但是嵌入式系统已经广泛

渗透到人们的工作、生活中,从家用电器、手持通信设备、汽车、到信息终端、仪器仪表、航天航空、军

事装备、制造工业、过程控制等。

如今,嵌入式系统带来的工业年产值已超过1万亿美元。美国著名未来学家尼葛罗庞蒂曾预言:

“嵌入式智能电脑将是除了PC和互联网之外最伟大的发明。”据统计,嵌入式处理器的数量占到全球

处理器的94%,而PC机用的处理器只占6%。汽车大王福特公司的高级经理曾称:“福特卖出的‘计算

能力’已超过了IBM!”用市场观点来看,PC已经从高速增长进入到平稳发展时期,其年增长率由20

世纪90年代中期的35%逐年下降,单纯由PC带领电子产业蒸蒸日上的时代已经成为历史,基于PC时

代的概念,美国Business week杂志认为我们已经进入了“后PC时代”。

根据美国嵌入式系统专业杂志RTC报道:21世纪初的10年中,全球嵌入式系统市场需求量创造出

比PC市场大10—100倍的商机。业界早就提出的三网合一,随时随地上网的梦想正由嵌入式系统在实

现。

虽然嵌入式系统这一名词在最近几年才成为流行,但在20世纪8 0年代初期,国际上就有一些IT

组织、公司开始进行商用嵌入式系统和专用操作系统的研制。在硬件方面,32、64位微处理器成为目

前嵌入式系统的核心,它们多半是采用基于 ARM、PowerPC或者MIPS架构的RISC处理器,据 ARM公

司透露,仅在2008年,全球就批运了近40亿个 ARM处理器芯片,几乎每天1000万的出货,与PC市场

不同的是,在嵌入式系统领域,云集了上百家处理器芯片供应商,它们的产品各具特色,应用于形形色

色的产品。在软件方面,嵌入式操作系统(Embedded OperatingSystem)也蓬勃发展,目前比较成熟

的嵌入式实时操作系统有40多种,比较常见的有Linux、uClinux、WinCE、PalmOS、Symbian、eCos、

uCOS-II、VxWorks、pSOS、Nucleus、ThreadX、Rtems、QNX、Integrity、OSE、C Executive等。嵌入

式系统硬件和软件的多样性使嵌入式市场充满了活力,这也是嵌入式系统能成为引领科技发展主力的

Page 7: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 7/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

7

根本原因。

1.2 嵌入式系统的定义

什么是嵌入式系统?每个工程师都可能有自己的理解,经过对比和查询,我们认为嵌入式系统可

以定义为:以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成

本、体积、功耗严格要求的专用计算机系统。

这样看来,嵌入式系统也可以称为嵌入式计算机,它在应用数量上远远超过了各种通用计算机,

一台通用计算机的外部设备中就包含了5-10个嵌入式微处理器,键盘、鼠标、软驱、硬盘、显示卡、显

示器、Modem、网卡、声卡、打印机、扫描仪、摄像头、USB集线器等均是由嵌入式处理器控制的。制

造工业、过程控制、通讯、仪器、仪表、汽车、船舶、航空、航天、军事装备、医疗电子和消费类产品均

是嵌入式计算机的主要应用领域。

从嵌入式系统的构成来看,嵌入式系统是将先进的计算机技术、半导体技术和各个行业的具体应

用相结合后的产物,这一点就决定了它必然是一个技术密集、资金密集、高度分散、不断创新的知识集

成系统。嵌入式系统由传感器、微处理器、微控制器、存储器等一系列微电子芯片与器件以及嵌入在存

储器中的微型操作系统、控制应用软件组成,共同实现诸如实时控制、监视、管理、计算、数据处理等

各种任务。

不同功能的嵌入式系统的复杂程度有很大不同。简单的嵌入式系统仅仅具有单一的功能,存储器

中的程序就是为了这一功能设计的,其系统处理核心也是单一任务处理器。复杂的嵌入式系统不仅功

能强大,往往还配用实时操作系统,例如功能强大的智能手机等,几乎具有与微型计算机一样的功能,

嵌入式系统采用紧凑的存储器来存储代码和数据。

典型的嵌入式系统如图1.1所示,它是基于恩智浦半导体MCU的一款汽车防盗方案。已经在很多

汽车上采用。

 

图1.1 基于恩智浦MCU的汽车防盗方案

Page 8: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 8/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

8

1.3 嵌入式系统的发展历程

嵌入式系统的出现已有30多年的历史,近几年来,随着计算机、通信、消费电子融合趋势日益明

显,嵌入式系统已成为一个研究热点。纵观嵌入式系统的发展历程,大致经历了4个阶段。

第一阶段:以单芯片为核心的可编程控制器形式的系统。这类系统具有与监测、伺服设备相配合

的功能,大部分应用于一些专业性强的工业控制系统中,一般没有操作系统的支持,通过汇编语言编

程对系统进行直接控制。这一阶段系统的主要特点是:系统结构和功能相对单一,处理 效率较低,存

储容量较小,几乎没有用户接口。由于这种嵌入式系统使用简单,价格低,以前在国内工业领域应用

较为普遍,但是已经远不能适应高效的、需要大容量存储的现代工业控制和新兴信息家电等领域的需

求。

第二阶段:以嵌入式CPU为基础、以简单操作系统为核心的嵌入式系统。主要特点是:CPU种类

繁多,通用性比较弱;系统内核小,效率高;操作系统具有一定的兼容性和扩展性;应用软件较专业,用

户界面不够友好。

第三阶段:以嵌入式操作系统为标志的嵌入式系统。主要特点是:嵌入式操作系统能运行于各种

不同类型的微处理器上,兼容性好;操作系统内核小、效率高,并且具有高度的模块化和扩展性;具备

文件和目录管理、多任务、网络支持、图形窗口以及用户界面等功能;具有大量的应用程序接口 API,开

发应用程序较简单;嵌入式应用软件丰富。

第四阶段:以互联网为标志的嵌入式系统。目前大多数嵌入式系统还孤立于互联网之外,但随着

互联网的发展以及互联网技术与信息家电、工业控制技术结合日益紧密,嵌入式设备与互联网的结合

将代表嵌入式系统的未来。目前,很多公司在致力于M2M(机器对机器)通信技术,IBM还推出了“智

慧的星球”计划,这标志嵌入式技术进入到新的层次。

 

Page 9: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 9/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

9

图1.2 未来M2M通信技术设想

1.4 嵌入式系统的特征

1.功能的单一性嵌入式系统包含简单的嵌入式系统和复杂的嵌入式系统。在通常情况下,由于设计思想的原因,

一个嵌入式系统只能执行一个或一组特定的功能,而不具备如个人计算机的那种随着执行程序的不同

有着不同的功能表现。例如生活中常用的数码相机,无论功能如何强大,均只能执行照相这一特定任

务。而个人计算机则可以运行不同的执行程序进而执行如计算、字处理、统计和游戏等不同任务。

不过,随着嵌入式技术的发展,某些复杂的嵌入式设备已经能够通过更新,对自身功能进行升

级,并具有多种能力,例如智能手机,除了进行电话通信之外,还可以进行网上聊天、游戏等。

2.系统的紧凑性

由于设计指标的严格约束,嵌入式系统需要综合考虑价格、体积、功耗和可靠性等问题。简单的

嵌入式系统成本必须在几个美元之内,体积与芯片大小可比拟,并且处理速度要足够快,还需要有较

低的功耗,以便延长续航时间。

除了成本之外,复杂的嵌入式系统也同样面临上述问题。此外,由于系统的复杂性和体积以及功

耗等问题,往往在开发过程中都会遇到更为棘手的“样机建立时间”和“上市时间”等类似问题。

3.运用的实时性

很多嵌入式系统都要不断地对所处环境变化做出反应,而且要实时得到计算结果,不能延迟。例

如,汽车的定速控制器需要持续检测速度等参数,并针对不同情况作出反应,同时还要在有限的时间

内对汽车的加速度进行计算,从而控制发动机中喷油嘴开合程度,保持一定的速度,计算延迟将会导

致控制失灵。而传统计算机则主要用于计算,偶尔的计算延迟并不对系统产生致命的影响。

如下图1.3所示的倒车雷达系统,这个嵌入式系统需要实时计算汽车的速度、和车后物体的距离

等等,并进行实

 

图1.3 汽车倒车雷达系统

Page 10: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 10/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

10

1.5 嵌入式系统的组成

嵌入式系统的硬件一般包括嵌入式处理器、存储器、操作系统、应用程序和输入/输出设备,如图

1.4所示

 

图1.4 典型嵌入式系统组成框

嵌入式系统的核心由硬件部分和软件部分组成。输入系统获取外界信息,传输给核心系统进行处

理,处理后发出指令,输出系统接收到指令后进行动作。输入系统和输出系统可以很简单,如温控系统

在感知温度变化后需要使用继电器动作;也可能很复杂,如机器人的手臂,输入系统有几十个传感器,输

出系统则有近十个伺服电机,可以执行复杂的动作。

从图1.4中可以看出,嵌入式系统硬件的组成可以简单地分为嵌入式处理器和存储器。实际上,由于

超大规模集成电路的迅速发展,很多单片的嵌入式处理器中都含有丰富的资源。目前,在一片嵌入式处

理器上添加电源电路、时钟电路和存储器电路,就构成了一个嵌入式核心控制模块。软件中的操作系统

和应用程序都可以存放在存储器中。以下就嵌入式系统的不同组成部分进行简要的介绍。

1.5.1 嵌入式处理器

嵌入式处理器是嵌入式系统的硬件核心,它与通用处理器的最大区别在于嵌入式处理器大多数工

作于专门设计的应用场合,它将许多通用处理器中需要外接辅助设备的功能使用芯片内部的资源完成,

因此,系统可以设计得比较小巧,同时兼有高效率和高可靠性。

早期的处理器均采用冯.诺伊曼体系结构,而目前的嵌入式处理器大多采用哈佛体系结构。指令系

统可以是精简指令集计算机(Reduced Instruction Set Computer,RISC),也可以是复杂指令集计算机

(Complex Instruction Set Computer,CISC),CISC计算机指令集复杂多样,寻址方式众多,但是大多

数指令使用频率并不高;RISC计算机系统则只使用使用频率最高的指令,其他指令的功能用指令组合

的方式得到,从而提高了执行效率,并使CPU硬件结构设计简单化。

嵌入式处理器可以分为嵌入式微控制器、嵌入式微处理器、嵌入式DSP处理器和嵌入式片上系统

等几类,嵌入式处理器有各种不同的体系,即使在同一体系中也可能具有不同的时钟频率和数据总线宽

Page 11: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 11/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

11

度,或集成了不同的外设和接口。目前嵌入式微处理器已经超过1000多种,体系结构有30多个系列,较

成熟、应用较为广泛的有: ARM、MIPS、PowerPC、X86和SH等。这些嵌入式处理器共同占据了市场大

部分份额。

1.5.2 存储器

1.主存储器

主存储器是嵌入式微处理器能直接访问的存储器,用来存放系统和用户的应用程序以及数据。一

般在处理器内部有部分主存储器,这部分存储器通常在几十KB到数十MB之间,由于可以被CPU在一

个时钟周期内访问而无等待,因此速度较其他存储器快。有时微处理器自带的存储器不能满足需求,

这时就需要片外的大容量存储器支持。经常用做片外存储器的有ROM类和RAM类两种。其中ROM类

FLASH存储器由于寿命长、存取速度快、存储容量大、价格便宜等因素在嵌入式领域内得到了广泛的

应用。

2.高速缓冲存储器

高速缓冲存储器简称高速缓存,是一种容量小、速度快的存储器阵列,它位于主存和嵌入式微处

理器内核之间,存储的信息是处理器经过预测需要运行的代码和数据。在需要取出的时候,微处理器

尽可能从高速缓冲存储器中而不是主存储器中寻找指令。由于高速缓存的速度快,因此,可大大提高

系统性能。

3.辅助存储器

辅助存储器用来存放大量数据的程序代码或信息,它的容量大,但是读取速 度较慢,适合用于长

期存储数据和信息。

1.5.3 接口

嵌入式处理器获取外界信息并驱动输出系统产生动作或执行指令,这需要通过接口来完成。较为

常用的输入输出接口有 A/D、D/A和I/O接口等。不同系列的嵌入式处理器集成了不同的接口,可以驱动

丰富的外设资源。较为常用的接口有: A/D(模拟/数字转换接口)、D/A(数字/模拟转换接口)、串行通

信接口、并行接口、以太网接口、USB接口、音频接口、SPI接口、红外接口以及蓝牙接口等,近来,随着

触摸屏技术的发展,很多嵌入式系统将输入和输出系统整合,这是革命性的技术,会推动嵌入式系统

创新。

1.5.4 电源系统

嵌入式系统中的电源是系统组 成的重要部分,它已经不再是只需要电池或交流稳压器的简单电

Page 12: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 12/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

12

源,而是集成了电源管理和电源保护功能的复杂集成系统。目前有很多成型的产品使用方便、功能强

大,单片集成电路就可以完成电源系统的全部功能。

1.6 嵌入式操作系统简介嵌入式操作系统是一种支持嵌入式系统应用的操作系统软件。它是嵌入式系统(包括硬、软件系

统)极为重要的组成部分,通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协

议、图形界面、标准化浏览器Browser 等。嵌入式操作系统具有通用操作系统的基本特点,如能够有效

管理越来越复杂的系统资源;能够把硬件虚拟化,使得开发人员从繁忙的驱动程序移植和维护中解脱

出来;能够提供库函数、标准设备驱动程序以及工具集等。与通用操作系统相比较,嵌入式操作系统

在系统实时高效性、硬件的相关依赖性、软件固态化以及应用的专用性等方面具有较为突出的特点。

目前流行的嵌入式操作系统可以为分两类:一类是从运行在个人电脑上的操作系统移植到嵌入式

系统中,形成的嵌入式操作系统,如微软公司的Windows CE及其新版本、SUN公司的Java操作系统、

嵌入式Linux等。这类系统经过个人电脑或高性能计算机等产品的长期运行考验,技术日趋成熟,其相

关的标准和软件开发方式已被用户普遍接受,同时积累了丰富的开发工具和应用软件资源。另一类是

实时操作系统,如风河公司的VxWorks、QNX系统软件公司的QNX、 ATI的Nucle-us等,这类产品在操

作系统的结构和实现上都针对所面向的应用领域,对实时性和高可靠性等进行了精巧设计,并提供了

独立、完备的系统开发和测试工具,较多地应用在军用产品和工业控制等领域中。下面介绍典型的主

流嵌入式操作系统。

1.6.1 VxWorks

VxWorks操作系统是美国风河公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是

Tomado嵌入式开发环境的关键组成部分。它适用面广、适用性强且可靠性高,具有多达1800个功能强

大的应用程序接口( API),可以用于所有的流行的CPU平台。美国火星探测器所使用的嵌入式实时操

作系

统就是VxWorks。良好的持续发展能力、高性能的内核以及友好的用户开发环境,使其在嵌入式

实时操作系统领域占据一席之地。

VxWorks具有可裁剪微内核结构,高效的任务管理,灵活的任务间通信,微秒级的中断处理,

支持POSLX 1003.1b实时扩展标准,支持多种物理介质及标准的、完整的TCP/IP网络协议等优点,

VxWorks为程序员提供了高效的实时任务调度、中断管理,实时的系统资源以及实时的任务间通信。

应用程序员可以将尽可能多的精力放在应用程序本身,而不必再去关心系统资源的管理。该系统主要

应用在单板机、数据网络(以太网交换机、路由器)和通信方面等多方面。

Page 13: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 13/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

13

1.6.2 uC/OS-II

uC/OS-II是著名的源代码公开实时内核,是专为嵌入式系统应用设计的,可用于8位、16位和32

位单片机或数字信号处理器(DSP)。它在原版本uC/OS的基础上做了重大改进与升级,并有了近10年

的使用实践,有许多成功应用该实时内核的实例。它的主要特点如下:

* 公开源代码:很容易把操作系统移植到各个不同的硬件平台上;

* 可移植性:绝大部分源代码是用C语言编写的,便于移植到其他微处理器上;

* 可固化;

* 可裁剪性:可有选择地使用需要的系统服务,以减少所需的存储空间;

* 占先式:完全是占先式的实时内核,即总是运行就绪条件下优先级最高的任务;

* 多任务:可管理64个任务,任务的优先级必须是不同的,不支持时间片轮转调度法;

* 可确定性:函数调用与服务的执行时间具有其可确定性,不依赖于任务的多少;

* 实用性和可靠性:成功应用该实时内核的实例,是其实用性和可靠性的最好证据。

由于uC/OS-II仅是一个实时内核,这就意味着它不像其他实时操作系统那样提供给用户的只是一

些API函数接口,还有很多工作需要用户自己去完成。

1.6.3 Linux

Linux是一个类似于Unix的操作系统。它起源于芬兰一个名为Linus Torvalds的业余爱好者,但是

现在已经是最流行的一款开放源代码的操作系统。Linux从1991年问世到现在,短短十几年的时间内

已发展成为一个功能强大、设计完善的操作系统,伴随网络技术进步而发展起来的Linux OS已成为微

软公司的Windows的强劲对手。Linux系统不仅能够运行于PC平台,还在嵌入式系统方面广泛应用。

Linux是个与生俱来的网络操作系统,成熟而且稳定。因为是源代码开放软件,所以不存在黑箱技

术,任何人都可以修改它,或者用它开发自己的产品。Linux系统是可以定制的,系统内核目前已经可以

做得很小。一个带有中文系统及图形化界面的核心程序也可以做到不足1MB,而且同样稳定。Linux作

为一种可裁减的软件平台系统,是发展未来嵌入设备产品的绝佳资源,遍布全球的众多Linux爱好者又

能给予Linux开发者强大的技术支持。因此,Linux作为嵌入式系统新选择,是非常有发展前途的。它的

特点是:

* 与硬件芯片的紧密结合:后PC时代的智能设备已经逐渐模糊了硬件与软件的界限,SOC系统

(System On Chip)的发展就是这种软硬件无缝结合趋势的证明,将来可能出现在处理器片内嵌进操

作系统的代码模块。嵌入式Linux比一般操作系统更加接近于硬件,并具备了嵌入式RTOS的一切特

征:实时性及与嵌入式处理器的紧密结合;

* 开放的源代码:代码的开放性主要体现在源代码可获得上,Linux代码开发就像是“集市式”开

Page 14: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 14/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

14

发,任意选择并按自己的意愿整合出新的产品。

1.6.4 Windows CE

Windows CE是微软开发的一个开放的、可升级的32位嵌入式操作系统,是基于掌上型电脑类的

电子设备操作系统,它是精简的Windows 95操作系统。Windows CE的图形用户界面相当出色。CE中

的C代表袖珍(Compact)、消费(Consumer )、通信能力(Connectivity)和伴侣(Companion);E代

表电子产品(Electronics)。与Windows 95/98/NT不同的是,Windows CE所有源代码全部由微软自行

开发,但Windows CE是基于Win32API重新开发的新型信息设备平台。Windows CE具有模块化、结

构化和基于Win32应用程序接口以及处理器无关等特点。

Windows CE 1.0最早于1996年推出,是单色的Windows 95简化版本。1997年秋季Comdex大会

上公布的Windows CE 2.0仍是基于Win95的操作系统,效率远高于1.0版。Windows CE 3.0是微软的

Windows Compact Edition,已摆脱旧有的Windows 95简化格式,是一套全新的操作系统,支持5种

CPU:x86, PowerPC, ARM, MIPS, SH3/4。并且改名为Windows for Pocket PC,简称Pocket PC。

2002年1月微软又推出Windows CE.Net,即Windows CE 4.0。2004年5月份推出Windows CE 5.0,

开放有250万行源代码。2006年11月,微软推出Windows Embedded CE 6.0。

Windows CE可以使用在各式各样的系统上,最有名的是Pocket PC以及微软的SmartPhone。

其他较不为人知的设备包括微 软的车用计算机、机顶盒、生产在线的控制设备、公共场所的信息 站

(Kiosk)、电子辞典等,有些设备甚至没有任何人机界面。

Windows CE的设计目标是:模块化及可伸缩性、实时性能好、通信能力强大、支持多种CPU。它

的设计可以满足多种设备的需要,一个典型的基于Windows CE的嵌入系统通常为某个特定用途而设

计,并在不联机的情况下工作。它要求所使用的操作系统体积较小,内部兼有对中断的响应功能。它的

的特点有:

* 具有灵活的电源管理功能,包括睡眠/唤醒模式;

* 使用了对象存储(object store)技术,包括文件系统、注册表及数据库。它还具有很多高性能、

高效率的操作系统特性,包括按需换页、共享存储、交叉处理同步、支持大容量堆等(heap);

* 拥有良好的通信能力。广泛支持各种通信硬件,亦支持直接的局域连接以及拨号连接,并提

供与PC、内部网以及互联网的连接,还提供与Windows9x/NT的最佳集成和通信;

* 支持嵌套中断,允许更高优先级别的中断首先得到响应,而不是等待低级别的ISR完成。这使

得该操作系统具有嵌入式操作系统所要求的实时性;

* 更好的线程响应能力。对高级别IST(中断服务线程)的响应时间上限的要求更加严格,在线程

响应能力方面的改进,帮助开发人员掌握线程转换的具体时间,并通过增强的监控能力和对硬件的控

Page 15: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 15/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

15

制能力帮助他们创建新的嵌入式应用程序;

* 256个优先级别。可以使开发人员在控制嵌入式系统的时序安排方面有更大的灵活性;

* Windows CE的 API是Win32API的一个子集,支持近1500个Win32API。有了这些 API,足可

以编写任何复杂的应用程序。当然,在Windows CE系统中,所提供的 API也可以随具体应用的需求而

定。

在掌上型电脑中,Windows CE包含如下一些重要组件:Pocket Outlook及其组件、语音录音机、

移动频道、远程拨号访问、世界时钟、计算器、多种输入法、GBK字符集、中文T TF字库、英汉双向词

典、袖珍浏览器、电子邮件、Pooket Office、系统设置、Windows CE Services软件等。

1.6.5 RTEMS

RTEMS,即:实时多处理器系统( Real Time Executive for Multiprocessor Systems )是一个开

源的无版税实时嵌入操作系统RTOS。它最早用于美国国防系统,早期的名称为实时导弹系统(Real

Time Executive for Missile Systems),后来改名为实时军用系统(Real Time Executive for Military

Systems),现在由OA R公司负责版本的升级与维护。目前无论 是航 空航 天、军工,还是民用领域

RTEMS都有着极为广泛的应用。

从体系结构上来看,RTEMS是微内核抢占式的实时系统,它具有下面的优点:

* 优秀的实时性能;

* 支持硬实时和软实时(可抢占内核);

* 支持优先级继承,防止优先级反转 ;

* 支持单周期调度;

* 支持优先级高度协议;

* 非常稳定;

* 运行速度快;

* 支持多种CPU,无论是 ARM、MIPS、PowerPC、i386还是DSP、 AVR、Zilog,都可以找到对应

的BSP;

* 高度可剪裁内核(目标系统小只有30Kb;大可上百兆);

* 占用系统资源小,在32位系统中最小的内核只有30Kb左右;

* 支持多处理器(不同于SMP,RTEMS中多个处理器是协作关系);

* 提供POSIX API,Linux/UNIX下的程序可以方便移植;

* 提供完整的BSD的TCP/IP协议栈以及FTP、WebServer 、NFS等服务;

* 使用面向对象思想设计,可以大大缩短开发周期;

Page 16: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 16/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

16

* 核心代码使用C/C++写作,可移植性好;

* 支持ISO/ANSI C库;

* 支持ISO/ANSI C++库以及STL库;

* 支持精简的可重入glibc库;

* 支持图形用户界面(Microwindows / Nano-X);

* 支持文件系统(FAT,IMFS等);

* 支持多种调试模式(包括GDB,DDD,串口调试,以太网调试);

* 支持32位处理器,Tiny RTEMS项目将对8位和16位处理器进行支持 ;

* 支持JAVA虚拟机。

RTEMS的官方网站是www.rtems.com,当前最新的稳定版本是4.7.1,开发版是4.9。在国内,

RTEMS主要用在航空航天和军工领域。

RTEMS在性能上丝毫不输于VxWorks,在通信、航空航天、工业控制、军事等领域有着非常广泛

的应用,在系统实现上,RTEMS和VxWorks以及NucleusPlus的实现基本相同。

1.6.6 Palm OS

Palm是3Com公司的产品,其操作系统为Palm OS。Palm OS是一种32位的嵌入式操作系统。

Palm提供了串行通信接口和红外线传输接口,利用它可以方便地与其他外部设备通信、传输数据。

Palm OS是一套极具开放性的系统,现在有大约数千种专门为Palm OS编写的应用程序。从程序内容

上看,小到个人管理、游戏,大到行业解决方案,Palm OS无所不含。在丰富的软件支持下,基于Palm

OS的掌上电脑功能得以不断扩展。

Palm OS是一套专门为掌上电脑开发的OS。在编写程序时,Palm OS充分考虑了掌上电脑内存相

对较小的情况,只占用非常小的内存。由于基于Palm OS编写的应用程序占用的空间也非常小(通常只

有几十KB),因此,基于Palm OS掌上电脑(虽然只有同MB的RAM)可以运行众多应用程序。

由于Palm产品的最大特点是使用简便、机体轻巧,因此决定了Palm OS具有以下特点:

* 操作系统的节能功能:由于掌上电脑要求使用电源尽可能小,因此在Palm OS的应用程序中,

如果没有事件运行,则系统设备进入半休眠(Doze)状态;如果应用程序停止活动一段时间,则系统自

动进入休眠(Sleep)状态;

* 合理的内存管理:Palm的存储器全部是可读写的快速RAM,动态RAM(Dynamic RAM)

类似于PC机上的RAM,它为全局变量 和其他不需永久保存的数据提供临时的存储空间;存储RAM

(Storage RAM)类似于PC机上的硬盘,可以永久保存应用程序和数据;

* Palm OS的数据以数据库(Database)的格式存储:数据库由一组记录(Records)和一些数据

Page 17: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 17/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

17

库头信息组成。为保证程序处理速度和存储器空间,在处理数据的时候,Palm OS不是把数据从存储

堆(Storage Heap)拷贝到动态堆(Dynamic Heap)后再进行处理,而是在存储堆中直接处理。为避免

错误地调用存储器地址,Palm OS规定,一切数据处理都必须调用其内存管理器的 API来实现;

* PC机协同工作:Palm OS HotSync软件允许你将掌上电脑信息备份到PC机上,这样即使你的

掌上电脑丢失或者损坏,数据和大部分应用信息也可以恢复,保证数据永不丢失;

* 易于使用;无论同步数据,安排日程,还是使用palm内置的手写输入法输入英文信息,或者利

用其他语言和方式的文本输入工具,Palm总是提供简单快捷用法;

* 有线和无线通信:大部分使用Palm Powered的硬件具有红外传送功能,使掌上电脑用户之间

很容易交换信息,许多型号Palm设备可以利用有线调制解调器,支持高速无线局域网连接和蓝牙无线

网络标准的掌上电脑扩展设备。一些Palm系统具有移动电话功能,支持CDMA和GSM网络。

1.6.7 国产嵌入式实时操作系统

1.DeltaOS

DeltaOS是中国完全自主研发的最成熟的嵌入式强实时多任务操作系统,该操作系统已应用于飞

机导航、核动力控制、雷达终端录取平台等军用与民用领域。DeltaOS可以嵌入到以32位中央处理器

为核心的各种电子设备中;作为应用程序运行的支撑环境,DeltaOS所提供的各种机制可以使电子设

备中的应用程序在多任务环境下运行,同时满足开发人员在开发电子设备时的基本需求,比如:实时响

应外部事件、存储管理以及联网需求等。

2.Hopen操作系统

Hopen是由北京凯思软件集团开发的嵌入式操作系统,是我国具有自主知识产权的智能操作系

统。Hopen是针对嵌入式系统特点设计的一个实时多任务操作系统,由一个体积很小的微内核及一些

可以根据需要进行定制的系统模块组成。Hopen核心一般为10KB左右大小,即便加上其它必要的模

块,所占用的空间也很小,并具有实时、多任务、多线程的系统特征。

虽然本土公司积极开发国产嵌入式操作系统,但是目前看来,这些系统的应用率还比较低,本土

嵌入式操作系统的路还很长。

1.7 嵌入式系统在不同领域的应用

嵌入式技术应用前景广阔,领域包括:信息家电、工业控制、环境工程、军事国防、汽车电子、医疗

电子等。

1.信息家电

Page 18: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 18/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

18

嵌入式系统在信息家电中应用得 很广泛,如移动电话、数码相机、便携式摄像机、MP3/MP4、

GPS、PMP等产品中,均可以见到嵌入式技术。目前,具有互动用户界面(例如触摸屏控制)、能够远

程控制、智能管理的信息家电代表了嵌入式系统的发展方向。

2.工业控制

目前有大量的嵌入式处理器应用于诸如工业过程控制、数控设备、电力系统运行和检测等方面。

早期的工业用嵌入式系统产品虽然只采用低级处理器,完成简单的控制和监控任务,但是其使用数量

非常巨大。随着技术的发展,出现了具有智能的嵌入式工控系统,使得32位处理器成为主流。

在工业控制设备中,一些工业控制机采用以X86为核心处理器的计算机系统。由于它们具有体积

小、稳定可靠等特点,受到用户的青睐。不过这些工业控制机采用的往往是DOS 和Windows操作系

统,虽然具有嵌入式的特点,却不能称为纯粹的嵌入式系统。

随着节能环保意识的提升,32位MCU在工业控制中的应用加快。

3.环境工程

“传感器网络”作为未来四大支柱产业之一,经常用于高危环境的检测中。当前许多公司都开发

针对环境检测的传感器网络类嵌入式节点。

4.军事国防

嵌入式系统广泛应用于军事指挥、通信系统和兵器系统中。当前各种先进的武器控制系统如导弹

和鱼雷控制,以及坦克、飞机中的稳定控制、成像控制、制导系统乃至单兵系统等,都有嵌入式系统的

身影。

例如,下图是洛克希德.马丁公司推出的一种可大幅度增加士兵负重能力的金属骨架。这种新型装

备全称“人类负重外骨骼”(简称HULC),是一种能够通过提供外力来满足士兵对机动性和支撑性需

要的机器人技术装备。洛.马公司介绍称,目前,HULC系统的最大负重量可以达到90.7千克。

士兵穿上这个HULC就变身为科幻电影中的大力士,可以背负很重的装备仍然健步如飞、轻松地翻

山越岭,其实HULC的核心就是基于性能强大的微控制器和传感器的嵌入式系统,它通过传感器感测

士兵的每一个动作,然后微控制器让HULC背负的重量通过电池驱动的金属骨骼转移到地面上,从而

减轻士兵的负荷。

Page 19: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 19/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

19

  图1.5 可增加士兵负重能力的金属骨架系统

5.汽车电子

随着汽车向机电化和智能化发展,汽车中的嵌入式应用日益普遍,据统计,以前平均每部汽车大

约会用到20颗MCU,而现在汽车中使用的MCU数量已达40-60颗,部分高档轿车MCU数量已经达到

上百颗,这些MCU应用于汽车车身控制、信息娱乐、发动机控制和安全防盗等各个方面,尤其是近年

来,随着汽车总线技术如CAN总线、Lin总线的普及,汽车嵌入式应用呈现加速势态。

6.医疗电子

随着越来越多的国家步入老龄化,人们的保健意识日益提高,这给嵌入式系统带来了新的用武之

地,我们目前熟悉的血糖仪、数字体温计、血压计等便携式保健产品都属于嵌入式系统的范畴,而B超

设备、监护仪、CT等大型医疗设备也属于嵌入式系统,此外,那些可以进入人体体内进行疾病探测和

治疗的药丸摄像机、探头等也属于嵌入式系统。

 

图1.6 藏有摄像机的药丸

Page 20: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 20/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

20

第2章 微控制器(MCU)概述

微控制器(Microcontroller )是将微型计算机的主要部分集成在一个芯片上的单芯片微型计算

机。由于微控制器目前在产品的品种和数量上是所有嵌入式处理器中最多的,其单片化使应用系统的

体积大大减小,从而使功耗和成本大幅度下降、可靠性提高,决定了微控制器是嵌入式系统的应用主

流。所以,从本章开始将重点介绍微控制器原理、结构及开发。

微控制器诞生于20世纪70年代中期,经过20多年的发展,其成本越来越低,而性能越来越强大,

这使其应用已经无处不在遍及各个领域。例如电机控制、条码阅读器/扫描器、消费类电子、游戏设

备、电话、楼宇安全与门禁控制、工业控制与自动化和白色家电(洗衣机、微波炉)等。微控制器又称为

单片机,因为它将微型计算机的主要组 成CPU、存储器和输入输出单元都集成在了一个单芯片上,故

称单片机。微控制器一般以某个微处理器内核为核心,芯片内部集成了存储器、总线、定时器、看门

狗、I/O、 A/D D/A、LCD驱动、电源管理等功能模块,为适应嵌入式应用,一般微控制器会衍生出多个

型号,以便让它和应用最大程度匹配,所以微控制器的种类非常繁多,据不完全统计,全球目前单片机

种类已经超过上千种。

微控制器可从不同方面进行分类:根据 数据总线宽度可分为8位、16位和3 2位;根据存储器结

构可分为哈佛结构(Harvard)和冯.诺伊曼(Von Neumann)结构;根据内嵌程序存储器的类别可分为

OTP、掩膜、EPROM/EEPROM和闪存Flash;根据指令结构又可分为CISC(Complex Instruction Set

Computer)和RISC(Reduced Instruction Set Computer )微控制器。

2.1 什么是哈佛结构和冯.诺伊曼结构

哈佛结构是一种将程序指令存储和数据存储分开的存储器结构,中央处理器首先到程序指令存

储器中读取程序指令内容,解码后得到数据地 址,再到相应的数据存储器中读取数 据,并进行下一

步的操作(通常是执行)。程序指令存储和数据存储分开,可以使指令和数据有不同的数据宽度,如

Microchip公司的PIC16芯片的程序指令是14位宽度,而数据是8位宽度。

哈佛结构的微处理器通常具有较高的执行效率。其程序指令和数据指令分开组织和存储,执行

时可以预先读取下一条指令。目前使用哈佛结构的中央处 理器和微 控制器有很多,除了上面提到的

Microchip公司的PIC系列芯片,还有摩托罗拉公司的MC68系列、Zilog公司的Z8系列、 ATMEL公司的

 AVR系列和 ARM公司的 ARM9、 ARM10和 ARM11以及 ARM公司最新的Cortex-M3内核都属于哈佛结

构,基于该内核的恩智浦LPC1700系列MCU具备极高的运算能力和中断响应能力。

冯.诺伊曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器

Page 21: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 21/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

21

结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据

的宽度相同,如英特尔公司的8086中央处理器的程序指令和数据都是16位宽。

目前使用冯.诺伊曼结构的中央处理器和微控制器有很多。除了上面提到的英特尔公司的8086,英

特尔公司的其他中央处理器、 ARM公司的 ARM7、MIPS公司的MIPS处理器也采用了冯.诺伊曼结构。

2.2 微控制器的发展历程

微控制器就是单片机,所以微控制器的发展历史就是单片机的发展历史,单片机最早被用在工业

控制领域。最初的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更

容易集成进复杂的而对体积要求严格的控制设备当中。Zilog的Z80是最早按照这种思想设计出的处理

器,从此以后,单片机和专用处理器的发展便分道扬镳。

早期的单片机都是8位或4位的。其中最成功的是Intel的8031,因为简单可靠而性能不错获得了好

评。此后在8031上发展出了MCS51系列单片机系统。基于这一系统的单片机系统直到现在还在广泛

使用。随着工业控制需求提高,开始出现了16位单片机,但因为性价比不理想并未得到很广泛的应用。

90年代后随着消费电子产品大发展,单片机技术得到了巨大的提高。随着 Intel i960系列特别是后来的

 ARM系列的广泛应用,32位单片机迅速取代16位单片机的高端地位,并且进入主流市场。而传统的8

位单片机的性能也得到了飞速提高,集成度大大提升,其处理能力比最初的产品提高了数百倍。目前,

高端的32位单片机主频已经超过1GHz,性能可以和PC处理器媲美,一些公司还推出了1美元价格的

32位MCU,其性价比得到极大提升。当代单片机系统已经不再只在裸机环境下开发和使用,大量专用

的嵌入式操作系统被广泛应用在全系列的单片机上。

 

图2.1 最早的微控制器Zilog公司的Z80

纵观单片机的发展历史,可以看到单片机经历了SCM、MCU、SoC三大阶段。

第一阶段:SCM即单片微型计算机(Single Chip Microcomputer )阶段,主要是寻求最佳的单片

形态嵌入式系统的最佳体系结构,在开创嵌入式系统独立发展道路上,Intel公司功不可没。

Page 22: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 22/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

22

第二阶段:MCU即微控制器(Micro Controller Unit)阶段,主要的技术发展方向是:不断扩展满

足嵌入式应用中对象系统要求的各种外围电路与接口电路,凸显其对象的智能化控制能力。它所涉及

的领域都与对象系统相关,因此,发展MCU的重任不可避免地落在电气、电子技术厂家身上。从这一

角度来看,Intel逐渐淡出MCU的发展也有其客观因素。在发展MCU方面,最著名的厂家当数Philips公

司。

Philips公司以其在嵌入式应用方面的巨大优势,将MCS-51从单片微型计算机迅速发展到微控

制器。因此,当我们回顾嵌入 式系统发展道 路时,不要忘记 Intel和Philips的历史功绩,现在恩智浦

(NXP)公司除了继续将Philips公司的单片机发展外,还推出了大量基于 ARM内核的微控制器,在后

面的章节我们将详细介绍。

第三阶段:随着微电子技术、IC设计、EDA工具的发展,基于SoC的单片机应用系统设计会有较

大的发展。因此,对单片机的理解可以从单片微型计算机、单片微控制器延伸到单片应用系统。

从工艺角度对单片机的发展进行概括,基本发展历程如下:

第一代:七十年代后期,4位逻辑控制器件发展到8位。使用NMOS工艺(速度低,功耗大、集成度

低)。代表产品:MC6800、Intel 8048等。

第二代:八十年代初,采用CMOS工艺,并逐渐被高速低 功耗的 HMOS工艺代替。代表产品:

MC146805、Intel 8051等。

第三代:近十年来,MCU的发展出现了许多新特点:

* 在技术上,由可扩展总线型向纯单片型发展,即只能工作在单片方式;

* MCU的扩展方式从并行总线型发展出各种串行总线;

* 将多个CPU集成到一个MCU中;

* 在降低功耗,提高可靠性方面,MCU工作电压已降至3.3V。

第四代:FLASH的使用使MCU技术进入了第四代。

2.3 微处理器的应用领域

目前微控制器渗透到我们生活的各个领域,导弹的导航装置,飞机上各种仪表的控制,计算机的

网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华

轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都

离不开微控制器,更不用说自动控制领域的机器人、智能仪表、医疗器械了。因此,微控制器的学习、

开发与应用将造就出一批计算机应用与智能化控制的科学家、工程师。

微控制器的应用大致可分如下几个范畴:

1.在智能仪器仪表上的应用

Page 23: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 23/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

23

微控制器具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于

仪器仪表中,结合不同类型的传感器,可实现诸如电压、功率、频率、湿度、温度、流量、速度、厚度、

角度、长度、硬度、元素、压力等物理量的测量。采用微控制器控制使得仪器仪表数字化、智能化、微

型化,且功能比起采用电子或数字电路更加强大。例如精密的测量设备(功率计,示波器,各种分析

仪)。

2.在工业控制中的应用

用微控制器可以构成形式多样的控制系统、数据采集系统。例如工厂流水线的智能化管理,电梯

智能化控制、各种报警系统,与计算机联网构成二级控制系统等。

3.在家用电器中的应用

可以这样说,现在的家用电器基本上都采用了微控制器控制,从电饭煲、洗衣机、电冰箱、空调

机、彩电到其他音响视频器材,可谓五花八门,无所不在。

目前,大量微控制器还应用于电子宠物、智能玩具和玩具机器人,这些微控制器的应用提升了电子

产品的智能级别,使电子产品可以和人产生互动,例如下图所示的恐龙Pelo采用了多个微控制器和传感

器,可以根据人的动作而做出不同的反应。

 

图2.2 很有人气的智能恐龙宝宝pelo就采用了多个MCU

Page 24: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 24/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

24

4.在计算机网络和通信领域中的应用

现代微 控制器普遍具备通信接口,可以很方便地与计算机进行数据 通信,为在计算机网络和通

信设备间的应用提供了极好的物质条件,现在的通信设备基本上都实现了微控制器智能控制,从电话

机、小型程控交换机、楼宇自动通信呼叫系统、列车无线通信、再到日常工作中随处可见的移动电话,

集群移动通信,无线电对讲机等。

5.微控制器在医用设备领域中的应用

微控制器在医用设备中的用途亦相当广泛,例如医用呼吸机、各种分析仪、监护仪、超声诊断设备

及病床呼叫系统等等。

6.在各种大型电器中的模块化应用

某些专用微控制器设计用于实现特定功能,从而在各种电路中进行模块化应用,而不要求使用人

员了解其内部结构。在大型电路中,这种模块化应用极大地缩小了体积,简化了电路,降低了损坏、错

误率,也方便于更换。

此外,微控制器在工商、金融、科研、教育、国防航空航天等领域都有着十分广泛的用途。目前微

控制器实用数量呈现指数上升趋势,仅2009年全球就会消耗上百亿个微控制器!

2.4 微控制器的组成

微控制器的构成和计算机系统很相似,基本由五大部分组成,分别是CPU系统、程序存储器、数

据存储器、各种 I/O端口、基本功能单元(定时器/计数器等)等。

1.CPU系统

CPU系统包括有CPU、时钟系统、复位、总线(BUS,即信号的公共通道)控制逻辑。

* CPU:单片机中的CPU与微型计算机中的CPU有所不同,它的特点是,面向控制、面向嵌入系

统、面向单芯片化。

* 时钟系统:时钟系统用于产生单片机工作所需的时钟信号。它必须满足CPU及单片机内各单元

电路对时钟的要求。

* 复位电路:复位电路应满足上电复位、信号控制复位的要求。

* 总线控制逻辑:总线控制逻辑应满足CPU对内部总线和外部总线的控制要求。

2.程序存储器

程序存储器是一种只读存储器ROM(Read Only Memory),用它来固化单片机的应用程序和一些

表格常数。单片机生产厂家按单片机内部程序存储器的不同结构,形成单片机的不同结构类型,计有:

Page 25: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 25/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

25

(1)Mask ROM型 (2)EPROM型 (3)ROM less型 (4)OTP ROM (5)Flash ROM(MTP ROM)型

前三种程序存储器的单片机是早期的产品,目前EPROM、ROM Less型已较少使用。

3.数据存储器RAM

RAM是一种可读写的存储器,也叫随机存储器。单片机内部的RAM除了作为工作寄存 器、位标志

和堆栈区以外的单元都可以作为数据缓冲器使用,存放输入的数据或运算的结果。

  由于单片机主要是面向测控系统,所以单片机内部的数据存储器容量较小,而且都使用静态随机存

储器SRAM(Static Random Access Memory)。

4.各种I/O端口

I/O端口是计算机的输入、输出接口。这些I/O端口可分为以下几种类型:

* 总线输入/输出端口

* 用户I/O端口。由用户用于外部电路的输入/输出控制

* 单片机内部功能的输入/输出端口。例如,定时器/计数器的计数输入、外部中断源输入等。为

减少单片机引脚数量,一般 I/O口都有复式功能。例如不使用外部总线时,总线端口可出让给用户做输

入/输出端口用

从I/O口的结构上还可以分为并行 I/O口,即多位数据一起输出或输入,这种形式传送数据速度快

但使用的引脚多。另—种I/O口称为串行I/O口,即传送数据是顺序输出或输入,这种形式可大大减少 I/

O口的引脚数,但传送数据较慢。

5.基本功能单元

基本功能单元是为满足单片机测控功能而设置的一些电路,是用来完善和扩大计算机功能的一些

基本电路,如定时器/计数器,中断系统等。定时器/计数器在实际应用中作用非常大,如精确的定时,

或者对外部事件进行计数等。典型51系列单片机组成如2.3所示。

图2.3 MCS-51单片机结构框图

Page 26: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 26/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

26

近年来,随着半导体工艺技术的发展,微控制器的集成度日益提高,32位微控制器相比最初的51

单片机复杂了很多倍,如下图2.4所示为恩智浦公司LPC1700系列单片机的组成框图。

从图中可知,LPC1700系列MCU以 ARM Cortex-M3为内核,采用3级流水线和哈佛结构,带独立的本

地指令和数据总线以及用于外设的高性能的第三条总线,并包含一个支持分支预测的内部预取指单

元。

 

图2.4 恩智浦公司LPC1700系列单片机方框图

2.5 微控制器内核体系结构 

体系结构是指从程序员的角度观察到的处理器组织方式,所以也称为处理器的构成模型,其主要

内容为处理器的寄存 器组织、对存储器的寻址方式、指令系统等,微控制器自诞生发展到现今,其内

核体系在众多MCU供应商的推动下呈现多样化的发展势态,目前我们比较熟悉的内核有8051内核、TI

16位RISC混合信号处理器(代表产品为MSP430产品系列)、瑞萨公司的CISC微控制器(代表产品为

“RX”系列MCU)、飞思卡尔的ColdFire内核(代表为其ColdFire系列MCU)、NEC的V850内核(代表

为NECV850系列MCU)、MIPS内核、 ARM内核(代表为大量基于 ARM架构的32位微控制器),由于

目前基于32位 ARM内核的微 控制器出货增长非常快,所以本电子书对 ARM内核做详细介绍,其他内

核知识大家可以浏览相关资料。

   ARM内核介绍:

 ARM(advanced RISC Machines),既可以认为是一个公司的名字,也可以认为是对一类微处理

器的通称,还可以认为是一种技术的名字。1991年 ARM公司成立于英国剑桥,最初公司准备开发计算

机芯片,最后,转型为出售芯片设计技术的授权(IP)。目前,采用 ARM技术知识产权(IP)核的微处理

器,即通常所说的 ARM 微处理器已广泛应用于工业控制、消费电子产品、通信系统、网络系统、无线

Page 27: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 27/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

27

系统等各个领域,在很多半导体厂商采用 ARM7、 ARM9内核开发微控制器后, ARM公司还开发了专门

针对MCU的内核Cortex-MX系列,这个系列的内核一经推出就受到厂商的关注,很多公司推出了基于

Cortex-M3内核的微控制器,本电子书就主要介绍这类MCU产品。

1. ARM内核的特点

* 体积小、低功耗、低成本、高性能;

* 支持Thumb(16位)/  ARM(32位)双指令集,兼容8位和16位器件;

* 大量使用寄存器,指令执行速度更快;

* 大多数数据操作都在寄存器中完成

* 寻址方式灵活简单,执行效率高

* 指令长度固定。

2. ARM内核系列

目前常用的 ARM微处理器有 ARM7系列、 ARM9系列、 ARM9E系列、 ARM10系列、SecurCore系

列、Intel的StrongARM、Intel的XScale(现已出售给Marvell)、 ARM11、 ARM Cortex系列等等。其中,

 ARM7、 ARM9、 ARM 9E和 ARM10E为4个通用处理器系列,每一个系列提供一套相对独特的性能来

满足不同应用领域的需求。例如, ARM7系列适用于工业控制、网络设备、移动电话等应用, ARM9、

 ARM9E和 ARM10E系列则更适合无线设备、消费类电子产品设计,SecurCore系列专门为安全要求较

高的应用而设计。Cortex系列又分为A系列(高性能应用)、R系列(实时应用)和M系列(MCU)等,它

们采用 ARM V7架构,在性能和低功耗方面都有更大提升。

我们将在第三章对 ARM内核做详细介绍。

3.主流 ARM微控制器供应商介绍

(1)恩智浦公司(NXP)

恩智浦半导体是2006年从皇家飞利浦体系中独立出的半导体公司,共有超过670 0位研发工程

师,总部仍设在荷兰Eindhoven,为欧洲第二大半导体公司,恩智浦公司的 ARM MCU主要为LPC系

列芯片,主要是32位的LPC3000系列、LPC2000系列、LPC1000系列、LH7A系列、LH7系列和8位

LPC900系列、LPC700系列等。

2009年6月,恩智浦半导体宣布 根据 嵌入式 微处理器基准协 会(EEMBC)的测试结果,恩智浦

LPC1700系列 MCU成为业界性能最高的Cortex-M3微控制器。EEMBC测试结果显示,以相同时钟

速度运行时,LPC1700执行应用程序代码的速度比其它主要Cortex-M3竞争产品平均快35%。当

LPC1700以较高时钟速度运行时,恩智浦的性能优势愈加显著。LPC1700已通过EEMBC 72,100和

Page 28: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 28/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

28

120MHz认证。

恩智浦LPC1700系列得到广泛的工具厂商的支持,与目前支持恩智浦基于 ARM的32位微控制器

的工具厂商一致,如Keil( ARM旗下公司)、IAR Systems、ZLG等公司。

 

图2.5 恩智浦LPC1700系列MCU

(2)德州仪器(TI)

2009年7月,德州仪器(TI )正式宣布成功收购32位MCU供应商Luminary Micro。此举不仅壮大了

德州仪器微控制器产品阵营,更直接进入 ARM微控制器领域,TI成功收购Luminary Micro后,将有超

过130种基于 ARM Cor tex- M3的MCU产品。

在32位通用处理器领域,Luminary的Stellaris系列MCU定位于要求强大控制处理与连接功能的

低成本应用,如运动控制、远程监控、楼宇控制、工厂自动化、测量测试和医疗仪表等。最新推出的第

四代Stellaris器件——LM3S9000 Series系列在通用处理性能方面取得了最新突破,实现了连接性、

存储器配置以及高级运动控制的结合,还可为客户提供业界标准 ARM Cor tex-M3内核的通用处理性

能以及Stellaris产品系列的高级通信功能,如10/100以太网MAC+PHY、CAN、USB OTG、USB主机/ 

装置、SSI / SPI、UART、I2S以及 I

2C等。

(3)意法半导体(ST)

意法半导体的STM32系列32位闪存微控制器基于 ARM Cortex-M3内核,在结合了高性能、低功

耗和低电压特性的同时保持了高度的集成性能和简易的开发特性。2009年6月,意法半导体宣布推出

最新的STM32互联系列(Connectivity Line)微控制器,这款STM32互联系列让设计人员可以在同时

需要以太网、USB、CAN和音频级I2S接口的产品设计中发挥工业标准的32位微处理器的优异性能。

目前其互联系列下设两个产品系列:STM32F105和STM32F107。STM32F105系列集成一个全速

USB2.0  Host / Device / OTG接口和两个具有先进过滤功能的CAN2.0B控制器;STM32F107系列则在

STM32F105系列基础增加一个10/100以太网媒体访问控制器(MAC),以完整的硬件支持IEEE1588

Page 29: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 29/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

29

精确时间协议,使设计人员能够为实时应用开发以太网连接功能。内置专用缓存让USB OTG、两个

CAN控制器和以太网接口同时工作,以满足通信网关应用的需求,以及各种需要灵活的工业标准连接

功能的挑战性需求。

(4)爱特梅尔公司(Atmel)

 At me l公司在微控制器领域也深耕多年,其产品有早期推出的8051内核的8位MCU和现今推出

的基于 ARM Cor tex- M0的32位微控制器,32位MCU中有采用 ARM7内核的SA M7系列MCU和采用

 ARM9内核的SAM9系列MCU,也有采用Cortex-M3的SAM3系列MCU。

2009年8月, Atmel公司宣布推出400MHz ARM926嵌入式微控制器系列的首款产品SAM9G45,

该器件支持第二代双倍数据速率DRAM(DDR2 ),并针 对楼 宇自控系统、数据记录仪、销售终端机

(POS)、报警系统和医疗设备等工业应用而优化。 ARM926外设包括带有片上物理层的ECHI兼容高速

USB、双EBI、10/100以太网MAC、LCD和触控屏控制器、可编程1.8或3.3V I/O供电电压,以及高数据

带宽架构。

 Atmel的基于Cortex-M3的MCU附加特性包括两个分别为10和12位的8通道模数转换器( ADC),

后者带有集成可编程增益放大器(PGA )、可省去外部运算放大器及1Msps采样速率的差分和单端输

入、4个UART、5个SPI、2个I2C、I

2S、定时器、PWM、128位独特ID,以及功率和重置管理功能。外部

总线接口提供8位和16位数据总线宽度的选择,用于扩展存储器或连接外部FPGA和 ASSP。SAM3U

的供电电压范围为1.62V至3.6V,这是基于Cortex-M3的微控制器罕有的特性。爱特梅尔还是首家在

 ARM闪存微控制器中采用全速USB作为必然外设的厂商。

Page 30: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 30/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

30

第3章 ARM内核详解

作者:白延敏 南京航空航天大学

前面的章节中我们介绍了微控制器的基本组成,本章我们将详细介绍流行的 ARM MCU内核知

识。

3.1  ARM嵌入式处理器简介

 ARM系列嵌入式处理器是英国先进RISC(Reduced Inst ruct ion Set Computer)机器公司

(Advanced RISC Machines,简称 ARM公司)的产品。 ARM公司是业界领先的知识产权供应商,与一

般的公司不同, ARM公司既不生产芯片,也不销售芯片,而是设 计出高性能、低功耗、低成本和高可

靠性的IP内核,如 ARM处理器内核(如 ARM7TDMI、 ARM9TDMI、 ARM10TDMI等)和 ARM处理器宏核

( ARM720T、 ARM920T/922T/940T、 ARM1020E/1022E等),授权给各半导体公司使用;半导体公司

( ARM公司合作伙伴)在 ARM技术的基础上,根据自己公司的产品定位,添加自己的设计并推出各种嵌

入式微处理器MPU或微控制器MCU芯片产品;最后由OEM客户采用这些芯片来构建基于 ARM技术的

最终应用系统产品。

由上面可以得知, ARM并不是一款处理器的名称,它只是一个公司的名称,或者说是嵌入式处理

器的内核名称。所以, ARM嵌入式处理器应该理解为以 ARM为内核的嵌入式处理器。

 ARM处理器是精简指令集计算机(RISC)。RISC的概念源于斯坦福大学和伯克利大学在1980

年前后进行的处理器研究计划。最初 ARM是1983到1985年间在英国剑桥的 Acor n Computer 公司开

发的。它是第一个为商业用途开发的RISC微处理器,同后来的RISC体系结构有明显的不同。1990年,

 ARM特别为扩大开发 ARM技术而成立了独立的公司。从那以后, ARM已被授权给世界各地的许多半

导体制造厂。它已经成为低功耗和追求成本的嵌入式应用的市场领导者。

 ARM微处理器主要系列包括 ARM7系列、 ARM9系列、 ARM9E系列、 ARM10E系列、 ARM11系

列、SecurCore系列、OptimoDE系列、StrongARM系列、XScale系列,以及Cortex系列等。

 ARM芯片还获得了许多实时操作系统供应商的支持,比较知名的有:Windows CE、uCLinux、

pSOS、Vxworks、Nucleus、uC/OS、Palm OS等。

目前 ARM公司已形成完整的产业链。图3.1列出了 ARM的全球合作伙伴,主要由半导体和系统伙

伴、操作系统伙伴、开发工具伙伴、应用伙伴、 ARM技术共享计划( ATAP )组成。图的左下方是操作系

统提供商,可以看到有一些比较知名的公司,如WindRiver 

公司(风河公司),提供Vxworks

操作系统;

Microsoft(微软)公司,提供Windows CE操作系统。图的左上方是 ARM技术共享计划,也就是说,这些

公司和 ARM公司合作研发并且共同使用开发的成果。图的右上方是开发工具提供商,有的公司提供开

Page 31: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 31/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

31

发环境,有的提供JTAG仿真器。图右下方是 ARM的应用伙伴。另外还有生产 ARM处理器的半导体厂

家,有Motorala公司(目前Motorala的半导体生产已经独立出来,现称Freescale(飞思卡尔)半导体有限

公司)、Philips公司(半导体生产也已经独立出来,现称NXP(恩智浦)半导体有限公司)、Samsung(三星)

公司等。

 

图3.1 ARM公司合作伙伴组成结构图

目前, ARM系列芯片以低功耗、低成本的特性在嵌入式应用领域确立了市场领导地位,是32位处

理器市场中使用最为广泛的微处理器, ARM嵌入式处理器已被广泛应用于移动电话、手持式计算机以

及各种各样的嵌入式应用领域。

3.1.1  ARM内核特点

 ARM处理器为RISC芯片,其简单的结构使 ARM内核非常小,这使得器件的功耗也非常低。它具有

经典RISC的特点:

* 大的、统一的寄存器文件;

* 简单的寻址模式;

* 统一和固定长度的指令域,3地址指令格式,简化了指令的译码。编译开销大,尽可能优化,采

用三地址指令格式、较多寄存器和对称的指令格式便于生成优化代码;

* 单周期操作, ARM指令系统中的指令只需要执行简单的和基本的操作,因此其执行过程在一

个机器周期内完成;

* 固定的32位长度指令,指令格式固定为32位长度,这样使指令译码结构简单,效率提高;

* 采用指令流水线技术。

Page 32: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 32/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

32

3.1.2  ARM内核体系结构

 ARM架构自诞生至今,已经发生了很大的演变,至今已定义了7种不同的版本:

V1版架构:该架构只在原型机 ARM1出现过,其基本性能包括基本的数据处理指令(无乘法)、

字节、半字和字的Load/Store指令、转移指令,包括子程序调用及链接指令、软件中断指令、寻址空间

64MB。

V2版架构:该版架构对V1版进行了扩展,如 ARM2与 ARM3(V2a版)架构,增加的功能包括乘法和

乘加指令、支持协处理器操作指令、快速中断模式、SWP/SWPB的最基本存储器与寄存器交换指令、

寻址空间64MB。

V3版架构:该版对 ARM体系结构作了较大的改动,把寻址空间增至32位(4GB),增加了当前程序

状态寄存器CPSR和程序状态保存寄存器SPSR以便于异常处理。增加了中止和未定义2种处理器模

式。 ARM6就采用该版结构。指令集变化包括增加了MRS/MSR指令,以访问新增的CPSR/SPSR寄存

器、增加了从异常处理返回的指令功能。

V4版架构:V4版结构是目前最广泛应用的 ARM体系结构,对V3版架构进行了进一步扩充,有的

还引进了16位的Thumb指令集,使 ARM使用更加灵活。 ARM7、 ARM9和StrongARM都采用了该版

结构。其指令集中增加的功能包括符号化和非符号化半字及符号化字节的存 /取指令、增加了16位

Thumb指令集、完善了软件中断SWI指令的功能、处理器系统模式引进特权方式时使用用户寄存器操

作、把一些未使用的指令空间捕捉为未定义指令。

V5版架构:在V4版基础上增加了一些新的指令。 ARM10和XScale都采用该版架构。这些新增指

令有带有链接和交换的转移BLX指令、计数前导零计数CLZ指令、BRK中断指令、增加了信号处理指令

(V5TE版)、为协处理器增加更多可选择的指令。

V6版架构: ARM体系架构V6 是2001年发布的。基本特点包括100%与以前的体系兼容、SIMD

媒体扩展,使媒体处理速 度快1.75倍、改进了的内存管 理,使系统性能提高30%、改进了的混合端

(Endian)与不对齐数据支持,使得小端系统支持大端数据(如TCP/IP),许多RTOS是小端的、为实时

系统改进了中断响应时间,将最坏情况下的35周期改进到了11个周期。

V7版架构: ARM体系架构V7是200 5年发布的。它使用了能够带来更高性能、功耗效率和代码密

度的Thumb-2技术。它首次采用了强大的信号处理扩展集,对H.264和MP3等媒体编解码提供加速。

Cortex-M3处理器采用的就是V7版的结构。

 ARM处理器核使用的体系结构如表3.1所示。

Page 33: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 33/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

33

  表3.1 ARM核心采用的体系结构

 ARM内核名称 体系结构

 ARM1 V1

 ARM2 V2

 ARM2aS、 ARM3 V2a

 ARM6、 ARM600、 ARM610 V3

 ARM7、 ARM700、 ARM710 V4

 ARM7TDMI、 ARM710T、 ARM720T、 ARM740T V4T

Strong ARM、 ARM8、 ARM810 V4

 ARM9TDMI、 ARM920T、 ARM940T V4T

 ARM9E-S V5

 ARM10TDMI、 ARM1020E、XScale V5TE

 ARM11、 ARM1156T2-S、 ARM1156T2F-S、 ARM1176JZ-S V6

Cortex-A8TM、Cortex-M3 V7

3.1.3  ARM内核种类

在高性能的32位嵌入式片上系统(SoC=System on Chip)设计中,几乎都是以 ARM作为处理器

核。 ARM核已是现在嵌入式SoC系统芯片的核心,也是现代嵌入式系统发展的方向。 ARM处理器核

作为基本处理单元,根据发展需求还集成了与处理器核密切相关的功能模块,如Cache存储器和存储

器管理MMU硬件,这些基于微处理器核并集成这些IP(Intelligence Property)核的标准配置的ARM

核都具有基本处理器的配置,这些内核称为处理器核。基于 ARM的处理器核简称 ARM核,核并不是

芯片, ARM核与其它部件如RAM、ROM、片内外设组合在一起才能构成现实的芯片,例如LPC2290、

S3C44B0X、 AT91FR40162分别是Philips(荷兰飞利浦公司)、Samsung(韩国三星公司)、 Atmel(美

国爱特梅尔公司)基于 ARM公司 ARM7TMDI核的嵌入式微处理器芯片。

 ARM公司开发了很多系列的 ARM处理器核,在表3.1中可以看出,目前最新的系列是 ARM Cortex

系列,下面我们将对 ARM各内核做简单介绍。

首先介绍一下 ARM核的命名规则及含义如图3.2所示。

 

图3.2 ARM核的命名规则及含义

Page 34: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 34/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

34

1. ARM7系列

 ARM7体系结构具有三级流水、空间统一的指令与数据Cache、平均功耗为0.6mW/MHz、时钟

速度为66MHz、每条指令平均执行1.9个时钟周期等特性。其中的 ARM710、 ARM720 和 ARM740为

内带Cache的 ARM 核。 ARM7指令集同Thumb指令集扩展组合在一起,可以减少内存容量和系统成

本,同时,它还利用嵌入式ICE调试技术来简化系统设计,并用一个DSP增强扩展来改进性能。 ARM7

体系结构是小型、快速、低能耗、集成式的RISC内核结构。该产品的典型用途是数字蜂窝电话和硬盘

驱动器等,目前主流的 ARM7内核是 ARM7TDMI、 ARM7TDMI -S、 ARM7EJ-S、 ARM720T。现在市场

上用得最多的 ARM7处理器有思智浦公司的LPC2000系列微控制器、Samsung公司的S3C44BOX与

S3C4510处理器、 Atmel公司的 AT91FR40162系列处理器、Cirrus公司的EP73xx系列等。该系列包括

 ARM7TDMI、 ARM7TDMI-S、带有高速缓存处理器宏单元的 ARM720T和扩充了Jazelle的 ARM7EJ-S

等。这些处理器提供Thumb16位压缩指令集和EmbededICE软件调试方式,适用于更大规模的SoC设

计中。

 ARM7系列广泛应用于多媒体和嵌入式设备,包括互联网设备、网络和调制解调器设备,以及移动

电话、PDA等无线设备。

2. ARM9E系列

 ARM9处理器采用 ARMV4T(哈佛)体系结构。这种体系结构由于程序和数据存储器在两个分开

的物理空间中,因而取指和执行能完全重叠。 ARM 9采用五级流水处理及分离的Cache结构,平均功

耗为0.7mW/MHz。时钟速度为120MHz~200MHz,每条指令平均执行1.5个时钟周期。与 ARM7处理

器系列相似,其中的 ARM920、 ARM940和 ARM9E处理器均为含有Cache的CPU核,性能为132MIPS

(120MHz时钟,3.3V供电)或220MIPS(200MHz时钟)。 ARM9处理器同时也配备Thumb指令扩展、

调试和Harvard总线。在生产工艺相同的情况下,性能是 ARM7TDMI处理器的两倍之多。常用于无线

设备、仪器仪表、联网设备、机顶盒设备、高端打印机及数码相机应用中。 ARM9E内核是在 ARM9内核

的基础上增加了紧密耦合存储器TCM及DSP部分。目前主流的 ARM9内核是 ARM920T、 ARM922T、

 ARM940。相关的处理器芯片有Samsung公司的S3C2510、Cirrus公司的EP93xx系列等。主流的

 ARM9E内核是 ARM926EJ-S、 ARM946E-S、 ARM966E-S等。

3. ARM10系列

 ARM10E处理器采用ARMVST体系结构,可以分为六级流水处理,采用指令与数据分离的Cache

结构,平均功耗1000mW,时钟速度为300MHz,每条指令平均执行1.2个时钟周期。 ARM10TDMI与

所有 ARM核在二进制级代码中兼容,内带高速32×16 MAC,预留DS P协处理器接口。其中的VFP10

(向量浮点单元)为七级流水结构。其中的 ARM1020T处理器则是由 ARMl0TDMI、32KB指令、数据

Page 35: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 35/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

35

Caches及MMU部分构成的。其系统时钟高达300MHz时钟,指令Cache和数据Cache分别为32KB,

数据宽度为64位,能够支持多种商用操作系统,适用于下一代高性能手持式因特网设备及数字式消费

类应用。主流的 ARM10内核是 ARM1020E、 ARM1022E、 ARM1026EJ-S等。

该系列包括 ARM1020E和 ARM1020E处理器核,其核心在于使用向量浮点(VFP)单元VFP10提

供高性能的浮点解决方案,从而极大提高了处理器的整型和浮点运算性能。可以用于视频游戏机和高

性能打印机等场合。

4.SecureCore系列

SecurCore系列处理器提供了基于高性能的32位RISC技术的安全解决方案,该系列处理器具有

体积小、功耗低、代码密度大和性能高等特点。另外最为特别的就是该系列处理器提供了安全解决方

案的支持。采用软内核技术,以提供最大限度的灵活性,以及防止外部对其进行扫描探测,提供面向

智能卡的和低成本的存储保护单元MPU,可以灵活地集成用户自己的安全特性和其他的协处理器,目

前包括有SC100、SC110、SC200、SC210计4种产品。

5.StrongARM系列和XScale系列

StrongARM处理器采用 ARMV4T的五级流水体系结构。目前有SA110、SA1100、SA1110等3个版

本以及 Intel公司的基于 ARMv5TE体系结构的XScale PXA27x系列处理器,与StrongARM相比增加了

I/D Cache,并且加入了部分DSP功能,更适合于移动多媒体应用。2006年,Intel公司将XScale处理器

出售给了Marvell公司。

6. ARM11处理器

 ARM11处理器系列可以在使用130nm工艺技术、小至2.2mm2芯片面积和低至0.24mW/MHz的前

提下达到高达500MHz的性能表现。 ARM11处理器系列以众多消费产品市场为目标,推出了许多新的

技术,包括针对媒体处理的SIMD,用以提高安全性能的TrustZone技术,智能能源管理(IEM),以及

需要非常高的、可升级的超过2600 Dhrystone 2.1 MIPS性能的系统多处理技术。主要的 ARM11处理

器有 ARM1136JF-S、 ARM1156T2F-S、 ARM1176JZF-S、 ARM11 MCORE等多种。

7. ARM Cor tex系列处理器

 ARM Cortex系列处理器是基于 ARMv7架构,又分为Cortex-M、Cortex-R和Cortex-A三类, ARM

Cortex系列的三款产品全都集成了Thumb®-2指令集,可满足各种不同的日益增长的市场需求。 ARM

Cortex系列的三款处理器瞄准的领域如下:

* ARM Cor tex-A系列:针对复杂操作系统以及用户应用设计的应用处理器;

* ARM Cor tex- R系列:实时系统专用嵌入式处理器;

Page 36: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 36/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

36

* ARM Cor tex- M系列:针对微控制器和低成本应用专门优化的深嵌入式处理器。

Cortex-M3是首款基于 ARMv7-M架构的处理器,是专门瞄准对功耗和成本敏感的嵌入式应用实

现高性能而设计的,它大大简化了可编程的复杂性,使 ARM架构成为各种应用方案(即使是最简单的

方案)的上佳选择。

虽然很多微控制器以 ARM7处理器为核心,但是因为目前已经有大量介绍 ARM7内核的资料,所以

本电子书着重对 ARM9和Cortex-M3内核进行介绍。

3.2  ARM9内核详细介绍

 ARM9系列有 ARM9TDMI、 ARM920T和带有高速缓存处理器宏单元的 ARM940T。所有 ARM9系

列处理器都具有Thumb压缩指令集和基于EmbeddedICE JTAG的软件调试方法。 ARM9兼容 ARM7

系列,而且能够比 ARM7进行更加灵活的设计。

 ARM9系列主要用于引擎管理、仪器仪表、安全系统、机顶盒、高端打印机、PDA网络电脑等领

域。

下面将详细介绍 ARM9TDMI和 ARM920T两款 ARM9内核。

3.2.1  ARM9TDMI内核

 ARM9TDMI将流水线的级数从 ARM7TDMI的3级增加到5级,并使用分开的指令与数据存储器的

哈佛(Harvard)体系结构, 因此简单的总线接口很容易连接Cache或SRAM存储器系统。 ARM9TDMI支

持与外部存储器的双向或单向连接,支持调试结构。 ARM9TDMI的性能在相同工艺条件下近似达到

 ARM7TDMI两倍。

1. ARM9TDMI技术特点

* 支持Thumb指令集;

* 含有EmbeddedICE模块支持片上调试;* 通过采用5级流水线以增加最高时钟速率;

* 分开的指令与数据存储器端口以改善CPI,提高处理器性能。

2. ARM9TDMI组织

 ARM9内核采用了与之前提到的Strong ARM相同的5级流水线。 ARM9TDMI与StrongARM核的

主要区别在于Strong ARM有一个与寄存器读出级并行操作的专用的转移加法器进行转移地址计算,

而 ARM9TDMI使用数据路径中的 ALU来计算转移目标地址。

3. ARM9TDMI的流水线操作

Page 37: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 37/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

37

 ARM9TDMI的5级流水线的操作见图3.3,图中与 ARM7TDMI采用的3级流水线进行了比较。该图

显示出处理器的主要处理功能及如 何在流水线级增加时重新分配执行,以便使时钟频率在相同工艺

技术的条件下能够加倍(近似)。重新分配执行功能(寄存器读、移位、 ALU、寄存器写)并不是达到高时

钟频率所需的全部。处理器还须能在 ARM7TDMI所用的一半时间内访问指令存储器,并重新构造指令

译码逻辑,是寄存器读与实际的译码同时进行。

 

图3.3 ARM7TDMI与 ARM9TDMI流水线比较

4.协处理器支持

 ARM9TDMI还有一个协处理器接口,可支持片上浮点协处理器、数字信号处理或其他专用的硬件

加速要求。

3.2.2  ARM920T内核

 A R M 920T是基于 A R M 9TD MI内核的处 理器宏 核,其内部结 构图如 3. 4所示 。它的核心是

 ARM9TDMI,此外包括存储器管理部件MMU、双重分离的Cache(指令Cache+数据Cache)、写回

RAM、 AMBA总线接口、外部协处理器接口以及跟踪调试接口等。

 

Page 38: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 38/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

38

图3.4 ARM920T内部结构框图

 ARM920T内核中,指令和数据Cache的大小都是16KB,采用64路相连的分段式CAM-ARM组

织。每个Cache分为8段,每段64行。段由A[7:5]寻址。每行8个字(32字节),支持以256字节为单位的

锁定。替换策略为伪随机或循环,由CP15寄存器1的RR位(位14)决定。在Cache未命中时,一次将整

行8个字全部读入。指令Cache为只读,数据Cache采用写回(Copy-Back)策略。写缓冲器可保存 4个地

址和16个数据字。

3.3  ARM Cor tex-M3内核介绍

 ARM公司的Cortex系列处 理器有三个产品线,分别是 A系列、R系列和M系列,由于本书主要介绍微

控制器产品,所以我们对Cortex-M3

进行了详细介绍。 ARM

公司于2004

年推出了Cortex-M3

微处理器,

如果按 ARM公司原来的 ARM7, ARM 9, ARM11等方式来命名,这款芯片的名称应该为 ARM12,但是

 ARM已经决定用Cortex系列来命名,Cortex-M3是针对微控制器(MCU)领域推出的第一款产品,它采

用的是V7指令集,速度比 ARM7快三分之一,功耗低四分之三,并且能实现更小芯片面积,利于将更多

功能整合在更小的芯片尺寸中。

Cortex-M3处理器是专门为那些对成本和功耗非常敏感但同时对性能要求又相当高的应用而

设计的。其核心是基于哈佛架构的3级流 水线内核,该内核集成了分支预测,单周期乘法,硬件除 法

等众多功能强大特性,使其在Dhrystone benchmark上具有出色的表现(1.25 DMIPS/MHz)。根据

Dhrystone benchmark的测评结果,采用新的Thumb®-2指令集(下节内容会对该指令集做详细介

绍)架构的Cortex-M3处理器,与执行Thumb指令的 ARM7TDMI -S®处理器相比,每兆赫的效率提高

了70%,与执行 ARM指令的 ARM7TDMI-S处理器相比,效率提高了35%。凭借代码大小和中断延迟的

优化、集成的系统部件、灵活的配置、简单的高级语言编程和强大的软件系统,Cortex-M3处理器将成

为广大系统(从复杂片上系统到低端的微控制器)的理想解决方案。

图3.5 ARM7TDMI-S(ARM)和Cortex-M3(Thumb-2)的性能对比 

Page 39: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 39/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

39

图3.6 ARM7TDMI-S(ARM)和Cortex-M3(Thumb-2)的代码大小

3.3.1  ARM Cortex-M3内核结构

基于 ARMV 7架构的Cortex-M3处理器带有一个分级结构。它集成了名为CM3Core的中心处理器

内核和先进的系统外设,实现了内置的中断控制、存储器保护以及系统的调试和跟踪功能。这些外设

可进行高度配置,允许Cortex-M3处理器处理大范围的应用并更贴近系统的需求。目前Cortex-M3内

核和集成部件(如图3.7所示)已进行了专门的设计,用于实现最小存储容量、减少管脚数目和降低功

耗。

Page 40: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 40/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

40

图3.7 Cortex-M3处理器内部结构

Cortex-M3中央内核基于哈佛架构,指令和数据各使用一条总线,所以Cortex-M3处理器对多个

操作可以并行执行,加快了应用程序的执行速度。内核流水线分3个阶段:取指、译码和执行。当遇到

分支指令时,译码阶段也包含预测的指令取指,这提高了执行的速度。处理器在译码阶段期间自行对

分支目的地指令进行取指。在稍后的执行过程中,处理完分支指令后便知道下一条要执行的指令。如

果分支不跳转,那么紧跟着的下一条指令随时可供使用。如果分支跳转,那么在跳转的同时分支指令可

供使用,空闲时间限制为一个周期。

Page 41: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 41/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

41

Cortex-M3内核方框图如图3.8所示。

 

图3.8 Cortex-M3内核方框图

Cortex-M3内核包含一个适用于传统Thumb和新型Thumb-2指令的译码器、一个支持硬件乘法

和硬件除法的先进 ALU、控制逻辑和用于连接处理器其他部件的接口。Cortex-M3处理器是一个32位

处理器,带有32位宽的数据路径,寄存器库和存储器接口。其中有13个通用寄存器,两个堆栈指针,

一个链接寄存器,一个程序计数器和一系列包含编程状态寄存器的特殊寄存器。Cortex-M3处理器支

持两种工作模式(线程(Thread)和处理器(Handler ))和两个等级的访问形式(有特权或无特权),

在不牺牲应用程序安全的前提下实现了对复杂的开放式系统的执行。无特权代码的执行限制或拒绝对

某些资源的访问,如某个指令或指定的存储器位置。Thread是常用的工作模式,它同时支持享有特权

的代码以及没有特权的代码。当异常发生时,进入Handler 模式,在该模式中所有代码都享有特权。此

外,所有操作均根据以下两种工作状态进行分类,Thumb代表常规执行操作,Debug代表调试操作。

Page 42: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 42/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

42

 

图3.9 存储器映射

Cortex-M3处理器是一个存储器映射系统,为高达4GB的可寻址存储空间提供简单和固定的存储

器映射,同时,这些空间为代码(代码空间)、SRAM(存储空间),外部存储器/器件和内部/外部外设

提供预定义的专用地址,如图3.9所示。另外,还有一个特殊区域专门供厂家使用。

借助bit-banding技术,如图3.10所示,Cortex-M3处理器可以在简单系统中直接对数据的单个位

进行访问。存储器映射包含两个位于SRAM的大小均为1MB的bit-band区域和映射到32MB别名区域

的外设空间。在别名区域中,某个地址上的加载/存储操作将直接转化为对被该地址别名的位的操作。

对别名区域中的某个地址进行写操作,如果使其最低有效位置位,那么bit-band位为1,如果使其最低

有效位清零,那么bit-band位为零。读别名后的地址将直接返回适当的bit-band位中的值。除此之外,

该操作为原子位操作,其他总线活动不能对其中断。

 

Page 43: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 43/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

43

 

图3.10 传统的位处理方法和Cortex-M3 bit-banding的比较

基于传统 ARM7处理器的系统只支持访问对齐的数据,只有沿着对齐的字边界才可以对数据进

行访问和存储。Cortex-M3处理器采用非对齐数据访问方式,使非对齐数据可以在单核访问中进行传

输。当使用非对齐传输时,这些传输将转换为多个对齐传输,但这一过程不为程序员所见。

Cortex-M3处理器除了支持单周期32位乘法操作之外,还支持带符号的和不带符号的除法操作,

这些操作使用SDIV和UDIV指令,根据操作数大小的不同在2到12个周期内完成。如果被除数和除数

大小接近,那么除法操作可以更快地完成。Cortex-M3处理器凭借着这些在数学能力方面的改进,成

为了众多高数字处理强度应用(如传感器读取和取值或硬件在环仿真系统)的理想选择。

3.3.2 嵌套向量中断控制器(NVIC)

NVIC是Cortex-M3处理器中一个完整的部分,它可以进行高度配置,为处理器提供出色的中断处

理能力。在NVIC的标准执行中,它提供了一个非屏蔽中断(NMI)和32个通用物理中断,这些中断带有

8级的抢占优先权。NVIC可以通过综合选择配置为1到240个物理中断中的任何一个,并带有多达256

个优先级。

Cortex-M3处理器使用一个可以重复定位的向量表,表中包含了将要执行的函数的地 址,可供具

体的中断处理器使用。中断被接受之后,处理器通过指令总线接口从向量表中获取地址。向量表复位

时指向零,编程控制寄存器可以使向量表重新定位。

为了减少门计数并提高系统的灵活性,Cortex-M3已从 ARM7处理器的分组映像寄存器异常模

型升级到了基于堆栈的异常模型。当异常发生时,编程计数器、编程状态寄存器、链接寄存器和R0-

R3、R12等通用寄存器将被压进堆栈。在数据总线对寄存器压栈的同时,指令总线从向量表中识别出

异常向量,并获取异常代码的第一条指令。一旦压栈和取指完成,中断服务程序或故障处理程序就开

Page 44: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 44/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

44

始执行,随后寄存器自动恢复,中断了的程序也因此恢复正常的执行。由于可以在硬件中处 理堆栈操

作,Cortex-M3处理器免去了在传统的C语言中断服务程序中为了完成堆栈处理所要编写的汇编程序

包,这使应用程序的开发变得更加简单。

NVIC支持中断嵌套(压栈),允许通过提高中断的优先级对中断进行提前处理。它还支持中断的

动态优先权重置。优先权级别可以在运行期间通过软件进行修改。正在处理的中断会防止被进一步激

活,直到中断服务程序完成,所以在改变它们的优先级的同时,也避免了意外重新进入中断的风险。

在背对背中断情况中,传统的系统将重复状态保存和状态恢复的过程两次,导致了延迟的增加。

Cortex-M3处理器使用末尾连锁(tail-chaining)技术简化了激活的和未决的中断之间的移动,如图

3.11所示。末尾连锁技术把需要用时30个时钟周期才能完成的连续的堆栈弹出和压入操作替换为6个

周期就能完成的指令取指,实现了延迟的降低。处理器状态在进入中断时自动保存,在中断退出时自

动恢复,比软件执行用时更少,大大提高了频率为100MHz的子系统的性能。

图3.11 NVIC中的末尾连锁(Tail chaining)技术

3.3. 3 存储器保护单元(MPU)

MPU是Cortex-M3处理器中一个可选的部分,它通过保护用户应用程序中操作系统所使用的重要

数据,分离处理任务(禁止访问各自的数据),禁止访问存储器区域,将存储器区域定义为只读,以及

对有可能破坏系统的未知的存储器访问进行检测等手段来改善嵌入式系统的可靠性。

MPU使应用程序可以拆分为多个进程。每个进程不仅有指定的存储器(代码、数据、栈和堆)和

器件,而且还可以访问共享的存储器和器件。MPU还会增强用户和特权访问规则。这包括以正确的优

先级别执行代码以及加强享有特权的代码和用户代码对存储器和器件的使用权的控制。

MPU将存储器分成不同的区域,并通过防止无授权的访问对存储器实施保护。MPU支持多达8个

区域,每个区域 又可以分为8个子区域。所支持的区域大小从32字节开始,以2为倍数递增,最大可达

到4GB可寻址空间。每个区域都对应一个区域号码(从0开始的索引),用于对区域进行寻址。另外,也

可以为享有特权的地址定义一个默认的背景存储器映射。对未在MPU区域中定义的或在区域设置中

Page 45: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 45/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

45

被禁止的存储器位置进行访问将会导致存储器管理故障(Memory Management Fault)异常的产生。

区域的保护是根据规则来执行的,这些规则以处理的类型(读、写和执行)和执行访问的代码的

优先级为基础进行制定。每个区域都包含一组位影响访问的允许类型,以及一组位影响所允许的总线

操作。MPU还支持重叠的区域(覆盖同一地址的区域)。由于区域大小是乘2所得的结果,所以重叠意

味着一个区域有可能完全包含在另一个区域里面。因此,有可能出现多个区域包含在单个区域中以及

嵌套重叠的情况。当寻址重叠区域中的位置时,返回的将是拥有最高区域号码的区域。

3.3.4 调试和跟踪 

对Cortex-M3处理器系统的调试访问是通过调试访问端口(Debug Access Port)来实现的。该

端口可以作为串行线调试端口(SW-DP)(构成一个两脚(时钟和数据)接口)或串行线JTAG调试端口

(SWJ-DP)(使能JTAG或SW协议)使用。SWJ-DP在上电复位时默认为JTAG模式,并且可以通过外

部调试硬件所提供的控制序列进行协议的切换。

调试操作可以通过断点、观察点、出错条件或外部调试请求等各种事件进行触发。当调试事件发

生时,Cortex-M3处理器可以进入挂起模式或者调试监控模式。在挂起模式期间,处理器将完全停止

程序的执行。挂起 模式支持单步操作。中断可以暂停,也可以在单步运行期间进行调用,如果对其屏

蔽,外部中断将在逐步运行期间被忽略。在调试监控模式中,处理器通过执行异常处理程序来完成各

种调试任务,同时允许享有更高优先权的异常发生。该模式同样支持单步操作。

Flash补丁和断点(FPB)单元执行6个程序断点和两个常量数据取指断点,或者执行块操作指令

或位于代码存储空间和系统存储空间之间的常量数据。该单元包含6个指令比较器,用于匹配代码空

间的指令取指。通过向处理器返回一个断点指令,每个比较器都可以把代码重新映射到系统空间的某

个区域或执行一个硬件断点。这个单元还包含两个常量比较器,用于匹配从代码空间加载的常量以及

将代码重新映射到系统空间的某一个区域。

数据观察点和跟踪(DWT)单元包含4个比较器,每一个比较器都可以配置为硬件观察点。当比较

器配置为观察点使用时,它既可以比较数据地址,也可以比较编程计数器。DWT比较器还可以配置用

来触发PC采样事件和数据地址采样事件,以及通过配置使嵌入式跟踪宏单元(ETM)发出指令跟踪

流中的触发数据包。

ETM是设计用于单独支持指令跟踪的可选部件,其作用是确保在对区域的影响最小的情况下实现

程序执行的重建。ETM使指令的跟踪具有高性能和实时性,数据通过压缩处理器内核的跟踪信息进

行传输可以最小化带宽的需求。

Page 46: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 46/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

46

 

图3.12 Cortex-M3跟踪系统

Cortex-M3处理器采用带DW T和ITM(测量跟踪宏单元)的数据跟踪技术,如图3.12所示。DWT

提供指令执行统计并产生观察点事件来调用调试或触发指定系统事件上的ETM。ITM是由应用程序

驱动的跟踪资源,支持跟踪OS和应用程序事件的printf 类型调试。它接受DW T的硬件跟踪数据包以

及处理器内核的软件跟踪激励,并使用时间戳来发送诊断系统信息。跟踪端口接口单元(Trace Port

Interface Unit-TPIU)接收ETM和ITM的跟踪信息,然后将其合并、格式化并通过串行线浏览器(Serial

Wire Viewer-SWV)发送到外部跟踪分析器单元。通过单管脚导出数据流,SWV支持简单和具有成本

效率的系统事件压型。曼切斯特编码和UART都是SWV支持的格式。

3.3.5 总线矩阵和接口

Cortex-M3处理器总线矩阵把处理器和调试接口连接到外部总线;也就是把 基于32位 AMBA®

 AHB- Li te的 ICode、DCode和系统接口连接到基于32位 AMBA APB™的专用外设总线(Private

Peripheral Bus-PPB)。总线矩阵也采用非对齐数据访问方式以及bit banding技术。

图3.13 Cortex-M3总线矩阵示意图

Page 47: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 47/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

47

32位ICode接口用于获取代码空间中的指令,只有CM3Core可以对其访问。所有取指的宽度都是

一个字,每个字里面的指令数目取决于所执行代码的类型及其在存储器中的对齐方式。32位DCode

接口用于访问代码存储空间中的数据,CM3Core和DA P都可以对其访问。32位系统接口分别获取

和访问系统存储空间中的指令和数据,与DCode相似,可以被CM3Core和DAP访问。PPB可以访问

Cortex-M3处理器系统外部的部件。

3.3.6 Cortex-M3的应用程序开发和指令集

缩短上市时间与降低开发成本是选择微控制器的关键标准,而快速和简易的软件开发能力是实

现这些要求的关键。Cortex-M3处理器专门针对快速和简单的编程而设计,用户无需深厚的架构知识

或编写任何汇编代码就可以建立简单的应用程序。Cortex-M3处理器带有一个简化的基于栈的编程模

型,该模型与传统的 ARM架构兼容,同时与传统的8位、16位架构所使用的系统相似,它简化了8位、16

位到32位的转换过程。此外,使用基于硬件的中断机制意味 着编写中断服务程序(handlers)不再重

要。在不需要汇编代码寄存器操作的情况下,启动代码得到了大大的简化。

在位字段 处理、硬件除法 和 I f /Then指令的协助下,Thumb-2指令集架构(Ins t ruc t ion Set

 Architecture-ISA)底层的关键特性使C代码的执行变得更加自然。在开发方面,Thumb-2指令自动优

化了性能和代码密度,在无需交互使用 ARM代码和Thumb代码的情况下加快了开发的进程,简化了编

译目标的长期维护和支持工作。如此一来,用户不但可以继续使用C代码,而且还免去了建立预编译目

标代码库的麻烦,代码在更大程度上获得了重复利用。

3.3.7 Cortex-M3和 ARM7的比较

由于很多微控制器也采用基于 ARM7的内核架构,这里我们就将 ARM公司专门针对微控制器推

出的内核Cortex-M3和它做一比较。

下表对 ARM7TDMI-S和Cortex-M3做了一些比较。

表3.2 ARM7TDMI-S和Cortex-M3的比较(采用100MHz频率和TSMC 0.18G制程)特性  ARM7TDMI-S Cortex-M3

架构  ARMv4T(冯·诺伊曼)  ARMv7-M(哈佛)

ISA支持 Thumb/ARM Thumb / Thumb-2

流水线 3级 3级+分支预测

中断 FIQ / IRQ NMI + 1 到240个物理中断

中断延迟 24-42个时钟周期 12个时钟周期

休眠模式 无 内置

存储器保护 无 8段存储器保护单元

Dhrystone 0.95 DMIPS/MHz( ARM模式) 1.25 DMIPS/MHz

功耗 0.28mW/MHz 0.19mW/MHz

Page 48: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 48/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

48

特性  ARM7TDMI-S Cortex-M3

面积 0.62mm2(仅内核) 0.86mm2(内核+外设)*

* 不包含可选系统外设(MPU和ETM)或者集成的部件。

1.在架构上, ARM7内核采用冯.诺伊曼(Von Neumann)架构,指令和数据共用信号总线以及存

储器;而Cortex-M3采用哈佛架构,指令和数据各使用一条总线。

2.在ISA支持上, ARM7支持Thumb/ARM指令,虽然它们各有优缺点,但是鱼与熊掌不可兼得,

两者之间的切换相当的麻烦。而Cortex-M3内核基于哈 佛架构,指令和数据可以从存储器中同时读

取,对多个操作可以并行执行,加快了应用程序执行速度。而且由于Tumb-2指令是Thumb指令的扩

展,16位和32位指令共存于同一模式下,所以复杂性大幅下降,代码密度和性能均得到提高

图3.14 Thumb/ARM指令比较

3.在流水线设计上, ARM7采用三级流水线,其特点如图3.15、图3.16所示。

图3.15 ARM7三级流水线特点

 

Page 49: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 49/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

49

图3.16 ARM7三级流水线特点

Cortex-M3采用带分支预测的三级流水线,其特点如图3.17、图3.18所示。

 

图3.17 Cortex-M3采用带分支预测的三级流水线特点

图3.18 Cortex-M3采用带分支预测的三级流水线特点

4.Cortex-M3处理器内核的核心部分(0.18um G)的门数仅为33000个,它把紧密相连的系统部

件有效地结合在一起。通过采用非对齐数据存储技术、原子位操作和Thumb-2指令集,存储容量的需

求得到最小化,Cortex-M3处理器支持扩展时钟门控和内置睡眠模式。当采用 ARM Metro标准单元库

和TSMC 0.13G制造工艺时,处理器运行在50MHz的目标频率下的功耗仅为4.5mW,芯片封装面积只

有0.33mm2,在内核功耗上,Cortex-M3功耗相比 ARM7会更低,如图3.19所示。

图3.19 Cortex-M3和 ARM7内核功耗对比

Page 50: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 50/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

50

综上所述,Cortex-M3是一款非常适合微控制器应用内核,所以一经推出就受到产业的热捧,目

前(截至2009年7月)Cortex-M3处理器内核的授权客户数已达到28家,包括恩智浦半导体、东芝、

ST、Ember 、 Accent、 Actel、ENERGY、 ADI、TI、 Atmel、Broadcom、Samsung、Zilog和Renesas等,

其中恩智浦、ST、TI、 Atmel和东芝已经推出基于Cortex-M3的MCU产品。据 ARM公司统计,目前基于

 ARM内核的MCU产品已超过450款,其中基于Cortex-M3的MCU产品已达到近250款,复合年平均增

长率达到140%。可说在MCU业界创出了奇迹。

3.4  ARM指令特点

指令是汇编语言程序设计的基础,在基于 ARM的嵌入式软件开发中,即便大部分程序用高级语言

完成,但系统的引导、启动代码仍必须用汇编语言来编写。 ARM处理器支持 ARM指令集、Thumb指令

集和Thumb-2指令集。

3.4.1  ARM指令集

 ARM指令集是32位的,程序的启动都是从 ARM指令集开始。所有的 ARM指令集都可以是有条件

执行的。 ARM指令集是以32位二进制编码的方式给出的,大部分的指令编码中定义了第一操作数、第

二操作数、目的操作数、条件标志影响位以及每条指令所对应的不同功能实现的二进制位。每条32位

 ARM指令都具有不同的二进制编码方式,和不同的指令功能相对应 。

 ARM指令集可以分为六大类,分别为数据处理指令、Load/Store指令、跳转指令、程序状态寄存

器处理指令、协处理器指令和异常产生指令。具体的指令及功能如表3. 2所示(表中指令为基本 ARM

指令,不包括派生的 ARM指令)。

 ARM指令及功能描述:

 表3.2  ARM指令及功能描述

助记符(按字母为序) 指令功能描述 所属类型

 ADC 带进位加法指令 数据处理类之算术运算指令

 ADD 加法指令 数据处理类之算术运算指令

 AND 逻辑与指令 数据处理类之逻辑运算指令

B 跳转指令 分支类指令

BIC 位清零指令 数据处理类之逻辑运算指令

BKPT 断点中断指令 异常中断类指令

BL 带返回的跳转指令 分支类指令

BLX 带返回和状态切换的跳转指令 分支类指令

BX 带状态切换的跳转指令 分支类指令

CDP 协处理器数据操作指令 协处理器类指令

CMN 比较反值指令 数据处理类之比较类指令

CMP 比较指令 数据处理类之比较类指令

Page 51: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 51/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

51

助记符(按字母为序) 指令功能描述 所属类型

EOR 异或指令 数据处理类之逻辑运算指令

LDC 存储器到协处理器的数据传送指令 加载/存储类指令

LDM 加载多个寄存器指令 加载/存储类指令

LDR 存储器到寄存器的数据传送指令 加载/存储类指令

MCR 从寄存器到协处理器寄存器的数据传送指令 协处理器类指令

MLA 乘加运算指令 数据处理类之算术运算指令

MOV 数据传送指令 数据处理类之数据传送指令

MRC 从协处理器寄存器到寄存器的数据传送指令 协处理器类指令

MRS 传送CPSR或SPSR的内容到通用寄存器指令 程序状态寄存器与通用寄存器传输类指令

MSR 传送通用寄存器到CPSR或SPSR的指令 程序状态寄存器与通用寄存器传输类指令

MUL 32位乘法指令 数据处理类之算术运算指令

MLA 32位乘加指令 数据处理类之算术运算指令

MVN 数据取反传送指令 数据处理类之数据传送指令

ORR 逻辑或指令 数据处理类之逻辑运算指令

RSB 逆向减法指令 数据处理类之算术运算指令

RSC 带借位的逆向减法指令 数据处理类之算术运算指令

SBC 带借位减法指令 数据处理类之算术运算指令

STC 协处理器寄存器写入存储器指令 协处理器类指令

STM 批量内存字写入指令 加载/存储类指令

STR 寄存器到存储器的数据传送指令 加载/存储类指令

SUB 减法指令 数据处理类之算术运算指令

SWI 软件中断指令 异常中断类指令

SWP 交换指令 数据处理类之交换指令

TEQ 相等测试指令 数据处理类之测试指令

3.4.2 Thumb指令集

Thumb指令集可看作是 ARM指令集压缩形式的子集,是针对代码密度的问题而提出的,它具有

16位的代码密度。虽然所有Thumb指令都有相对应的 ARM指令,但Thumb不是一个完整的体系结构,

处理器不可能只执行Thumb指令而不支持 ARM或Thumb-2指令集。

Thumb指令集特点如下:

* Thumb指令继承了 ARM指令集的许多特点;

* Thumb指令也是采用Load/Store结构,有数据处理、数据传送及流控制指令等;

* Thumb指令集丢弃了 ARM指令集一些特性。

大多数Thumb指令是无条件执行的(除了转移指令B),而所有 ARM指令都是条件执行的。许多

Thumb数据处理指令采用2地址格式,即目的寄存器与一个源寄存器相同,而大多数 ARM数据处理指

令采用的是3地址格式(除了64位乘法指令外)。

Page 52: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 52/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

52

16位Thumb指令集是从32位 ARM指令集提取指令格式的,每条Thumb指令有相同处理器模型所

对应的32位 ARM指令。

 ARM开发工具完全支持Thumb指令,应用程序可以灵活的将 ARM和Thumb子程序混合编程以便

在例程的基础上提高性能或代码密度。在编写Thumb指令时,先要用伪指令CODE16声明( ADS的编

译环境下),而且在 ARM指令中要使用BX指令跳转到Thumb指令,以切换处理器状态。

3.4.3 Thumb-2指令集

Thumb-2技术是16位和32位指令的结合,实现了32位 ARM指令性能,匹配原始的16位Thumb指

令集并与之后向兼容。图3.20显示了预测的 ARM、Thumb和Thumb2指令之间性能和代码量的比较结

果,由结果可见,Thumb-2技术确实达到了预期的目标。

图3.20 ARM、Thumb以及Thumb-2相关的性能和代码大小比较

 ARM7TDMI内核就支持 ARM和Thumb两种指令集,而Cortex-M3内核支持Thumb和Thumb-2两

种指令集。在基于 ARM7处理器的系统中,处理器内核会根据 特定的应用切换到Thumb状态(以获取

高代码密度)或 ARM状态(以获取出色的性能)。然而,在Cortex-M3处理器中无需交互使用指令,16

位指令和32位指令共存于同一模式,复杂性大幅下降,代码密度和性能 均得到提高。由于Thumb-2指

令是16位Thumb指令的扩展集,所以Cortex-M3处理器可以执行之前所写的任何Thumb代码。得益于

Thumb-2指令,Cortex-M3处理器同时兼容于其他 ARM Cortex处理器的家族成员。

Thumb-2指令集用于多种不同应用,使紧凑代码的编写更加简单快捷。BFI和BFC指令为位字段

指令,在网络信息包处理等应用中可大派用场。SBFX和UBFX指令改进了从寄存器插入或提取多个位

的能力,这一能力在汽车应用中的表现相当出色。RBIT指令的作用是将一个字中的位反转,在DFT等

DSP运算法则的应用中非常有用。表分支指令TBB和TBH用于平衡高性能和代码的紧凑性。Thumb-2

指令集还引入了一个新的If-Then结构,意味着可以有多达4个后续指令进行条件执行。

以上我们介绍了 ARM内核的特点,在下一章中,我们要结合恩智浦公司的MCU详细介绍微控制器

的组成和结构特点。

Page 53: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 53/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

53

第4章 典型MCU架构详解与主流MCU介绍

在前面的介绍中,我们已经了解到MCU就是基于一定的内核体系,集成了存储、并行或串行 I/O、

定时器、中断系统以及其他控制功能的微型计算机系统,如图4.1是典型的MCU组成框图。

图4.1 典型MCU的组成框图

目前,虽然很多厂商采用了 ARM内核体系,但是在具体的MCU产品上,各个公司集成的功能差异

非常大,形成MCU百花齐放的格局,由于本书的重点是介绍32位MCU,所以我们将重点以恩智浦公

司的MCU为例来介绍,这些MCU中,LPC3000、LH7A采用 ARM9内核,LPC2000和LH7采用 ARM7内

核,LPC1000系列采用Cortex-M3或M0内核,通过这几个系列的介绍可以了解MCU的构成和差异。

4.1 恩智浦LPC1000系列MCU

LPC1000系列MCU是以第二代Cortex-M3为内核的微控制器,用于处理要求高度集成和低功耗

的嵌入式应用。采用3级流水线和哈佛结构,其运行速 度高达100MHz,带独立的本地指令和数据总

线以及用于外设的第三条总线,使得代码执行速度高达1.25MIPS/MHz,并包含一个支持分支预测的

内部预取指单元,特别适用于静电设计、照明设备、工业网络、报警系统、白色家电、电机控制等领域。

LPC1000系列MCU又分为LPC1700系列和LPC1300系列,下面我们分开介绍。

4.1.1 LPC1700系列MCU介绍

LPC1700系列 ARM是以第二代的Cortex-M3为内核,是为嵌入式系统应用而设计的高性能、低功

耗的32位微处理器,适用于仪器仪表、工业通讯、电机控制、灯光控制、报警系统等领域。其操作频率

高达100MHz,采用3级流水线和哈佛结构,带独立的本地指令和数据总线以及用于外设的高性能的

第三条总线,使得代码执行速度高达1.25MIPS/MHz,并包含一个支持分支预测的内部预取指单元。

LPC1700系列 ARM  Cortex-M3的外设组件:最高配置包括512KB片内Flash程序存储器、64KB片

Page 54: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 54/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

54

内SRAM、8通道GPDMA控制器、4个32位通用定时器、一个8通道12位 ADC、一个10位DAC、一路电

机控制PWM输出、一个正交编码器接口、6路通用PWM输出、一个看门狗定时器以及一个独立供电的

超低功耗RTC。

LPC1700系列 ARM  Cortex-M3还集成了大量的通信接口:一个以太网MAC、一个USB 2.0全速接

口、4个UART接口、2路CAN、2个SSP接口、1个SPI接口、3个I2C接口、2路I

2S输入和2路I

2S输出。

1.LPC1700系列MCU关键特性:

* 第二代Cortex-M3内核,运行速度高达100MHz;

* 采用纯Thumb2指令集,代码存储密度高;

* 内置嵌套向量中断控制器(NVIC),极大程度的降低了中断延迟;

* 不可屏蔽中断(NMI)输入;

* 具有存储器保护单元,内嵌系统时钟;

* 全新的中断唤醒控制器(WIC);

* 存储器保护单元(MPU);

* 以太网、USB Host/OTG/Device、CAN、I2S;

* 快速(Fm+)I2C、SPI/SSP、UART;

* 电机控制PWM输出和正交编码器接口;* 12位 ADC;

* 低功耗实时时钟(RTC);

* 第二个专用的PLL可用于USB接口,增加了主PLL设置的灵活性;

* 4个低功率模式:睡眠、深度睡眠、掉电、深度掉电,可通过外部中断、RTC中断、USB活动中

断 、以太网唤醒中断、CAN总线活动中断、NMI等中断唤醒;

* 具有在系统编程(ISP)和在应用编程(IAP)功能的512KB片上Flash程序存储器;

* 64KB片内SRAM包括:

* 32KB SRAM可供高性能CPU通过本地代码/数据总线访问;

* 2个16KB SRAM模块,带独立访问路径,可进行更高吞吐量的操作。这些SRAM模块可用于

以太网、USB、DMA存储器,以及通用指令和数据存储;

* AHB多层矩阵上具有8通道的通用DMA控制器(GPDMA),结合SSP、I2S、UART、 AD/DA转

换、定时器匹配信号和GPIO使用,并可用于存储器到存储器的传输;

* 多层 AHB矩阵内部连接,为每个 AHB主机提供独立的总线。 AHB主机包括CPU、通用DMA控

制器、以太网MAC和USB接口。这个内部连接特性提供无仲裁延迟的通信;

Page 55: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 55/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

55

* 实用的LQFP 80/100脚封装。

2.LPC1700系列中LPC1766方框图:

 

图4.2 LPC1766方框图

3.LPC1700系列MCU参数规格如下表所示:

表4.1 LPC1700系列MCU参数规格一览

器件型号

Flash

(KB)

SRAM

(KB)

E  t    h   er  N e t    

USB 2.0GP

DMA

正交编码器

CAN

2.0BI2S I

2C PWM A/D D/A

Timer 

32bit

SPI

SSP

UART

(485

/IrDA)封装

LPC1751 32 8 - Device 8ch 1 1 - 3 6ch 6ch/12bit - 4 1/2 4 LQFP80

LPC1752 64 16 - Device 8ch 1 1 - 3 6ch 6ch/12bit 4 1/2 4 LQFP80

LPC1754 128 32 - Device/Host/OTG 8ch 1 1 - 3 6ch 6ch/12bit 1ch/10bit 4 1/2 4 LQFP80

LPC1756 256 32 - Device/Host/OTG 8ch 1 2 1 3 6ch 6ch/12bit 1ch/10bit 4 1/2 4 LQFP80

LPC1758 512 64 1 Device/Host/OTG 8ch 1 2 1 3 6ch 6ch/12bit 1ch/10bit 4 1/2 4 LQFP80

LPC1764 128 32 1 Device 8ch 1 2 - 3 6ch 8ch/12bit - 4 1/2 4 LQFP100

Page 56: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 56/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

56

器件型号

Flash

(KB)

SRAM

(KB)

E  t    h   er  N e t    

USB 2.0GP

DMA

正交编码器

CAN

2.0BI2S I

2C PWM A/D D/A

Timer 

32bit

SPI

SSP

UART

(485

/IrDA)封装

LPC1765 256 64 - Device/Host/OTG 8ch 1 2 1 3 6ch 8ch/12bit 1ch/10bit 4 1/2 4 LQFP100

LPC1766 256 64 1 Device/Host/OTG 8ch 1 2 1 3 6ch 8ch/12bit 1ch/10bit 4 1/2 4 LQFP100

LPC1768 512 64 1 Device/Host/OTG 8ch 1 2 1 3 6ch 8ch/12bit 1ch/10bit 4 1/2 4 LQFP100

4.1.2 LPC1300系列MCU介绍

LPC1311/13/42/43是以第二代 ARM Cortex- M3为内核的微控制器,其系统性能大大提高,增强了

调试特性,令所支持模块的集成级别更高。其最大亮点在于具有极高的代码集成度和极低的功耗,是

业界功耗最低的32位Cortex-M3 MCU。

LPC1300系列 ARM微控制器的操作频率高达70MHz,具有3级流水线功能,并采用支持独立本地指令和数据总线以及用于外设的第三条总线的哈佛架构,使得代码执行速度高达1.25MIPS/MHz,还

包括了一个内部预取单元,支持分支预测操作。

LPC1311/13/42/43的外设组件:最高配置有32KB的Flash存储器、8KB的数据存储器、USB设备

(仅对于LPC1342/43)、一个快速模式I 2C接口、一个UART、四个通用定时器、42个通用 I/O引脚。

1.LPC13XX系列MCU关键特性

* 第二代Cortex-M3内核,高达70MHz的运行速度;

* 内置有嵌套向量中断控制器(NVIC);

* 具有32KB(LPC1343/13)/16KB(LPC1342)/ 8KB(LPC1311)片上Flash程序存储器;

* 10位 ADC,在8个引脚中实现输入多路复用;

* 在系统编程(ISP)和在应用编程(IAP)可通过片内引导装载程序软件来实现;

串行接口

* 带有用于设备的片内PHY的USB 2.0全速设备控制器(仅对于LPC1342/43);

* 可产生小数波特率、具有调制解调器、内部FIFO和支持RS-485/EIA-485标准的UART;

* SSP控制器,带FIFO和多协议功能;

* I2C总线接口,完全支持 I

2C总线规范和快速模式,数据速率为1Mbit/s,具有多个地址识别功

能和监控模式;

其它外设

* 多达42个通用I/O(GPIO)引脚,带可配置的上拉/下拉电阻,并有新的、可配置的开漏操作模

式;

* 4个通用定时器/计数器,共有4路捕获输入和13路匹配输出;

Page 57: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 57/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

57

* 可编程的看门狗定时器(WDT);

* 具有系统定时器;

* 每个外设都具有其自身的时钟分频器,以进一步降低功耗;

* 集成了PMU(电源管理单元),可在睡眠、深度睡眠和深度掉电模式中极大限度减少功耗;

* 具有三种低功耗模式:睡眠模式、深度睡眠模式和深度掉电模式;

* 带驱动的时钟输出功能可以反映主振荡器时钟、IRC时钟、CPU时钟、看门狗时钟和USB时

钟;

* 掉电检测,具有4个独立的阀值,用于中断和强制的复位;

* 12MHz内部RC振荡器可调节到1%的精度,可将其选择为系统时钟;

* PLL允许CPU在最大的CPU速率下操作,而无需高频晶振,可从主振荡器、内部RC振荡器或

看门狗振荡器中运行;

* 可采用48脚LQFP封装和33引脚HVQFN封装。

2.LPC13XX系列MCU方框图如下表所示:

Page 58: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 58/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

58

图4.3 LPC13XX MCU方框图

3.LPC13XX系列MCU参数规格如下表所示:

  表4.2 LPC13XX MCU参数规格一览

器件型号 Flash(KB) SRAM(KB) USB2.0 I2C(Fast+) ADC Timer32bit/16bit SSP

UART

(RS-485)封装

LPC1311 8 2 - 1 8ch/10bit 2/2 1 1 HVQFN33

LPC1313 32 3 - 1 8ch/10bit 2/2 1 1H V Q F N 3 3 /

LQFP48

LPC1342 16 4 Device 1 8ch/10bit 2/2 1 1 HVQFN33

LPC1343 32 8 Device 1 8ch/10bit 2/2 1 1H V Q F N 3 3 /

LQFP48

4.1.3 LPC1100--更高效能MCU向我们走来

2009年5月,恩智浦宣布推出将于2010年初推出基于Cortex-M0的LPC1100系列产品。LPC1100

非常适合那些电池供电、电子计量、消费电子外围设备、远程传感器以及所有的16位应用。

 ARM Cortex-M0处理器是市场上现有的最小、能耗最低、最节能的 ARM处理器。该处理能耗非

常低、门数量少、代码占用空间小,使得MCU开发人员能够以8位处理器的价位,获得32位处理器的性

能。超低门数还使其能够用于模拟信号设备和混合信号设备及MCU应用中,可望明显节约系统成本,

同时保留功能强大的Coretex-M0处理器的工具和二进制兼容能力。

Cortex-M0最大的优势在于能效。数据显示,其运算能力可以达到0.9 DMIPS/MHz,但功耗却仅

有80uW/MHz。这源于所谓的“超低功耗深度睡眠架构”,是因为采用了 ARM 180ULL库和PMK,所以

相比传统8/16位MCU拥有更低的静态功耗。另外,尽管动态功耗与眼下的16位处理器相当,但是由于

运算性能的提高,实际上处理器在执行同样的任务时所耗费的时间降低了,这就大幅降低了处理器的

动态功耗。

 ARM Cortex-M0处理器关键特性:

* 50MHz主频

* 紧密耦合的巢状向量中断控制器快速确定性中断;

* 唤醒中断控制器允许从优先级中断中自动唤醒;

* 3个低功耗模式:睡眠,深度睡眠和深度掉电;

存储器;

* 128KB的FLASH存储器;

* 16KB的SRAM;

串行外围设备;

* 带有分数波特率,内部FIFO,支持RS-485的UART;

Page 59: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 59/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

59

* 带有FIFO和多重协定能力的SPI控制器;

* I2C总线接口支持全速I

2C总线规格和快速模式的波特率为1Mbps带有多样的地址识别和监控

模式;

* 模拟外围设备;

* 8通道10位的 A/D转换器,转换率高达250K采样每秒。

图4.4 ARM Cortex-M0方框图

LPC1100系列是世界首款基于Cortex-M0内核的MCU,性价比高,LPC1100的代码和工具与恩智

浦其他基于 ARM内核的MCU产品相兼容,32位性能与多重电源模式和非常低的深度睡眠模式相结

合。LPC1100提供业界领先的能源效率大大延长电池的使用寿命。LPC1100的性能效率结合了新标

准,代码密度有了显著的改进,可使电池寿命更长也降低了成本。

LPC1100系列方框图如下所示:

电源管理单元

 ADC

Cortex-M0单元

I2C

GPIO SPI

定时器 RAM ROM Flash UART

时钟发生单元

图4.5 LPC1100系列方框图

Page 60: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 60/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

60

4.2 恩智浦LPC3000系列MCU

恩智浦公司的LPC3000系列MCU,适用于要求高性能和低功耗结合的嵌入式应用,并通过使用

90纳米的工艺技术,将一个带有矢量浮点协处理器的 ARM926EJ-S CPU内核与一系列包括USB On-

The-Go在内的标准外设结合起来,LPC3000系列MCU工作频率高于266MHz。 ARM926EJ-S CPU内

核加入5级流水处理并采用哈佛结构,该内核还具有一个完整的存储器管理单元(MMU),以提供支持

现代操作系统多程序设计所需的虚拟存储器功能。 ARM926EJ-S CPU内核还包含了带有单周期MAC

操作的一系列DSP指令扩展,以及Jazelle Java字节代码执行。

为了实现低功耗,LPC3000系列MCU采用恩智浦半导体先进的开发技术来优化内在功率,并使用

增强型软件控制结构优化功率管理。

LPC3000系列MCU还包含有256kB的片内静态RAM、1个NAND  Flash接口、1个以太网MAC、1

个支持STN和TFT面板的LCD控制器、1个支持SDR和DDR SDRAM以及静态设备的外部总线接口。

此外,LPC3000系列MCU包括1个USB2.0全速接口或USB2.0高速接口、7个UART、2个I2C接口、2个

SPI/SSP端口、2个I2S接口、2个多通道PWM、4个带有捕获输入和比较输出的通用定时器、1个加密数

字(SD)接口和1个带有触屏感应选项的10位 A/D转换器。

4.2.1 LPC3000系列MCU参数规格表

恩智浦LPC3000系列目前大约有十一款MCU,主要代表为LPC3130、LPC3131、LPC3180/01、

LPC3151、LPC3152、LPC3153、LPC3154、LPC3220、LPC3230、LPC3240和LPC3250等,其主要参

数如表4.3所示。

表4.3 LPC3000系列MCU参数规格表

型号

存储器 串行接口LCD接口/

控制器

NAND

FlashMCI DDR

最高频率(MHz)

CPU电压

I/O电压温度范围选择

封装R A M

(kB)

cache

(kB)

以太网

USB I2S UART

LPC3130 96 16×2 - host/device/OTG[1] 2 1 1[3] √ SD/MMC/S D I O / C E

-ATA

— 180 1.2V 3.3/2.8/1.8V -40~85 TFBGA180

LPC3131 192 16×2 - host/device/OTG[1] 2 1 1[3] √

SD/MMC/

S D I O / C E

-ATA

— 180 1.2V 3.3/2.8/1.8V -40~85 TFBGA180

LPC3141 192 16×2 - host/device/OTG[1] 2 1 1[3] √

SD/MMC/

S D I O / C E

-ATA

— 270 1.2V 3.3/2.8/1.8V -40~85 TFBGA180

LPC3143 192 16×2 - host/device/OTG[1] 2 1 1[3] √

SD/MMC/

S D I O / C E

-ATA

— 270 1.2V 3.3/2.8/1.8V -40~85 TFBGA180

LPC3152 192 16×2 - host/device/OTG[1] 2 1 1[3] √

SD/MMC/

S D I O / C E

-ATA

— 180 1.2V 3.3/2.8/1.8V -40~85 TFBGA208

LPC3154 192 16×2 - host/device/OTG[1] 2 1 1[3] √

SD/MMC/

S D I O / C E

-ATA

— 180 1.2V 3.3/2.8/1.8V -40~85 TFBGA208

LPC3220 128 32×2 - host/device/OTG[2] 2 7 - √ SD √ 266 1.35/1.2V 3.3/1.8V -40~85 TFBGA296

Page 61: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 61/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

61

型号

存储器 串行接口LCD接口/

控制器

NAND

FlashMCI DDR

最高频率(MHz)

CPU电压

I/O电压温度范围选择

封装R A M

(kB)

cache

(kB)

以太网

USB I2S UART

LPC3230 256 32×2 - host/device/OTG[2] 2 7 1[4] √ SD √ 266 1.35/1.2V 3.3/1.8V -40~85 TFBGA296

LPC3240 256 32×2 1 host/device/OTG[2] 2 7 - √ SD √ 266 1.35/1.2V 3.3/1.8V -40~85 TFBGA296

LPC3250 256 32×2 1 host/device/OTG[2] 2 7 1[4] √ SD √ 266 1.35/1.2V 3.3/1.8V -40~85 TFBGA296

我们以恩智浦最新的LPC32X0系列MCU特性和构成来说明LPC3000系列MCU的组 成,恩智浦

半导体的LPC32x0系列芯片适用于要求高性能和低功耗结合的嵌入式应用中。

4.2.2 LPC32x0系列MCU特性

* ARM926EJS处理器,CPU时钟运行速率可高达266MHz;

* 矢量浮点协处理器;

* 32kB指令高速缓存和32kB数据高速缓存;

* 高达256kB的内部SRAM(IRAM);

* 可选择从不同的外部设备中启动:NAND Flash、SPI存储器、USB、UART或静态存储器;

* 多层 AHB系统为每个 AHB主机单独提供总线,包括CPU的指令总线和数据总线、DMA控制

器的两条数据总线和USB控制器的另一条总线,两条数据总线一条用于LCD、另一条用于以太

网MAC。一般情况下没有仲裁延迟,除非出现2个主机同时访问同一个从机的情况;

* DDR和SDR SDRAM以及静态设备的外部存储器控制器;

* 2个NAND Flash控制器。一个支持单级NAND Flash器件,另一个支持多级NAND Flash器件;

* 1个主机中断控制器(MIC)和2个从机中断控制器(SIC),支持74个中断源;

* 1个8路通用 AHB DMA控制器(GPDMA),可与SD卡端口、高速UART、I2S端口和SPI接口一同

用,来实现存储器到存储器之间的传输;

串口接口

* 带有特定DMA控制器的10/100以太网MAC;

* USB接口支持设备、主机(遵循OHCI)或On-The-Go(OTG),带有相关的DMA控制器,由特

定的PLL来提供所需的48MHz USB时钟;

* 4个标准UART,带有小数波特率发生器和64字节FIFO,其中一个标准的UART支持IrDA;

* 3个其它的高速UART,在13MHz的主振荡器作用下可支持高达921,600bps的板内通信;所有

高速UART都提供64字节FIFO;

* 2个SPI控制器;

Page 62: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 62/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

62

* 2个SSP控制器;

* 2个独立的主机I2C接口,具有标准开漏管脚。I

2C总线接口支持单主机、从机和多主机的I

2C配

置2个I2S接口,每个具有独立输入(RX)和输出(TX)通道,每个通道可在3个管脚上独立操

作,或输入和输出通道可使用4个管脚和1个共用的时钟;

其它处设

* LCD控制器支持STN和TFT面板,带有特定的DMA控制器。可编程的显示分辨率高达

1024×768;

* 加密数字(SD)存储卡接口,遵循SD存储卡规范版本1.01;

* 通用输入、输出和 I/O管脚,包括12个通用输入管脚、24个通用输出管脚和51个通用I/O管脚;

* 10位、400kHz的 A/D转换器,带3个管脚的输入多路复用。或 A/D转换器可用作触屏控制器;

* 实时时钟(RTC),带单独的电源管脚。该RTC具有特定的32kHz振荡器。NXP在一个独立的

电源域内执行RTC,使其可在芯片的其它部分断电时仍保持有效,RTC还包含一个32字节的暂

存存储器;

* 具有16位预分频器的32位通用高速定时器。该定时器包括1个外部捕获输入管脚和连接到

RTC时钟的捕获。可利用3个匹配寄存器来产生中断;

* 6个增强型的定时器/计数器,除外设基址外它们都相同,最少有2个捕获输入和2个匹配输出

被配置用于4个定时器,每个定时器可选择几个管脚。定时器1引出第三个匹配输出,而定时器2

和3引出所有4个匹配输出,定时器4有一个匹配输出,定时器5没有输入/输出管脚;

* 1个32位的毫秒定时器由RTC时钟驱动,该定时器可利用2个匹配寄存器来产生中断;

* 1个看门狗定时器。该定时器通过PERIPH_CLK计时;

* 1个电机控制PWM;

* 2个额外的单输出PWM模块;

* 键盘扫描仪功能允许自动扫描多达8×8的键矩阵;

* 高达18个外部中断;

* 标准 ARM测试/调试接口,可以兼容现有的工具;

* 具有2K×24位RAM的仿真跟踪缓冲区,允许通过JTAG接口进行跟踪;

* 当允许通过其它外设功能来重新启动CPU时,可利用停止模式来节省功耗;

* 片内晶体振荡器;

* 片内PLL允许CPU在最高的CPU速率下操作,而无需使用高频晶体。另一个PLL允许在32kHz

的RTC时钟下操作,而不需要使用外部晶体;

* 边界扫描以简化板的测试;

Page 63: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 63/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

63

* 296脚TFBGA封装。

4.2.3 LPC32x0系列MCU方框图

我们以LPC3250组成来说LPC32x0系列MCU基本构成,如下图4.6所示。

 

图4.6 LPC3250方框图

4.3 恩智浦LPC2000系列MCU  

恩智浦LPC2000系列采用 ARM7TDMI -S内核,工作频率84MHz,功能强大,性价比高。它们集成

了LCD支持功能,并提供大量的外设,包括多个串行接口、以太网接口、USB Host/OTG、CAN以及外

部总线接口,主要瞄准工业控制、医疗电子和连接类应用。

这个系列的产品非常广泛,有超 过80个型号,具体又可分为LPC2100系列、LPC2200系列、

LPC2300系列、LPC2400系列、LPC2800系列和LPC2900系列等,我们将选取有代表性的产品进行

Page 64: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 64/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

64

介绍。

4.3.1 LPC2100系列MCU介绍

LPC2100系列MCU基于一个支持实时仿真和跟踪的16/32位 ARM7TDMI - S CPU ,并带有

128/256k字节(kB )嵌入的高速Flash存储器。128位宽度的存储器接口和独特的加速结构使32位代码

能够在最大时钟速率下运行。对代码规模有严格控制的应用可使用16位Thumb模式将代码规模降低

超过30%,而性能的损失却很小。

由于LPC2100系列采用非常小的64脚封装、极低的功耗、多个32位定时器、4路10位 ADC、PWM

输出以及多达9个外部中断,这使它们特别适用于工业控制、医疗系统、访问控制和电子收款机(POS)

等应用领域。由于内置了宽范围的串行通信接口,它们也非常适合于通信网关、协议转换器、嵌入式软

件调制解调器以及其它各种类型的应用,后续的器件还将提供以太网、802.11以及USB功能,该系列

MCU又衍生出很多型号,其中LPC2114/2124还是全球第一个实现可加密的 ARM微控制器。

1.LPC2100系列MCU主要特点

* 16/32位 ARM7TDMI-S核,超小LQFP和HVQFN封装;

* 16/32/64kB片内SRAM;

* 128/256kB片内Flash程序存储器;

* 128位宽度接口/加速器可实现高达60MHz工作频率;

* 通过片内boot装载程序实现在系统编程(ISP)和在应用编程(IAP);

* Embedded ICE可实现断点和观察点;

* 嵌入式跟踪宏单元(ETM)支持对执行代码进行无干扰的高速实时跟踪;

* 10位 A/D转换器,转换时间低至2.44μs;

* CAN接口,带有先进的验收滤波器;

* 多个串行接口,包括2个16C550工业标准UART、高速I2C接口(400 kHz)和2个SPI接口。

2.LPC2100系列MCU参数配置如下所示:

Page 65: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 65/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

65

表4.4 LPC2100系列MCU参数规格表

器件型号

存贮器 定时/计数器 串行接口 最大频率

加密

CPU

电压

I/O

电压

工作温度(℃) 

 A/D D/A 封装RAM Flash

定时器

PWM

RTC/

系统定时器

WDT UART I2C SPI

SSP

[2]

USB

2.0CAN

LPC2101 2K 8K √ √ √ √ 2 2 1 1 70 √ 1.8 3.3 -40~85 8-ch/10-bit - LQFP48

LPC2102 4K 16K √ √ √ √ 2 2 1 1 70 √ 1.8 3.3 -40~85 8-ch/10-bit - LQFP48

LPC2103 8K 32K √ √ √ √ 2 2 1 1 70 √ 1.8 3.3 -40~85 8-ch/10-bit - LQFP48

LPC2104 16K 128K √ √ √ √ 2 1 1 1 60 - 1.8 3.3 0~70 - - LQFP48

LPC2106 64K 128K √ √ √ √ 2 1 1 1 60 - 1.8 3.30~70

-40~85- -

LQFP48

HVQFN48

LPC2109 8k 64k √ √ √ √ 2 1 2 1 60 √ 1.8V 3.3V -40~+85 4-ch/10-bit - LQFP64

LPC2114 16K 128K √ √ √ √ 2 1 2 60 √ 1.8 3.3 -40~85 4-ch/10-bit - LQFP64

LPC2124 16K 256K √ √ √ √ 2 1 2 60 √ 1.8 3.3 -40~85 4-ch/10-bit - LQFP64

LPC2119 16K 128K √ √ √ √ 2 1 2 2 60 √ 1.8 3.3 -40~85 4-ch/10-bit - LQFP64

LPC2129 16K 256K √ √ √ √ 2 1 2 2 60 √ 1.8 3.3 -40~85 4-ch/10-bit - LQFP64

LPC2131 8K 32K √ √ √ √ 2 2 1 1 60 √ 3.3 3.3 -40~85 8-ch/10-bit - LQFP64

LPC2132 16K 64K √ √ √ √ 2 2 1 1 60 √ 3.3 3.3 -40~85 8-ch/10-bit1-ch

10-bitLQFP64

LPC2134 16K 128K √ √ √ √ 2 2 1 1 60 √ 3.3 3.3 -40~85Dual

8-ch/10-bit

1-ch

10-bitLQFP64

LPC2136 32K 256K √ √ √ √ 2 2 1 1 60 √ 3.3 3.3 -40~85Dual

8-ch1/0-bit

1-ch

10-bitLQFP64

LPC2138 32K 512K √ √ √ √ 2 2 1 1 60 √ 3.3 3.3 -40~85Dual

8-ch/10-bit

1-ch

10-bitLQFP64

LPC2141 8K 32K √ √ √ √ 2 2 1 1 1 60 √ 3.3 3.3 -40~85 6-ch/10-bit - LQFP64

LPC2142 16K 64K √ √ √ √ 2 2 1 1 1 60 √ 3.3 3.3 -40~85 6-ch/10-bit1-ch

10-bitLQFP64

LPC2144 16K 128K √ √ √ √ 2 2 1 1 1 60 √ 3.3 3.3 -40~858-ch+6-ch /10-

bit

1-ch

10-bitLQFP64

LPC2146 32K+8K

256K √ √ √ √ 2 2 1 1 1 60 √ 3.3 3.3 -40~85 8-ch+6-ch/10-bit

1-ch10-bit

LQFP64

LPC214832K

+8K512K √ √ √ √ 2 2 1 1 1 60 √ 3.3 3.3 -40~85

8-ch+6-ch/10-

bit

1-ch

10-bitLQFP64

LPC2157[1] 32 512 √ √ √ √ 2 2 1 1 60 √ 3.3V 3.3 -40~85 Dual 8-ch/10-bit1-ch

10-bitLQFP100

LPC2158[1] 40 512 √ √ √ √ 2 2 1 1 1 60 √ 3.3V 3.3 -40~858-ch+6-ch/10-

bit

1-ch

10-bitLQFP100

LPC2194 16K 256K √ √ √ √ 2 1 2 4 60 √ 1.8 3.3 -40~125 4-ch/10-bit - LQFP64

2.LPC2100系列MCU典型构成如下方框图所示:

Page 66: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 66/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

66

图4.7 LPC2131/2132/2138方框图

4.3.2 LPC2200系列MCU介绍

LPC2200系列MCU基于一个支持实时仿真和嵌入式跟踪的16/32位 ARM7TDMI-S CPU,处理器

时钟高达60M/75MHz,片内集成8KB、16KB、32KB、64KB、128KB、256KB和512KB的高速Flash存

储器,128位宽度的存储器接口和独特的加速结构使32位代码能够在最大时钟速率下运行。此外,片

内集成大量外设:外部存储器控制器(EMC)、UART接口、CAN-bus接口、SPI接口、SSP接口、I2C接

口、 ADC、DAC、USB 2.0接口、通用定时器、外部中断、PWM、实时时钟、LCD驱动器等等。通过外部

存储器接口可以扩展64MB的异步静态存储器设备。

1.LPC2200系列MCU主要特性:

* 16/32位 ARM7TDMI-S微控制器,LQFP144和TFBGA144封装;

Page 67: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 67/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

67

* 16/64kB片内静态RAM(LPC2210/LPC2220 );

* 串行boot装载程序通过UART0来实现在系统下载和编程;

* EmbeddedICE-RT和嵌入式跟踪接口使用片内RealMonitor 软件对任务进行实时调试;

* 并支持对执行代码进行无干扰的高速实时跟踪;

* 8路10位 A/D转换器,转换时间低至2.44μs;

* 2个32位定时器(LPC2220也具有外部事件计数器)带4路捕获和4路比较通道;

* PWM单元(6路输出)、实时时钟(RTC)和看门狗。

* 多个串行接口,包括2个16C550工业标准UART、高速I2C总线(400kbit/s)和2个SPI接口;

* 在LPC2220上,可选择带有数据缓冲区和可变长度传输的同步串行口(SSP)来代替一个SPI;

* 向量中断控制器(VIC),可配置优先级和向量地址;

* 通过外部存储器接口可将存储器配置成4组,每组的容量高达16Mb,数据宽度为8/16/32位;

* 多达76个通用I/O口(可承受5V电压)。可使用9个边沿或电平触发的外部中断管脚;

* 通过可编程的片内锁相环(PLL )可实现最大为60/75MHz(LPC2210/2220 )的CPU操作频率;

* 设置时间为100μs;

* 带外部晶体的片内振荡器频率范围:1~30MHz,外部振荡器的频率高达50MHz;

* 2个低功耗模式:空闲和掉电;

* 通过外部中断将处理器从掉电模式中唤醒;

* 可通过个别使能/禁止外部功能来优化功耗;

* 双电源;

* CPU操作电压范围:1.65V±1.95 V(1.8 V± 0.15 V);

* I/O操作电压范围:3.0±3.6 V(3.3V±10%),I/O口可承受5V电压。

2.LPC2200系列MCU产品参数规格表:

表4.5 LPC2200系列MCU参数规格表

器件

型号

存贮器 定时/计数器 串行接口 最大

频率 加密

复位

电平

CPU

电压

I/O

电压

工作温度

(℃)  A/D 封装RAM Flash 定时器 PWM RTC/系

统定时器

WDT UART I2C SPI SSP CAN

LPC2210 16K - √ √ √ √ 2 1 2 60 - 低 1.8 3.3 -40~85 8-ch/10-bit LQFP144

LPC2220 64K - √ √ √ √ 2 1 1 1 60 - 低 1.8 3.3 -40~85 8-ch/10-bi t

LQFP144

TFBGA144

LPC2212 16K 128K √ √ √ √ 2 1 2 60 √ 低 1.8 3.3 -40~85 8-ch/10-bit LQFP144

LPC2214 16K 256K √ √ √ √ 2 1 2 60 √ 低 1.8 3.3 -40~85 8-ch/10-bit LQFP144

LPC2290 16K - √ √ √ √ 2 1 2 2 60 - 低 1.8 3.3 -40~85 8-ch/10-bit LQFP144

LPC2292 16K 256K √ √ √ √ 2 1 2 2 60 √ 低 1.8 3.3 -40~5 8-ch/10-bit LQFP144

LPC2294 16K 256K √ √ √ √ 2 1 2 4 60 √ 低 1.8 3.3 -40~125 8-ch/10-bit LQFP144

Page 68: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 68/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

68

3.LPC2200系列MCU典型方框图如下所示:

图4.8 LPC2210方框图

4.3.3 LPC24XX系列MCU介绍

恩智 浦LPC24xx系列MCU使用一个工作在72MHz的高性能32位 ARM7内核;每个器件含有

512KB的片内Flash和98KB的片内SRAM存储器;在系统编程(ISP)和在应用编程(IAP)软件将编程

时间缩至最短——编程每个256字节行只需要1ms、编程一个扇区或擦除整个芯片只需要400ms。128

位宽的存储器接口和专有的存储器加速器使32位的代码可以在最高时钟速率下执行,无需使用宝贵的

SRAM。对代码大小有严格要求的应用选择使用16位Thumb模式可以减少30%的代码规模,损失的性

能却最少。该系列的每个微控制器都包含1个10/100 Ethernet MAC接口、1个支持OTG、主机(OHCI)

和设备操作的USB 2.0全速(12Mbps)设备、2个CAN2.0B通道、1个通用DMA控制器、1个10位的 A/D

转换器和1个10位的D/A转换器。Ethernet MAC在独立的 AHB总线上有16KB的SRAM和一个相关的

DMA控制器。它还有一个媒体独立接口(MII)和简化的MII(RMII)接口。USB控制器含有4KB的USB

Page 69: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 69/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

69

SRAM和可存取的DMA,支持32个端点的控制、中断、批量和同步数据传输模式。

多个串行通信接口和巨大的外设缓冲区增强了设计的灵活性。LPC24xx有4个32位的捕获/比较定

时器、用于三相电机控制(包含“死区时间(dead time)”)的2个PWM单元、1个带有2KB电池SRAM

的低功耗实时时钟、1个看门狗定时器(有多种时钟源选择)和1个可用作主系统时钟的4MHz内部RC

振荡器。

LPC24xx的每个外设都有一个独立的时钟分频器,这就使设计者能够将功耗降至最 低。而且,P0

口和P2口的每个管脚都可用作外部中断管脚。该系列的微控制器有160个以高达18MHz的速率触发的

通用I/O。每个微控制器的工作温度范围为-40~85℃。

外部存储器控制器(EMC)支持异步静态存储器器件(例如RAM ROM和Flash)和动态存储器

(例如SDRAM)。微控制器有4个静态存储器片选信号、4个同步存储器器件片选信号。关于调试,每个

器件都支持实时仿真和嵌入式跟踪支持,都有一个集成的向量中断控制器(VIC)。而且,为了兼容现有

的工具,每个器件都使用标准的 ARM测试/调试JTAG接口。

这些微控制器专为设备的连接而设计,它们功能强大、性价比较高。

1.LPC24XX系列MCU特性:

* 72MHz、32位的 ARM7TDMI-S,带双 AHB总线;

* 512KB的ISP/IAP Flash和98KB的SRAM;

* SDRAM、SRAM和Flash的外部存储器接口;

* Flash编程极快,通过片内的boot loader 软件实现;

* 10/100 Ethernet MAC接口,带DMA和MII/RMII接口;

* USB2.0全速OTG /设备/ OHCI,带有PHY和DMA;

* 2个CAN2.0B接口;

* 通用DMA控制器;

* 10位 A/D转换器和10位D/A转换器;

* 多个串行接口:3个 I2C、1个I

2S、4个UART和3个SPI/SSP;

* 4个32位的定时器、1个低功耗的实时时钟和1个看门狗定时器;

* 4MHz的内部RC(IRC)振荡器,可以调节到1%的精度;

* 160个通用快速I/O;

* 单个3.3V的电源(3.0~3.6V);

* 含有几种掉电模式,包括“深度掉电”;

* 封装:

Page 70: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 70/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

70

TFBGA180(12×12×0.8mm)

LQFP208(28×28×1.4mm)

TFBGA208(15×15×0.8mm)

2.LPC24XX系列MCU方框图如下所示:

 

图4.9 LPC24XX系列MCU方框图

3.LPC24XX系列MCU参数规格如下表所示:

表4.6 LPC24xx 系列MCU参数规格

器件型号

存储器 串行  ADC/DAC选项

LCD

控制器封装

Flash

(KB)

SRAM

(KB)外部接口

10/100

Ethernet

USB 2.0

(12Mbps)CAN UART I

2C I

2S

SPI

/SSP

SD

/MMC

 AD C通道

(10位)

DAC通道(10位)

LPC2420 - 82 完整的32位 - D/H/O - 4 3 1 1/2 1 8 1 无 LQFP208

LPC2458 512 98 完整的32位 1 D/H/O 2 4 3 1 1/2 1 8 1 无 TFBGA180

LPC2460 - 98 完整的32位 1 D/H/O 2 4 3 1 1/2 1 8 1 无T F B G A 2 0 8 /

LQFP208

Page 71: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 71/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

71

器件型号

存储器 串行  ADC/DAC选项

LCD

控制器封装

Flash

(KB)

SRAM

(KB)外部接口

10/100

Ethernet

USB 2.0

(12Mbps)CAN UART I

2C I

2S

SPI

/SSP

SD

/MMC

 AD C通道

(10位)

DAC通道(10位)

LPC2468 512 98 完整的32位 1 D/H/O 2 4 3 1 1/2 1 8 1 无T F B G A 2 0 8 /

LQFP208

LPC2470 - 98 完整的32位 1 D/H/O 2 4 3 1 1/2 1 8 1 有T F B G A 2 0 8 /

LQFP208

LPC2478 512 98 完整的32位 1 D/H/O 2 4 3 1 1/2 1 8 1 有T F B G A 2 0 8 /

LQFP208

 

4.3.4 LPC2880/2888MCU介绍

LPC2880/2888 MCU是一款基于 ARM7的微控制器,适合于要求低功耗和高性能的便携式应用。

它包含一个USB2.0高速设备接口,一个能够连接 SDRAM和Flash的外部存储器接口,一个MMC/SD

存储卡接口, A/D和D/A转换器以及包含UART、I2C总线和I

2S总线在内的串行接口。在结构上增加了

多通道DMA,处理器高速缓存,多条内部总线上的同步操作和灵活的时钟发生单元,它们有助于确保

LPC2880/2888在与其它众多竞争产品相比,能够处理更高要求的应用。该芯片能够采用单电池USB

或已校准的1.8V和3.3V供电。

1.LPC2880/2888 MCU特性:

* ARM7TDMI处理器,带8kB高速缓存,工作频率可高达60MHz;

* 1MB片内Flash程序存储器,可实现128位高性能访问;

* 64kB SRAM;

* Boot ROM允许执行Flash代码,外部代码或通过USB进行Flash编程;

* 片内DC/DC转换器,能够从单电池或USB电源产生所有必需的电压;

* 多条内部总线允许在没有竞争的情况下,实现同步的简单DMA、USB DMA和从片内Flash执

行程序;

* 外部存储器控制器支持Flash、SRAM、ROM和SDRAM;

* 高级向量中断控制器,支持高达30个向量中断;

* 创新的事件路由器允许从高达107个源中实现中断、上电和时钟启动功能;

* 多通道GP DMA控制器能够与大多数片内外设一起使用,也可以用作存储器到存储器接口;

串行接口

* 带片内物理层的高速USB2.0设备(480Mb/s或12Mb/s);

* 带小数波特率发生器、流控制、IrDA支持和FIFO的UART;

* I2C总线接口;

* I2S总线(内部音频总线)接口,用于独立的立体声数据音频输入和输出;

Page 72: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 72/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

72

* 安全数字(SD)/多媒体卡(MMC)存储卡接口;

* 带5通道多路输入的10位 A/D转换器;

* 带放大和增益控制的16位立体声 A/D和D/A转换器;

* 高级时钟发生单元和功率控制降低了功耗;

* 2个带可选预分频器的32位定时器;

* 8位/4位LCD接口总线;

* 实时时钟,可由32kHz振荡器或其它时钟源提供;

* 具有中断和/或复位功能的看门狗定时器。

2.LPC2880/2888 MCU方框图如下所示

图4.10 LPC2880方框图

3.LPC28XX MCU参数规格如下表所示

Page 73: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 73/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

73

表4.7 LPC28XX系列MCU参数规格一览

器件型号

存贮器 定时/计数器

 ADC

外部

总线

接口

频率

电平

CPU

I/O

工作温度

(℃)封闭 其它特性

RAM Flash定时

器WDT RTC PWM USB UART I

2C SPI

LPC2880 64K - 2 1 1

√ 高速

USB2.0

可配置

lrDA

I2C和

I2S-

5-ch/10-

bit

60 低 1.8 3.3 -40C~85 TFBGA180

多媒体卡

接口L C D接口逻辑

LPC2888 64K 1M 3 1 1 √ 高速

USB2.0

可配置

lrDA

I2C和

I2S

-5-ch/10-

bit√ 60 低 1.8 3.3 -40C~85 TFBGA180

多媒体卡接口L C D

接口逻辑

4.3.5 LPC29XX系列MCU介绍

恩智浦LPC29XX系列MCU微控制器基于80MHz的 ARM968E-SMCU,有两个CAN控制器和两个

LIN控制器,提供连接和网关选项,非常适用于包括工业自动化和车内网络在内的应用。LPC2900针

对提升的性能进行了优化,在一个片上功耗管理单元(PMU)的帮助下,能够满足更低功耗应用需求。

1.LPC29XX系列MCU关键特性

* ARM968E-S处理器,最大工作频率为125MHz;

* 125MHz频率下多层 AHB系统总线,带有3个独立的层;

* 片内存储器:

* 2个紧密耦合的存储器(TCM),16KB指令(ITCM),16KB数据TCM(DTCM);

* 2个独立的内部静态RAM(SRAM):32KB SRAM和16KB SRAM;

* 8KB ETB SRAM,也可用于代码执行和数据;

* 高达768KB高速Flash程序存储器;

* 16KB EEPROM,字节可擦除/可编程;

* 双主机、8通道GPDMA控制器在 AHB多层矩阵上,可与I2C接口、SPI接口和UART一起使用,

并可用于存储器到存储器之间的传输(包括TCM存储器);

* 外部静态存储器控制器(SMC),带8个存储区;高达32位数据总线、24位地址总线;

串行接口

* 2通道的CAN控制器,支持Full-CAN和大量消息的过滤;

* 2个LIN主机控制器带有全硬件支持LIN通信。LIN接口可配置为UART来提供2个额外UART

接口;

* 2个550 UART,带16字节的Tx和Rx FIFO深度、DMA支持和RS485(9位)支持;

* 3个全双工Q-SPI,带有4个从机-选择线;16位宽;8个单元的深度;Tx FIFO和Rx FIFO;

* 2个I2C总线接口;

其它外设

Page 74: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 74/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

74

* 2个8路的10位 ADC,带3.3V测量范围,每个通道的转换时间低至2.44μs。每个通道提供一

个比较功能,最大限度地减少了中断;

* 用于所有 ADC的多个触发启动选项:定时器、PWM、其它 ADC和外部信号输入;

* 4个32位的定时器,每个定时器都包含4个链接到I/O的捕获和比较寄存器;

* 4个6通道PWM(脉宽调制器),带捕获和中断(trap)功能;

* 2个特定的32位定时器,用于调度并且使PWM和 ADC同步;

* 正交编码器接口可监控一个外部正交编码器;

* 带有定时器改变保护的32位看门狗,在安全时钟下运行;

* 多达108个通用I/O管脚,带可编程的上拉、下拉或总线保持器(bus keeper );

* 带有16个优先级的向量中断控制器(VIC);

* 多达19个电平检测的外部中断管脚,包括CAN和LIN唤醒特性;

* 可配置时钟输出管脚,用于驱动外部系统时钟;

* 处理器通过外部中断管脚从掉电中唤醒;CAN或LIN活动(activity);

* 灵活的复位发生器单元(RGU)可以控制各个模块的复位;

* 灵活的时钟产生单元(CGU0)可以控制各个模块的时钟频率:

* 片内极低功耗的环形振荡器,0.4MHz的固定频率,通常开启来提供一个Safe_Clock源用于

系统监控;

* 片内晶体振荡器,建议的工作频率范围从10MHz到25MHz。PLL输入范围从10MHz到

25MHz;

* 片内PLL允许CPU工作在125MHz的最大频率下;

* 产生多达11个基本时钟;

* 7个小数分频器;

* 第二个CGU(CGU1)具有其自身的PLL,能够产生可配置的时钟输出;

* 高度可配置的系统电源管理单元(PMU):

单个模块的时钟控制;

实现了任何配置下最小化系统工作功耗;

* 标准的 ARM测试和调试接口,带有实时在线仿真器;

* 支持边界扫描测试;

* ETM/ETB调试功能,带8KB特定的SRAM,也可访问用于应用代码和数据存储;

* 双电源:CPU工作电压:1.8V±5% I/O工作电压:2.7V~3.6V;输入最大可承受5.5V的电压;

* 144脚LQFP封装;

Page 75: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 75/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

75

* 环境工作温度范围:-40℃~+85℃。

2.LPC29XX系列MCU方框图如下图所示:

 

16KB指令紧密耦合存储器(ITCM)

16KB数据紧密耦合存储器(DTCM)

最大48KB总SRAM 768KB高速128位Flash

JTAG调试接口

最大工作频率为125MHz的带 AHB和 APB接口的

32位 ARM968E-S处理器内核

电源管理,看门狗、锁相环

32位外部存储器控制器(LPC2917、LPC2919)

向量中断控制器

2个550 UART 3个SPI

4个带捕获/比较通道32位定时器

4个6通道PWM

(脉宽调制器)

2个8路10位 ADC 3.3V

2个CAN主控制器,支持Full-

CAN和大量消息的过滤

2个LIN主控制器

(LPC2917,LPC2919)

多达108个通用I/O管脚,最大可承受5V电压

图4.11 LPC29XX系列MCU方框图

3..LPC29XX系列MCU参数规格如下图所示:

Page 76: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 76/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

76

  表4.8 LPC29XX系列MCU参数规格一览

器件型号

存储器 串行接口 模数

最高频率

(MHz)

CPU

电压

(V)

I/O电压

(V)

温 度 范

围选择封装Flash

(KB)

SRAM

(KB)

TCM(KB)

I-/D-

EEPROM

(KB) CAN LIN UART SPI

USB

Device

USB

OTG

USB

Host ADC

LPC2917/01 512 56 16/16 16 2 2 2 3 - - - 2 125 1.8 3.3 -40~85 LQFP144

LPC2919/01 768 56 16/16 16 2 2 2 3 - - - 2 125 1.8 3.3 -40~85 LQFP144

LPC2921 128 24 16/16 16 2 2 4 3 √ - - 2 125 1.8 3.3 -40~85 LQFP100

LPC2923 256 24 16/16 16 2 2 4 3 √ - - 2 125 1.8 3.3 -40~85 LQFP100

LPC2925 512 40 16/16 16 2 2 4 3 √ - - 2 125 1.8 3.3 -40~85 LQFP100

LPC2927 512 56 32/32 16 2 2 4 3 √ √ - 3 125 1.8 3.3 -40~85 LQFP144

LPC2929 768 56 32/32 16 2 2 4 3 √ √ - 3 125 1.8 3.3 -40~85 LQFP144

LPC2930 0 56 32/32 16 2 2 4 3 √ √ √ 3 125 1.8 3.3 -40~85 LQFP208

LPC2939 768 56 32/32 16 2 2 4 3 √ √ √ 3 125 1.8 3.3 -40~85 LQFP208

随着全球节能环保趋势日益明显,高效低功耗MCU将不断面市,MCU供应商将会不断推出更多功

能强大效率更高的MCU。

Page 77: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 77/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

77

第5章 MCU软硬件开发基本知识

作者:牛晓东 丰宝电子科技有限公司

概述:

工程师在基于一款MCU进行项目设计时,一般会先进行以下3步进行设计前的准备:

1.项目评估。工程师根据项目需求,确定MCU片上需要集成的功能,诸如Flash和RAM的大小?串

口多少路合适?需要CAN总线么?等等,对如一些特殊的应用如电机控制等,就要考虑MCU是否对该

功能具有特殊的设计。MCU片上集成的功能越多,意味 着芯片的成本越高,自然也就加大了产品本身

的成本。2.芯片选型。根据项目评估中MCU涉及的功能,选择自己熟悉的MCU中较为适合的一款。各个厂

商生产的MCU可能是以一个系列或者一个家族来分类的。不同型号的MCU对应需求不同,应用的地方

可能也有差异,而且不同厂家以及不同产品价格也有一定的差异。更为重要的是,选定的MCU是否存

在BUG--一些MCU可能由于自身设计的问题难免会有一些这样或者那样的问题,这就需要工程师在

选型之前认真阅读目标MCU的勘误手册,看看是否有些问题是自己项目中无法接受的,以及有些问题

是否可以通过软硬件得以避免。此外,是否芯片具有一定量的应用资料,后续技术支持是否可靠也是

一个相当重要的条件。选型工作是一个严谨的过程,需要工程师在性能和价格以及可能存在的风险之

间做出一个正确选择的过程。

3.样片申请。目前大部分的MCU厂商的MCU样片都需要通过其代理商处获得。同时,有些原厂、代

理商以及开发工具提供商也会提供一些基于MCU的开发板或者方案供客户参考使用。工程师在设计

时,先使用开发板熟悉以及调试应用,可以达到事半功倍的效果。

本章内容主要介绍LPC17xx系列微控制器的硬件和软件设计,各节针对LPC17xx一个功能。每

节针对相应的功能 对寄存器以及所需硬件设计进行了简述,某些功能给出了一些简单的程序进行参

考。如果读者希望获得比较详尽的功能测试代码程序,可以通过www.standardics.nxp.com上下载到

LPC17xx的Code Bundle代码包,该代码包中包含有各个功能比较相近的应用程序。限于编者的个人能

力,完稿稍显仓促,对于存在的问题,希望大家不吝指出,谢谢!本文的参考书籍一为《LPC17xx User 

Manual》另一为《 ARM原理与嵌入式应用--基于LPC2400系列处理器和IAR开发环境》。

5.1 LPC17xx系列处理器简介

LPC17xx系列是基于 ARM公司的Cortex-M3内核的微控制器,主要针对高集成度和低功耗的嵌

入式应用。LPC17xx系列处理器可以达到100MHz的CPU主频。 ARM的Cortex-M3系列CPU带有3级

Page 78: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 78/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

78

流水线(Pipeline)并且使用哈佛结构,带有独立的本地指令和数据总线以及用于外设的第三条总线。

 ARM Cor tex- M3 CPU还包括一个内部预取单元,支持不确定的分支操作。

LPC176x系列与思智浦公司基于 ARM7-TDMI内核LPC236x系列微控制器的管脚兼容。

  关于LPC17xx更详细的介绍请参看本书第四章内容。

5.2 LPC17xx处理器引脚配置

5.2.1 引脚配置

LPC17xx系列处理器共有100个引脚,提供LQFP100封装形式的IC,其引脚封装如图5.1所示。

 

图5.1 LPC176x系列LQFP100引脚封装图

从功能上将,LPC17xx的100引脚分为P0口、P1口、P2口、P3口、P4口,以及电源、复位、晶振

和其他引脚部分。关于引脚的具体信息,读者可以参考LPC17xx的用户手册中第七章“LPC17xx pin

configuration”中的内容。

5.2.2 引脚连接模块

LPC17xx芯片的绝大部分引脚是功能复用的,每个引脚都有可能用于不同的外设功能,引脚具体

用于什么外设功能是由引脚连接模块进行配置来实现的,当引脚选择了一个功能时,其它功能无效。

引脚连接模块共有27个寄存器,包括11个引脚功能选择寄存器、15个引脚功能模式寄存器和一

个I2C管脚配置寄存器组成。

引脚功能选择寄存器(PINSEL0~PINSEL10)

引脚功能选择寄存器用于控制每个引脚的功能,每个寄存器32位,每2个比特用于控制1个引脚功

能选择。

每一对比特设置引脚功能的定义如表5.1所示。

Page 79: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 79/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

79

  表5.1 引脚功能选择寄存器位的定义

PINSEL0~PINSEL10值 功能 复位值

00 主功能(默认),一般为GPIO口

00

01 第一备用功能

10 第二备用功能

11 第三备用功能

每个引脚默认为GPIO口,通过设置PINSEL的值来定义其引脚功能。对于引脚选择为GPIO时,引

脚的方向控制由GPIO方向寄存器FIODIR控制,对于其他功能,引脚的方向是由引脚功能控制的。

5.2. 3 引脚模式寄存器(PINMODED—PINMODE9)

引脚模式寄存器PINMODE为所有的GPIO端口控制片内上拉/下拉电阻特性。当使用片内上拉或

下拉电阻时,若引脚信号不确定,则使用上拉时为高电平,使用下拉时拉低为低电平。

与PINSEL寄存器一样,PINMODE寄存 器每2个 位控制1个引脚。每两个寄存 器控制一个端口

组。PINMODE寄存器取值定义如表5.2所示。

  表5.2 引脚模式寄存器位的定义

PINSEL0~PINSEL10值 功能 复位值

00 使能引脚片内上拉电阻

0001 保留

10 既不使用上拉也不使用下拉

11 使能引脚片下拉电阻

PINMODE_OD寄存器控制端口的开漏模式。开漏模式的配置可以使得管脚在配置为输出模式并

且配置数据为1时正常的被拉低,当配置数据为0时,管脚的输出驱动被关闭,相当于改变了端口的方

向,这样可以模拟出开漏输出模式。具体见表5.3所示。

表5.3 管脚开漏模式寄存器位的定义 

PINMODE_OD0~PINMODE_OD4值 功能 复位值

00 管脚处于正常模式,非开漏模式

00

01 管脚处于开漏模式

引脚连接模块的寄存器总表如表5.4所示。

Page 80: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 80/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

80

  表5.4 引脚连接模块的寄存器总表

寄存器名称 描述 访问 复位值 地址

PINSEL0 引脚功能选择寄存器0 读/写 0 0x4002 C000

PINSEL1 引脚功能选择寄存器1 读/写 0 0x4002 C004

PINSEL2 引脚功能选择寄存器2 读/写 0 0x4002 C008

PINSEL3 引脚功能选择寄存器3 读/写 0 0x4002 C00C

PINSEL4 引脚功能选择寄存器4 读/写 0 0x4002 C010

PINSEL5 引脚功能选择寄存器5 读/写 0 0x4002 C014

PINSEL6 引脚功能选择寄存器6 读/写 0 0x4002 C018

PINSEL7 引脚功能选择寄存器7 读/写 0 0x4002 C01C

PINSEL8 引脚功能选择寄存器8 读/写 0 0x4002 C020

PINSEL9 引脚功能选择寄存器9 读/写 0 0x4002 C024

PINSEL10 引脚功能选择寄存器10 读/写 0 0x4002 C028

PINMODE0 引脚模式寄存器0 读/写 0 0x4002 C040

PINMODE1 引脚模式寄存器1 读/写 0 0x4002 C044

PINMODE2 引脚模式寄存器2 读/写 0 0x4002 C048

PINMODE3 引脚模式寄存器3 读/写 0 0x4002 C04C

PINMODE4 引脚模式寄存器4 读/写 0 0x4002 C050

PINMODE5 引脚模式寄存器5 读/写 0 0x4002 C054

PINMODE6 引脚模式寄存器6 读/写 0 0x4002 C058

PINMODE7 引脚模式寄存器7 读/写 0 0x4002 C05C

PINMODE8 引脚模式寄存器8 读/写 0 0x4002 C060

PINMODE9 引脚模式寄存器9 读/写 0 0x4002 C064

PINMODE_OD0 开漏模式控制寄存器0 读/写 0 0x4002 C068

PINMODE_OD1 开漏模式控制寄存器1 读/写 0 0x4002 C06C

PINMODE_OD2 开漏模式控制寄存器2 读/写 0 0x4002 C070

PINMODE_OD3 开漏模式控制寄存器3 读/写 0 0x4002 C074

PINMODE_OD4 开漏模式控制寄存器4 读/写 0 0x4002 C078

I2CPADCFG I2C管脚配置寄存器 读/写 0 0x4002 C07C

5.3 存储器管理

LPC17xx系列微处理器片上最大集成了512KB的片内Flash存储器和64KB的片内SRAM,对Flash

存储器的编程可以通过以下几种方式实现:通过串口0进行在系统编程(ISP)、通过调用嵌入片内的

固件程序进行在应用中编程(IAP)以及通过内置的JTAG或者SWD接口编程。

LPC17xx的SRAM存储器,包括了主32KB的SRAM(可以被CPU和三个DMA控制器通过Higher-

Speed总线访问)、2个附加的SRAM各16KB位于 AHB矩阵总线上的独立从属端口上。这样的设计架

构可以允许CPU和DMA独立的访问,并且对总线主机来说几乎没有延时。

Page 81: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 81/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

81

5.3.1 存储器映射

 ARM公司的Cortex-M3内核共有4GB的地 址空间,表5.5展现了LPC17xx是怎样分配这些空间

的。

  表5.5 LPC17xx存储空间使用和细节

地址范围 用途 地址访问细节和描述

0x0000 0000 - 0x0003 FFFF 片内非易失存储器 Flash存储器(512kB)

0x1000 0000- 0x1000 7FFF 片内SRAM SRAM-bank0(32kB)

0x2007 C000- 0x2007 FFFF 片内SRAM,用于外设数据  AHB SRAM-bank0(16kB)

0x2008 0000 - 0x2008 3FFF 片内SRAM,用于外设数据  AHB SRAM-bank1(16kB)

0x2009 C000 - 0x2009 FFFF 通用I/O口

0x4000 0000 - 0x4007 FFFF APB0外设 可达32个外设模块,每个16kB

0x4008 0000 - 0x400F FFFF APB1外设 可达32个外设模块,每个16kB

0x5000 0000 - 0x501F FFFF AHB外设 DMA控制器,以太网接口和USB接口

0xE000 0000 - 0xE00F FFFF Cortex-M3相关功能 包括NVIC和系统节拍定时器

LPC17xx结合有一些独特的存储空间,如表5.5所示。图5.2展现了LPC17xx的复位后从编程用户

的角度所见的完整地址空间的映射图,中断向量空间支持地址重映射。

 AHB外设区域是一个2MB大小,允许分配128个外设的空间。每个外设分配有16kB的空间。所有

外设寄存器不管规格大小,都按照字地址进行分配(32位边界),并且不管字寄存器还是半字寄存器,

他们都是一次性访问的。例如,不可能对一个字寄存器的最高字节执行单独的读或者写操作。

5.3.2 存储器重映射

Cortex-M3带有允许中断向量表重映射到存储空间中备用区间。该功能可以通过NVIC中的向量表

设置寄存器实现。

向量表可以设置在Cortex-M3地址空间低端1GB的空间中。向量表必须以128字(512字节)为边

界定位,具体可以参考《Cortex-M3 Technical Reference Manual》。

Page 82: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 82/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

82

 

图5.2 LPC17xx系统存储空间映射图

5.3.3 Flash存储器加速器

当LPC17xx在F lash存储器中运行代码时,器件内部的存储器加速模 块最 大限度的提高了

Cortex-M3内核的处理性能,同时也可以降低MCU的功耗。Flash存储器加速模块不但提高了MCU的

执行速度而且改良了访问Flash存储器中数据时的功耗。

1.操作

存储器加速器可以将需要的下一个Cortex-M3指令锁存,以防止CPU取指暂停。LPC17xx仅适用

一组Flash存储器,这个Flash存储器加速模块包括一个8个128位的缓冲区用于存储指令和数据。

Cortex-M3内核为指令访问(ICode)和数据访问(DCode)在代码空间内提供独立的总线。这些总线还有通用DMA控制器的主端口是由 AHB多层矩阵进行仲裁的,任何访问Flash存储器空间的操作

Page 83: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 83/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

83

都将提交到Flash加速模块中进行处理。

当预取指令和分支缓冲区不能满足一次指令取值的需要,并且预取指还没有启动时,CPU在启动

128位的指令行取指时暂停。如果预取指已经启动但还未完成,则CPU暂停的时间会更短一些,预取

指在Flash结束前面的访问后立即启动,除非被数据访问中止。

预取指行被Flash模块锁存,但Flash加速模块不能在预取指缓冲区中捕获该行,直到CPU内核给

出预取指开始的地址,如果内核给出的地址与预取指地址不同,则预取指行丢弃。

2.Flash加速器结构

存储器加速器分成以下几个功能模块:

* AHB- Lite总线接口,可由Cortex-m3的ICode和DCode总线访问,当然通用DMA控制器也可以

访问;

* 一个8组128位缓冲区构成的矩阵;

* Flash加速控制逻辑,包括地址比较和Flash控制;

* 一个Flash存储器接口;

图5.3简单的描述了Flash存储器加速模块和数据路径。

 

图5.3 LPC17xx的Flash存储器加速模块结构示意图

Flash编程操作并不是由Flash加速器控制,而是一个独立的功能。启动ROM(Boot ROM)中含有

可被应用程序调用的Flash的编程算法(IAP代码),以及一个可对Flash存储器进行编程的装载程序

(ISP 代码)。

3.Flash加速器配置

在复位后Flash加速器默认为使能模式,软件可以在任何时间打开或者关闭Flash加速器,或者改

变加速器的配置,Flash加速器只有一个Flash加速器配置寄存器,如表5.6所示。FLASHCFG具体的

设置用户可以参考LPC17xx的用户手册获取更为详尽的信息。

Page 84: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 84/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

84

  表5.6 Flash加速器配置寄存器

名称 描述 访问 复位值 地址

FLASHCFG

Flash加速器配置寄存器。可以

控制Flash加速器所使用的缓冲

区以及Flash访问的时间。

读/写 0x507A 0x400F C000

5.4 中断向量控制器

5.4.1 控制器简述

嵌套向量中断控制器(NVIC)是Cortex-M3内核的一部分,详细信息用户可以参考《Cortex-M3

Technical Reference Manual》,其具有以下特点:

* 紧密耦合中断控制器可以提供较短的中断等待时间;

* 控制系统异常和外设中断;

* LPC17xx的NVIC支持33个向量中断源;

* 32个可编程中断优先等级,可硬件屏蔽优先等级;

* 可重定位向量表;

* Non-Maskable中断;

* 可以产生软件中断。

5.4.2 中断源

表5.7展示了每个外设功能的中断源。每个外设在向量中断控制器中有一条或者多条中断线连接,

而且每根中断线可能代表不止一种中断源,除了标准的 ARM内核,中断线本身没有标志或者优先级。

  表5.7 连接VIC通道的中断源

异常标号 Vector Offset 功能 标志

16 0x40 WDT看门狗 看门狗中断(WDINT)

17 0x44 定时器0 匹配0-1(MR0,MR1)

捕捉0-1(CR0,CR1)

18 0x48 定时器1匹配0-2(MR0,MR1,MR2)

捕捉0-1(CR0,CR1)

19 0x4C 定时器2匹配0-3

捕捉0-1

20 0x50 定时器3匹配0-3

捕捉0-1

21 0x54 串口0

Rx线状态(RLS)

发送保持寄存器空(THRE)

Rx数据可借用(RDA)

字符超时指示(CTI)

自动波特率结束( ABEO

自动波特率超时( ABTO)

Page 85: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 85/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

85

异常标号 Vector Offset 功能 标志

22 0x58 串口1

Rx线状态(RLS)

发送保持寄存器空(THRE)

Rx数据可借用(RDA)

字符超时指示(CTI)

自动波特率结束( ABEO)

自动波特率超时( ABTO)

23 0x5C 串口2

Rx线状态(RLS)

发送保持寄存器空(THRE)

Rx数据可借用(RDA)

字符超时指示(CTI)

自动波特率结束( ABEO)

自动波特率超时( ABTO)

24 0x60 串口3

Rx线状态(RLS)

发送保持寄存器空(THRE)

Rx数据可借用(RDA)

字符超时指示(CTI)

自动波特率结束( ABEO)自动波特率超时( ABTO)

25 0x64 PWM1PWM1的匹配0-6

PWM1的捕获0-1

26 0x68 I2C0 SI(状态改变)

27 0x6C I2C1 SI(状态改变)

28 0x70 I2C2 SI(状态改变)

29 0x74 SPISPI中断标志(SPIF)

模式错误(MODF)

30 0x78 SSP0

SSP0的Tx FIFO半空

SSP0的Rx FIFO半满

SSP0的Rx超时SSP0的Tx溢出

31 0x7C SSP1

SSP1的Tx FIFO半空

SSP1的Rx FIFO半满

SSP1的Rx超时

SSP1的Tx溢出

32 0x80 PLL0(主PLL) PLL0锁定(PLOCK0)

33 0x84 RTC计数器自增(RTCCIF)

报警(RTCALF)

34 0x88 外部中断 外部中断0(EINT0)

35 0x8C 外部中断 外部中断1(EINT1)

36 0x90 外部中断 外部中断2(EINT2)

37 0x94 外部中断外部中断3(EINT3)

注意:EINT3通道与GPIO中断共享

38 0x98 ADC 模数转换器转换结束

39 0x9C BOD 掉电检测

40 0xA0 USB

USB_INT_REQ_LP

USB_INT_REQ_HP

USB_INT_REQ_DMA

41 0xA4 CAN

CAN Common

CAN 0 Tx

CAN 0 Rx

CAN 1 TxCAN 1 Rx

42 0xA8 通用DMADMA通道0中断状态

DAM通道1中断状态

Page 86: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 86/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

86

异常标号 Vector Offset 功能 标志

43 0xAC I2S

IRQ

DMAREQ1

DMAREQ2

44 0xB0 以太网

WakeupInt

SoftInt

TxDoneInt

TxFinishedInt

TxErrorInt

TxUnderrunInt

RxDoneInt

RxFinishedIn

RxErrorInt

RxOverrunInt

45 0xB4 重复中断定时器 RITINT

46 0xB8 电机控制PWM

IPER[2:0]

IPW[2:0]

ICAP[2:0]

FES

47 0xBC 正交编码器

INX_Int

TIM_Int

VELC_Int

DIR_Int

ERR_Int

ENCLK_Int

POS0_Int

POS1_Int

POS2_Int

REV_Int

POS0REV_IntPOS1REV_Int

POS2REV_Int

48 0xC0 PLL1(USB PLL) PLL1锁定(PLOCK1)

49 0xC4 USB激活中断 USB_NEED_CLK

50 0xC8 CAN激活中断

5.5 电源电路

  LPC17xx系列微控制器在电源部分需要五种电压源对其供电,分别为:

1. 内核和外部通路所需的3.3V电压源VDD(3V3);

2. 内部稳压器所需的3.3V电压源VDD(REG)(3V3 );

3. 模拟部分(诸如片上 ADC以及DAC)所需的3.3V电压源VDDA;

4. 模数转换器 ADC所需的参考电压源VREFP;

5. 实时时钟RTC所需的3.3V电压源VBAT。

由上述分析可见,如果用户对 ADC参考电压源无特殊要求,LPC17xx系列微控制器可以统一由

3.3V电平的电压源供电,降低了用户在设计硬件时电源部分的复杂度,需要注意的是,模拟部分电压

源VDDA可以与VDD(3V3)由相同的电压源提供,但最好隔离开来以减小电源噪声。除此之外,用户的

Page 87: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 87/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

87

设计中不使用 ADC或者DAC,关于模拟部分电压源的管脚仍需要连接到电压源上。

现以Linpo-PS-LPC1760开发板为例,简单介绍一下LPC17xx系列微控制器电源部分的实现。如

图5.4所示,开发板使用常用的1117系列LDO低压差线性稳压器将外部5V电压源降压产生LPC17xx所

需的3.3V的电压,EC301和C302用于对5V输入电源的滤波,EC302和C303用于对3.3V输出电流的滤

波。

图5.4 LPC17xx系列微控制器3.3V电压源原理图

LPC17xx的RTC部分电路可参看图5.5,通过两个二极管D101和D102实现板上3.3V电源或者是

3.3V电池对RTC供电,且电池电源不会与板上3.3V电源产生影响。

 

图5.5 LPC17xx系列微控制器RTC供电部分原理图

5.6 复位电路

LPC17xx系列微控制器拥有4个复位源,分别是外部RESET复位,看门狗复位,上电复位(POR)以

及掉电检测复位(BOD),LPC17xx系列微处理器的复位逻辑图如图5.6所示。

Page 88: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 88/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

88

图5.6 LPC17xx系列微控制器复位逻辑图

一旦LPC17xx的Cortex-M3内核侦测到外部复位信号源(POR,BOD复位,外部复位和看门狗复位)

出现,内部RC振荡器(IRC)启动。在内部RC振荡建立时间(IRC-start-time,上电后最多60uS)并且IRC

可以提供稳定的时钟输出后,复位信号将被锁存并且与IRC时钟同步。以下的两步将会并发:

* 当同步复位信号断定后,2位 IRC唤醒定时器开始计数,在2位IRC唤醒定时超时后LPC17xx内

部ROM的启动代码开始执行,启动代码完成启动所需的任务以及实现跳转到Flash的功能,如果Flash

没有准备好被访问,MAM将插入等待周期直到Flash准备好了。

* 当同步复位信号断定后,Flash唤醒定时器(9位)开始计数。Flash唤醒定时器将对Flash的启动

时间产生100uS的定时,一旦超时则Flash初始化顺序将会启动,这个初始化任务将会持续大约250个

时钟周期。当初始化顺序完成,MAM就可以准许访问MAM了。

当内部复位信号撤销后,处理器将在地址0开始执行程序。因此,所有的与处理器和外设相关的寄

存器将以预定值被初始化。图5.7描述了当LPC17xx复位后启动时RESET,内部IRC以及处理器状态的

关系。

Page 89: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 89/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

89

 

图5.7 复位后系统系统示意图

1.外部RESET复位

外部RESET复位是通过外部电路将LPC17xx的RESET管脚拉低实现复位。外部RESET复位信号

不能立即清除,需在振荡电路稳定工作后及LPC17xx系列微处理器的X1管脚上出现符合要求的时钟信

号方可清除复位信号。

在用户实际应用中,用户须按照芯片厂商提供的复位参数 正确选择复位器件以及合理的复位电

路。LPC17xx系列微控制器的RESET管脚为施密特触发输入管脚,常见的外部复位电路有两种,一种

为阻容复位电路,另一种为专用复位IC电路。

阻容复位电路是利用上电时电容两端的电压不能突变因此Vc为0V。随着对电容的不断充电,Vc逐

渐上升直至稳定的电源电压,于是在芯片RESET管脚上形成了一定的低电平脉冲。当电源电压消失时,

二极管D1为电容C1提供了一个快速放电回路,从而使RESET管脚端的电压迅速回零,以便下次上电时

系统能及时可靠的复位。

虽然阻容复位电路简单而且成本低廉,但并不能完全保证在任何情况下都能够产生可靠稳定的复

位信号,在实际应用中,应当选用可靠稳定的专用复位芯片。图5.8为阻容复位的电路原理图。

图5.8 阻容复位电路原理

专用复位芯片也可理解为电压监控芯片,其选型时主要注意硬件系统是否需要手动复位以及复位

Page 90: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 90/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

90

电压阈值的选择。随着半导体厂商技术的创新,有些厂商将专用复位IC和E2PROM、看门狗或者RTC

等结合到一颗芯片上,提供更为简便的电路设计以及减小PCB的面积。Linpo-PS-LPC176X开发板选

取的是圣邦微电子设计的带有手动复位的复位阈值为2.95V的SGM811,如果用户的设计并不需要手

动复位功能,也可选取SGM809。复位阈值的选择是根据LPC17xx微控制器的工作电压范围来选定

的,LPC17xx的工作电压范围为2.4~3.6V之间,推荐工作电压为3.3V,处于对电路工作更加稳定的考虑

选取2.95V作为复位阈值比较合理,用户也可以根据自己的实际需求定制复位阈值,根据复位阈值选

取合适自己的复位IC。图5.9为SGM811专用复位IC的电路原理图。实际应用中需要对LPC17xx的复位

RESET脚加上10K的上拉电阻,以保证复位的可靠性。

图5.9 SGM811专用复位IC电路原理图

2.看门狗复位

看门狗实际为一个独立的计数器电路,对内部的独立时钟进行计数。计数器的一处输出连接到系

统电路的复位端,程序在一定时间范围内对计数器清零或者重新装载("喂狗" ),以使程序正常工作即计

数器不溢出,也就无法产生复位信号,如果程序执行时出现问题无法再规定的时间内复位看门狗计数

器,则看门狗计数器就会溢出产生复位信号。

LPC17xx系列微控制器内部集成了看门狗的功能,对于要求不苛刻的应用,可以使用LPC17xx内

部看门狗完成监控系统运行的任务。这样可以减少硬件成本并减少电路板的面积和走线。看门狗初始

化代码如程序清单5.1所示。

程序清单5.1  LPC17xx 看门狗初始化代码

WDCLKSEL = 0x00; //bit1:0 WDSEL 00:选择内部RC振荡器为看门狗时钟源

WDTC = 0x003FFFFF; //设置看门狗定时器参数

WDMOD = 0x03; //设置看门狗模式:中断且复位

3.上电复位

LPC17xx系列微 控制器 具有上电复位功能,当VDD管脚电平超过门限值时,POR信号有效,

Cortex-M3内核还是进入复位状态。

Page 91: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 91/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

91

4.掉电检测

LPC17xx的VDD管脚带有2级电压检测,如果VDD电压低于2.95V,则掉电检测器(BOD)向中断向

量控制器发出中断信号,使能该信号可以通过使能NVIC中的中断使能寄存器,即可产生CPU所需的中

断;如果没有使能NVIC中的中断使能寄存器,软件也可以通过读取Raw Interrupt Status Register 中的

内容实现监控。

当VDD管脚的电压降到低于2.65V时,第2级的低压检测将产生复位信号。该复位可以防止Flash

的内容发生改变,因为在低电压下各个功能部件的操作都将变得不再可靠,LPC17xx的BOD电路可以

在电源电压为1V及其以上时保持复位信号。

2.95V和2.65V阈值都存在一些滞后。正常工作时,滞后使得2.95V的检测电路能够产生可靠的中

断信号,掉电检测中断信号能够唤醒处于掉电模式下的CPU,使CPU退出掉电模式,但是,如果电源电

压在唤醒定时器完成延时前恢复为正常电平,那么此时BOD产生的结果是:CPU被唤醒,但不会产生

任何中断,RSID寄存器中的BODR位清零,此时可以确认掉电唤醒操作完成。

5.7 时钟电路

LPC17xx包括3个独立的时钟源,分别为主时钟振荡器、RTC时钟振荡器和内部RC 振荡器,在

LPC17xx复位后,LPC17xx将由内部RC振荡器提供时钟直至由软件切换到另外的时钟振荡源为止,这

使得系统可以不依赖于外部时钟进行操作,而且使引导加载程序可以在一个确定的频率下进行操作。

图5.10为LPC17xx的时钟系统发生示意图。

 

图5.10 LPC17xx的时钟系统发生示意图

1.内部RC振荡器(Internal RC Oscillator,IRC)

内部RC振荡器(IRC)可以作为看门狗的时钟源,也可以作为时钟,驱动锁相环(PLL)提供给CPU。

Page 92: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 92/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

92

IRC的精度不足,因此不能用于USB接口,通常IRC频率是4MHz,在开机或者芯片复位时,LPC17xx使

用IRC作为时钟源,之后可以通过软件切换使用其他时钟源。

2.主晶振(Main Oscillator )

主晶振可用于使用或不使用PLL0为CPU提供时钟,其频率范围为1~24MHz,这个频率可以通

过主PLL(PLL0)倍频至更高的频率直至CPU操作的最大频率。通常把主晶振输出的时钟称为OSC_ 

CLK,PLL0输入引脚上的时钟称为PLLCLKIN, ARM处理器时钟频率称为CCLK。当使用主晶振提供

时钟并不激活PLL时,PLLCLKIN和CCLK的值是相等的。

LPC17xx的板上晶振源可以工作在两种模式下:从属模式和振荡模式,在从属模式下,输入时钟

信号(XTAL1引脚)与一个100pF电容相连,其幅值不少于200mV,XTAL2引脚不连接。在振荡模式下,

由于片内集成了反馈电阻,所以只需要在外部链接一个晶体和电容CX1和CX2就可以形成基本模式振

荡。两种振荡器模式的示意图如图5.11所示。

图5.11 振荡器的模式示意图

3.RTC晶振(RTC Oscillator )

RTC晶振的频率为32.768KHz,一般用于给RTC实时时钟提供时钟源,RTC时钟源可以提供1Hz

的时钟频率给RTC 并且可以输出32kHz的时钟频率,作为PLL0和CPU或者看门狗定时器使用时钟

源。

4,时钟源选择

主晶振、RTC晶振以及内部IRC三个时钟源均有可能用来驱动PLL0从而给CPU和片内外设提供时

钟,当PLL0未连接时,系统才可以安全的切换时钟源。

Page 93: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 93/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

93

  表5.8 时钟源选择寄存器(CLKSRCSEL,0x400FC10C)

CLKSRCSEL 功能 值 描述 复位值

1:0 CLKSRC

00 选择IRC晶振为PLL0的时钟源

00

01 选择主晶振作为PLL0的时钟源

10 选择RTC晶振为PLL时钟源

11 保留

7:4 0 保留 0

5.8 锁相环PLL0(Phase Locked Loop 0)

PLL0接受输入的时钟频率范围为32kHz~50MHz。时钟源由CLKSRCSEL寄存器(见表5.9)选择。

输入频率可以被倍频到一个较高的频率上,之后可以通过分频为CPU、外设以及可选的USB子系统提

供精确的时钟。值得注意的是USB子系统拥有自己专用的PLL。PLL0可以产生最高至CPU允许的最大

100MHz的频率。

PLL0的输入频率通过一个预分频器分频成为PLL内部频率,预分频的值 用变量N表示,范围

1到256之间。然后再通过一个电流控制振荡器(CCO,Curren C ontrolled Oscillator )倍频增到范围

275~550MHz之间,倍频器的值用变量M表示。CCO频率再通过CPU频率设置寄存器分频成为提供

给CPU的CCLK时钟。

PLL的使能是由PLL0CON寄存器控制,PLL0倍频器和分频器的值都是由PLL0CFG寄存器控制。

为了防止PLL0参数发生意外改变或PLL0失效,对这两个寄存器进行了保护。当PLL0提供芯片时钟时,

由于芯片的所有操作,包括看门狗定时器在内都依赖于它,因此PLL0的设置的意外改变将导致CPU执

行不期望的操作。

在芯片复位或者进入掉电模式后,PLL0将被关闭或者屏蔽,PLL0必须由软件配置、使能连接到系

统中。PLL0接口框图如图5.12所示。

图5.12 PLL0结构框图

以下将描述PLL0涉及的寄存器及其功能描述。

Page 94: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 94/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

94

1.PLL0控制寄存器PLL0 Control register (PLL0CON,0x400F C080)

PLL0CON寄存器可以用于使能和连接PLL0,使能PLL0锁定到当前倍频器和分频器值设定的频

率上,连接PLL0将使处理器和大多数片内功能都根据PLL0的输出时钟来工作。对PLL0CON的更改只

有在对PLL0CON寄存器执行了正确的PLL馈送序列后才生效。

  表5.9 PLL0控制寄存器

PLL0CON 功能 描述 复位值

0 PLLE0PLL0使能。当该位为1并且在有效的PLL馈送后,该位将激活PLL0

并允许其锁定到指定的频率。0

1 PLLC0

PLL0连接。当PLLC0位和PLLE0位都为1并且在有效的PLL0馈

送后,将PLL0作为时钟源连接到LPC17xx。如果PLL0输出为

48MHz,那么PLL0就可以成为USB子系统的时钟源,否则不行。可

以参见PLL0STAT。

0

7:2 保留 保留 NA

PLL0在作为时钟源之前必须进行设置、使能并锁定。将振荡器时钟切换到PLL0输出或者翻过来

操作时,内部电路对操作进行同步以确保不会产生干扰,硬件不能确保PLL在连接之前锁定或在PLL0

在失去锁定时自动断开连接。在PLL0失去锁定的情况下,振荡器很可能已经变的不稳定,这样即使断

开PLL0也挽救不了这种情况。

2.PLL0配置寄存器PLL Configuration register (PLL0CFG, 0x400F C084)

PLL0CFG寄存器是最新的PLL0配置值的保存寄存器,包含PLL倍频器和分频器的值。在执行正

确的PLL0馈送序列之前改变PLL0CFG寄存器的值不会生效。

  表5.10 PLL0配置寄存器

PLL0CFG 功能 描述 复位值

14:0 MSEL0 PLL0倍频器值,在PLL频率计算中其值为M-1 0

15 保留 保留 NA

23:16 NSEL0 PLL0预分频器值,在PLL0频率计算中其值为N-1 0

31:24 保留 保留 NA

3.PLL0状态寄存器PLL0 Status Register(PLL0STAT, 0x400F C088)

PLL0STAT为只读寄存器,它是PLL0控制和配置信息的回读寄存器,反映了正在使用的真实PLL0

的参数和状态。PLL0STAT可能和PLL0CON和PLL0CFG中的值不同,这是因为没有执行正确的PLL0

馈送序列,这两个寄存器中的值并未生效。

Page 95: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 95/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

95

  表5.11 PLL0状态寄存器

PLL0STAT 功能 描述 复位值

14:0 MSEL0 读出的PLL0倍频器值,这是PLL当前使用的值 0

15 保留 保留 NA

23:16 NSEL0 读出的PLL0预分频器值,这是PLL当前使用的值 0

24 PLLE0_STAT读出的PLL0使能位,该位为1时,PLL0处于激活状态;为0时,

PLL0关闭;进入掉电模式时,该位自动清零。0

25 PLLC0_STAT

读出的PLL0连接位,当PLLC0和PLLE0位都为1时,PLL0作为时钟

源连接到LPC17xx;当PLLC0和PLLE0位为0时,PLL0被旁路,

LPC17xx直接使用振荡器时钟;进入掉电模式时,该位自动清零。

0

26 PLOCK0反映PLL0的锁定状态;为0时,PLL0未锁定;为1时,PLL0锁定到

指定的频率0

31:27 保留 保留 NA

PLL0STAT寄存器中的PLOCK0位连接到中断控制器,这样可以使用软件打开PLL0并连接到其他

功能,不需要等待PLL0锁定。当发生中断时(PLOCK0=1),可以连接PLL0并禁止中断。只能通过禁止

PLL0中断的方式返回。

PLL0有3种可能的工作方式,由PLLE0和PLLC0位组合获得。

  表5.12 PLL0的工作模式

PLLC0 PLLE0 PLL功能

0 0 PLL0被关闭并断开连接,系统使用未更改的时钟输入

0 1 PLL0被激活但是尚未连接,PLL0可在PLCOK0置位后连续

1 0 与00组合相同,这样消除了PLL0已连接但没有使能的可能性

1 1 PLL0已使能并连接到处理器作为系统时钟源

4.PLL0馈送寄存器PLL0 Feed register (PLL0FEED,0x400F C08C)

必须将正确的馈送序列写入 PLL0FEED寄存器才能使PLL0CON和PLL0CFG寄存器的更改生

效,馈送序列如下:

将值0xAA写入PLL0FEED

将值0x55写入PLL0FEED

这两个写操作的顺序必须正确,而且在两次操作之间必须没有其他的寄存器访问相同的地址空间

(从0x400F C000到0x400F FFFF),这就意味着尽量在执行PLL0馈送操作的时候禁止中断,不管写入

的值不正确还是没有满足前两个条件,对PLL0CON或者PLL0CFG寄存器的更改都不会生效。

表5.13 PLL0馈送寄存器

PLL0FEED 功能 描述 复位值

7:0 PLL0FEEDPLL0馈送序列必须写入该寄存器才能使PLL0配置

和控制寄存器的更改生效0x00

Page 96: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 96/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

96

5.PLL0和掉电模式

掉电模式会自动关闭并断开PLL0,从掉电模式唤醒不会自动恢复PLL0的设置,PLL0的恢复必须

由软件来完成。通常,一个将PLL0激活并等待锁定,然后将PLL0连接的子程序可以在任何中断服务

程序的开始调用,有一点非常重要,那就是不要试图在掉电唤醒后简单的执行馈送序列来重新启动

PLL0,这会出现在PLL0锁定建立之前同时使能并连接PLL0的危险。

6.PLL0频率计算

  表5.14 PLL0所需变量表

变量 描述

FIN PLLCLKIN的频率

FCCO PLLCK的频率

N PLL0预分频值(PLL0CFG NSEL0 + 1)

M PLL0倍频值(PLL0CFG MSEL0 + 1)

FREF PLL内部参考频率,FIN除以N

当LPC17xxx微处理器系统需要使用PLL0时,应当按照以下原则进行计算配置。

* 确定应用是否需要USB接口,并且USB是否由PLL0提供时钟,USB需要一个准确的50%占空

比48MHz时钟信号,这就意味着FCCO必须为48MHz的整数倍(如96MHz)并且FCCO要相当准确;

* 确定处理器的时钟频率CCLK。这可以根据对处理器的整体要求来决定,外围器件的时钟频率

可以低于处理器的频率;

* 选择PLL输入频率FIN的值;

* 计算M和N的值,以产生一个有效且精确的FCCO的频率。

PLL0的输出频率公式为:FCCO=(2×M×FIN)/N

例如,系统不需要USB接口,目标CPU速率为72MHz,32.768kHz的RTC时钟作为系统的时钟

源。M=(FCCO×N)/(2×FIN),可以产生CPU需求频率并且PLL0可以正常操作范围内的最小FCCO频率

是288MHz(4×72MHz)。由N=1开始计算,所以M=288×106/(2×32,768)=4,394.53125。计算所得并不

是一个整数,所以CPU的频率不是精确的288MHz。

5.9 锁相环PLL1(Phase Locked Loop 1)

PLL1仅从主晶振获得自己的时钟频率,并且可以用于仅为USB子系统提供混合48MHz的时钟频

率,这可以看作由PLL0提供USB时钟源以外的另一个选择。

PLL1在复位后是禁用并且处于关闭状态,如果PLL1被停用,USB的时钟可以由完成提供48MHz

信号状态设定后的PLL0提供,如果PLL1通过PLL1CON寄存器使能并且连接,那么PLL1将自动的作为

Page 97: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 97/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

97

USB子系统的时钟源。

PLL1的激活由PLL1CON寄存器控制,它的倍频和分频值由PLL1CFG寄存器控制,为了防止PLL1

参数发生意外改变或者PLL1失效,对这两个寄存器进行了保护,完成保护的馈送顺序类似于看门口定

时器。图5.13为LPC17xx的PLL1的结构框图。

 

图5.13 PLL1结构框图

以下将描述PLL1涉及的寄存器及其功能描述。

1.PLL1控制寄存器PLL1 Control register (PLL1CON,0x400F C0A0)

PLL1CON寄存器可以用于使能和连接PLL1,使能 PLL1锁定到当前倍频器和分频器值设定的

频率上,连接PLL1将使US B子系统功能根据PLL1的输出时钟来工作,对PLL1CON的更改只有在对

PLL1FEED寄存器执行了正确的PLL馈送序列后才生效。

  表5.15 PLL1控制寄存器

PLL1CON 功能 描述 复位值

0 PLLE1PLL1使能。当该位为1并且在有效的PLL1馈送后,该位将激活PLL1

并允许其锁定到指定的频率。0

1 PLLC1

PLL1连接。当PLLC1位和PLLE1位都为1并且在有效的PLL1馈送后,

将PLL1作为时钟源做为USB子系统的时钟源,否则不行。可以参见

PLL1STAT。

0

7:2 保留 保留 NA

PLL1在作为USB子系统时钟源之前必须进行设置、使能并锁定。

Page 98: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 98/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

98

2.PLL1配置寄存器PLL1 Configuration register(PLL1CFG,0x400F C0A4)

PLL1CFG寄存器是最新的PLL1配置值的保存寄存器,包含PLL倍频器和分频器的值。在执行正

确的PLL1馈送序列之前改变PLL1CFG寄存器的值不会生效。

  表5.16 PLL1配置寄存器

PLL1CFG 功能 描述 复位值

4:0 MSEL1 PLL1倍频器值,在PLL1频率计算中其值为M 0

6:5 PSEL1 PLL1分频值。在PLL1频率计算中其值为P 0

7 保留 保留 NA

3.PLL1状态寄存器PLL1 Status Register(PLL1STAT,0x400F C0A8)

PLL1STAT为只读寄存器,它是PLL1控制和配置信息的回读寄存器,反映了正在使用的真实PLL1

的参数和状态。PLL1STAT可能和PLL1CON和PLL1CFG中的值不同,这是因为没有执行正确的PLL1

馈送序列,这两个寄存器中的值并未生效。

  表5.17 PLL1状态寄存器

PLL1STAT 功能 描述 复位值

4:0 MSEL1 读出的PLL1倍频器值,这是PLL1当前使用的值 0

6:5 PSEL1 读出的PLL1预分频器值,这是PLL1当前使用的值 0

7 保留 保留 NA

8 PLLE1_ STAT

读出的PLL1使能位,该位为1时,PLL1处于激活状态;为0时,PLL1关闭;进入掉电模式时,该位自动清零。

0

9PLLC1_ 

STAT

读出的PLL1连接位,当PLLC1和PLLE0位都为1时,PLL1作为时

钟源连接到LPC17xx;当PLLC1和PLLE1位为0时,PLL1被旁路,

LPC17xx直接使用振荡器时钟;进入掉电模式时,该位自动清零。

0

10 PLOCK1反映PLL1的锁定状态;为0时,PLL1未锁定;为1时,PLL1锁定到

指定的频率0

15:11 保留 保留 NA

PLL1STAT寄存器中的PLOCK1位连接到中断控制器,这样可以使用软件打开PLL1并连接到其他

功能,不需要等待PLL1锁定,当发生中断时(PLOCK1=1),可以连接PLL1并禁止中断。

PLL1有3种可能的工作方式,由PLLE1和PLLC1位组合获得。

  表5.18 PLL1的工作模式

PLLC0 PLLE0 PLL功能

0 0 PLL1被关闭并断开连接

0 1 PLL1被激活但是尚未连接,PLL1可在PLCOK1置位后连接

1 0 与00组合相同,这样消除了PLL1已连接但没有使能的可能性

1 1 PLL1已使能并连接到处理器作为USB子系统的时钟源

Page 99: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 99/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

99

4.PLL1馈送寄存器PLL1Feed register (PLL1FEED,0x400F C0AC)

必须将正确的馈送序列写入PLL1FEED寄存器才能使PLL1CON和PLL1CFG寄存器的更改生效。

馈送序列如下:

将值0xAA写入PLL1FEED

将值0x55写入PLL1FEED

这两个写操作的顺序必须正确,而且在两次操作之间必须没有其他的寄存器访问相同的地址空间

(从0x400F C000到0x400F FFFF),这就意味着尽量在执行PLL1馈送的操作的时候禁止中断。不管写

入的值不正确还是没有满足前两个条件,对PLL1CON或者PLL1CFG寄存器的更改都不会生效。

  表5.19 PLL1馈送寄存器

PLL0FEED 功能 描述 复位值

7:0 PLL1FEEDPLL1馈送序列必须写入该寄存器才能使PLL1配置和控制

寄存器的更改生效0x00

5.PLL1和掉电模式

掉电模式会自动关闭并断开PLL1,从掉电模式唤醒不会自动恢复PLL1的设置,PLL1的恢复必须由

软件来完成。通常,一个将PLL1激活并等待锁定,然后将PLL1连接的子程序可以在任何中断服务程序

的开始调用,有一点非常重要,那就是不要试图在掉电唤醒后简单的执行馈送序列来重新启动PLL1,

这会出现在PLL1锁定建立之前同时使能并连接PLL1的危险。

6.PLL1频率计算

  表5.20 PLL1所需变量表 

变量 描述

FOSC 晶振振荡源的频率

FCCO PLL1当前控制的晶振的频率

USBCLK PLL1输出频率(针对USB的48MHz信号)

M PLL1倍频值PLL1CFG寄存器中的MSEL1

P PLL1分频值PLL1CFG寄存器中的PSEL1

PLL1的输出频率公式为:USBCLK=M×FOSC或者USBCLK=FCCO/(2×P )

确定PLL1为USB提供时钟配置的方法如下:

* PLL1需要输出的时钟频率是USBCLK=48MHz;

* 选择时钟频率(FOSC)。FOSC可以是12MHz,16MHz以及24MHz;

* 计算配置MSEL1的M值;

* 计算配置PSEL1的P值。

Page 100: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 100/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

100

5.10 时钟分频

PLL0的输出必须向下分频为更低频率的信号才能用于 CPU和USB模块(如果USB的时钟信号源

是PLL0提供)。提供给USB模块的分频器是独立的,因为USB的时钟要求必须是准确的48MHz而且有

50%的占空比。分频给CPU的信号成为CCLK时钟,并且再分频成为各个片内外设的驱动时钟。图5.14

给出了LPC17xx的PLL0和时钟分频的结构框图。

图5.14 PLL0和时钟分频的结构框图

1.CPU时钟配置寄存器CPU Clock Configuration register (CCLKCFG 0x400F C104)

CCLKCFG寄存器控制PLL0的分频输出提供给CPU。如果不使用PLL0,则分频值为1。

提示:当应用使用USB接口时,CCLK必须至少是18MHz以保证支持USB模块的内部操作。

  表5.21 CPU时钟配置寄存器

CCCLKCFG 功能 描述 复位值

7:0 CCLKSEL分频器值,用于生成CPU时钟(CCLK)。本值只能为0或计数值

(1,3,5,...,255)0x00

CCLK的值为PLL的输出频率除以CCLKSEL+1。当CCLKSEL的值为1时,CCLK的值为PLL输出频

率的一半。

2.USB时钟配置寄存器USB Clock Configuration register (USBCLKCFG 0x400F

C108)

提示:该寄存器只有在PLL1禁用时才有效。如果PLL1使能,PLL1的输出将自动用于USB的时

钟源,并且PLL1必须配置为适合USB模组的48MHz信号输出。

USBCLKCFG寄存器控制PLL0的分频输出提供给USB模块。PLL0输出必须在PLL可操作范围内

被分频出适合USB时钟频率的48MHz并且有50%占空比的信号。

提示:内部RC时钟不能用于为USB提供时钟信号,因为USB的应用需要更高的精度。

Page 101: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 101/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

101

  表5.22 USB时钟配置寄存器

USBCLKCFG 功能 描述 复位值

3:0 USBSEL 分频器值,用于生成USB时钟。 0x00

7:4 保留 保留 NA

3. IRC整理寄存器IRC Trim Register(IRCTRIM 0x400F C1A4)

该寄存器用于整理片内4MHz的晶振。

  表5.23 IRC整理寄存器

IRCTrim 功能 描述 复位值

7:0 IRCTrim IRC整理值,用于控制片内4MHz的IRC晶振频率 0xA0

15:8 保留 保留 NA

4.外设时钟选择寄存器0和1 Peripheral Clock Selection registers 0 and 1

(PCLKSEL0 0x400F C1A8 和 PCLKSEL1 0x400F C1AC)

这一对寄存器中的每两位控制一个外设的时钟,其取值意义如表5.24和表5.25所示。

表5.24 外设时钟选择寄存器0

PCLKSEL0 功能 描述 复位值

1:0 PCLK_WDT 看门狗外设时钟选择 00

3:2 PCLK-TIMER0 定时器0外设时钟选择 00

5:4 PLCK-TIMER1 定时器1外设时钟选择 00

7:6 PCLK-UART0 串口0外设时钟选择 00

9:8 PCLK-UART1 串口1外设时钟选择 00

11:10 保留 保留 NA

13:12 PCLK-PWM1 脉宽调制器1外设时钟选择 00

15:14 PCLK-I2C0 I2C0外设时钟选择 00

17:16 PCLK-SPI SPI外设时钟选择 00

19:18 保留 保留 NA

21:20 PCLK-SSP1 SSP1外设时钟选择 00

23:22 PCLK-DAC 数模转换DAC外设时钟选择 00

25:24 PCLK-ADC 模数转换 ADC外设时钟选择 00

27:26 PCLK-CAN1 CAN1外设时钟选择 00

29:28 PCLK-CAN2 CAN2外设时钟选择 00

31:30 PCLK-ACF CAN滤波器外设时钟选择 00

  表5.25 外设时钟选择寄存器1

PCLKSEL0 功能 描述 复位值

1:0 PCLK-QEI 正交编码器接口外设时钟选择 00

3:2PCLK_ 

GPIOINTGPIO中断外设时钟选择 00

Page 102: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 102/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

102

PCLKSEL0 功能 描述 复位值

5:4 PCLK_PCB 管脚连接模块外设时钟选择 00

7:6 PCLK_I2C1 I2C1外设时钟选择 00

9:8 保留 保留 NA

11:10 PCLK_SSP0 SSP0外设时钟选择 00

13:12 PCLK_TIMER2 定时器2外设时钟选择 00

15:14 PCLK_TIMER3 定时器3外设时钟选择 00

17:16 PCLK_UART2 串口2外设时钟选择 00

19:18 PCLK_UART3 串口3外设时钟选择 NA

21:20 PCLK_I2C2 I2C2外设时钟选择 00

23:22 PCLK_I2S I2S外设时钟选择 00

25:24 保留 保留 NA

27:26 PCLK_RIT 重复中断定时器外设时钟选择 00

29:28PCLK_ 

SYSCON系统控制模块外设时钟选择 00

31:30 PCLK_MC 电机控制PWM外设时钟选择 00

  表5.26 外设时钟选择寄存器位置

位 功能描述 复位值

00 PCLK_XXX = CCLK/4 00

01 PCLK_XXX = CCLK 00

10 PCLK_XXX = CCLK/2 00

11 在CAN1、CAN2和CAN滤波器件中,PCLK_XXX = CCLK/6,其余部件中PCLK_XXX

= CCLK/800

5.11 功率控制:低功耗模式

5.11.1 功耗模式

LPC17xx微处理提供了多种电源控制的特性:睡眠模式、深度睡眠模式,掉电模式和深度掉电模

式。CPU时钟频率也可以根据需要改变时钟源、重新配置PLL值或者改变CPU时钟分频值。另外,也

可以通过停止片内外设时钟的方法来关闭不使用的片内外设,以进一步降低系统的功耗。

进入任何一种功耗模式前先要执行Cortex-M3内核的WFI(等待中断Wait for interrupt)指令或者

WFE (等待意外Wait for Exception)指令。Cortex-M3内部支持两种功耗模式:睡眠模式和深度睡眠模

式。这两种模式由Cortex-M3系统控制器的SLEEP DEEP位控制,掉电模式和深度睡眠模式由PCON

寄存器的相应位选择,相同的寄存器中包含有是否进入功耗模式的标志位。

LPC17xx有一个独立的功率控制单元用来给RTC供电,这个特性使得LPC17xx可以将片内其他大

部分设备全部关闭运行。

1.睡眠模式

Page 103: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 103/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

103

提示:LPC17xx睡眠模式对应于LPC2xxx系列的空闲模式( Id le Mode ),由于 ARM对

Cortex-M3内核加入了降低功耗控制的部分所以改变了名称。

当MCU进入睡眠模式时,内核的时钟将会停止工作并且PCON寄存器中的SMFLAG位将置位为

1,从睡眠模式唤醒,仅仅重新使能内核的时钟即可,不需要任何特殊的步骤。

在睡眠模式下,指令的执行被挂起,直到复位或者一个中断的产生,在睡眠模式下,外设功能依然

继续工作也可产生中断使处理器重新执行指令,睡眠模式仅降低了内核本身、存储系统和相关控制器

以及内部总线上的动态功耗。

任何已使能的中断发生都可以将MCU从睡眠模式中唤醒。

2.深度睡眠模式

提示:LPC17xx的深度睡眠模式对应于LPC23xx和LPC24xx系列的睡眠模式。

当芯片进入深度睡眠模式时,主时钟晶振处于掉电状态,相邻的所有时钟停止并且PCON寄存器

的DSFLAG位将置位为1,IRC依旧可以运行并且可以配置为看门狗提供时钟,这就允许利用看门狗唤

醒CPU,此时32kHz的RTC时钟源依旧运行并且RTC中断可以作为MCU的唤醒源。Flash存储器进入

待机状态并且允许快速唤醒,PLL将自动关闭并且断开连接。CCLK和USBCLK时钟分频器自动复位为

0。

深度睡眠模式下将保持处理器的状态和寄存器、外设寄存器以及内部SRAM的值不变,并且芯片

各个I/O口的电平保持静态,深度睡眠模式可以通过复位或者特定的无需时钟源仍能工作的中断唤醒,

并使芯片恢复正常运行。由于深度睡眠模式使芯片所有的动态操作都被挂起,因此深度睡眠模式下的

功耗将会非常低。

在深度睡眠唤醒时,如果 IRC在进入深度睡眠前被使用,则一个2位的 IRC定时器将启动计数,且

执行的代码和外设激活均在超时后(4个时钟周期)后恢复,如果使用系统的外部主时钟晶振,则一个12

位的主时钟定时器启动计数,且执行的代码和外设激活聚在超时后(4096个时钟周期)后恢复。用户需

要谨记的是在唤醒后重新配置需要的PLL和时钟分频值。

通过NMI、外部中断EINT0和EINT3、GPIO中断、以太网WOL中断、掉电检测、RTC报警中断、

看门狗溢出中断、USB输入脚传输数据或者CAN输入脚传输数据的中断均可从深度睡眠模式中唤醒

MCU。

3.掉电模式(Power-down mode)

掉电模式与睡眠模式类似,不同的是掉电模式会将Flash存储器关闭。进入掉电模式后PCON寄存

器的PDFLAG位将被置位为1。掉电模式将大幅度降低功耗,但是在进入该模式前需要等待Flash存储

器完成相应代码和数据的操作。

Page 104: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 104/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

104

进入掉电模式后,IRC、主时钟以及所有的时钟都将停止。如果RTC使能则RTC依旧运行,并且可

以通过RTC中断唤醒CPU,Flash强制进入掉电模式,PLL则自动关闭并断开连接,CCLK和USBCLK

时钟分频器自动复位为0。

在进入掉电模式前,如果IRC被使用则在IRC启动建立时间(IRC-Start-up time)后(大约60uS)一个

2位的 IRC定时器开始计数并且在4个时钟周期后超时。如果代码在SRAM中执行,则在IRC定时器超时

后执行的代码将会被立即恢复。此外,Flash唤醒定时器将为flash启动建立时间(flash start-up time)

计时100uS,超时后Flash可以被访问。用户必须谨记在唤醒后重新根据需要配置PLL和时钟分频值。

如果相关的中断被使能,MCU可以从以下中断中被唤醒:NMI、外部中断EINT0到EINT3、GPIO

中断、以太网WOL中断、掉电检测、RTC报警中断、USB输入管脚传输数据中断和CAN输入引脚传输

数据中断。

4.深度掉电模式

在深度掉电模式下,除了RTC、复位管脚、WIC和RTC备份寄存器外片上所有的设备都将被关闭,

进入深度掉电模式后PCON寄存器的DPDFLAG位将被置位为1。

只有外部复位信号产生或者RTC中断使能且发生RTC中断时,MCU才能够从深度掉电模式下唤

醒。

5.11.2 寄存器描述

外设的功率控制特性允许独立关闭应用中不需要的外设,这样可以进一步降低功耗。功率控制寄

存器功能包含两个寄存器,分别是PCON和PCONP。

1.功率模式控制寄存器Power Mode Control regisger (PCON 0x400F C0C0)

  PCON寄存器各位的功能如表5.27所示。

  表5.27 功率模式控制寄存器

PCON 功能 描述 复位值

0 PM0 功耗模式控制位0 0

1 PM1 功耗模式控制位1 0

2 BODRPM

低电压掉电模式。当该位为1时,在掉电模式或者深度睡眠模式下掉

电检测功能被关闭。当0时,掉电检测功能在掉电模式和深度睡眠模

式下保持激活状态

0

3 BOGD低电压全局无效。为1时,低电压检测功能无效;为0时,点电压检

测功能使能0

4 BORD低电压复位无效。为1时,低电压检测(2.6V)不会导致芯片复位;为

0时,低电压检测(2.9V)使芯片复位0

7:3 保留 保留 NA

8 SMFLAG 睡眠模式标志位。进入睡眠模式后标志位置1,通过软件写入清零 0

9 DSFLAG深度睡眠模式标志位。进入深度睡眠模式后标志位置1,通过软件写

入清零

0

10 PDFLAG 掉电模式标志位。进入掉电模式后标志位置1,通过软件写入清零 0

11 DPDFLAG深度掉电模式标志位。进入深度掉电模式后标志位置1,通过软件写

入清零0

Page 105: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 105/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

105

PCON 功能 描述 复位值

31:12 保留 保留 NA

PM1、PM0 描述

00根据Cortex-M3系统控制寄存器中SLEEPDEEP位,执行WFI或者WFE进入睡眠或者深度睡眠

模式

01 如果Cortex-M3系统控制寄存器中SLEEPDEEP位为1,执行WFI或者WFE进入掉电模式

10 保留

11 如果Cortex-M3系统控制寄存器中SLEEPDEEP位为1,执行WFI或者WFE进入深度掉电模式

2.外设功率控制寄存器Power Control for Peripherals register(PCONP 0x400F

C0C4)

PCONP寄存器允许将所有外设功能关闭以实现节电的目的,通过关断特定外围模块的时钟源来

实现,有少数外设功能不能被关闭,如看门狗、GPIO、引脚连接模块和系统控制模块等。

某些外设,特别是包含模拟功能的外设,它们的操作无须时钟,但会消耗功耗,这些外设包含对应

的禁用控制位,可以通过他们来关闭电路以降低功耗。

PCONP中的每个位都控制一个外设,每个位对应的外设编号见表5.28,当值为1时该外设启动,

当为0时该外设时钟关闭,外设在外设功率控制寄存器中的对应位如表5.28所示。

  表5.28 外设功率控制寄存器

PCONP 功能 描述 复位值

0 保留 保留 NA

1 PCTIM0 定时/计数器0电源/时钟控制位 1

2 PCTIM1 定时/计数器1电源/时钟控制位 1

3 PCUART0 串口0功率时钟控制位 1

4 PCUART1 串口1功率时钟控制位 1

5 保留 保留 NA

6 PWM1 脉宽调制器1功率时钟控制位 1

7 PCI2C0 I2C0接口功率时钟控制位 1

8 PCSPI SPI接口功率时钟控制位 1

9 PCRTC RTC功率时钟控制位 1

10 PCSSP1 SSP1接口功率时钟控制位 1

11 保留 保留 NA

12 PCAD 模数转换器功率时钟控制位 0

13 PCCAN1 CAN控制器1功率时钟控制位 0

14 PCCAN2 CAN控制器2功率时钟控制位 0

15 PCGPIO GPIO 1

16 PCRIT 重复中断定时器功率时钟控制位 0

17 PCMC 电机控制器PWM控制位 0

18 PCQEI 正交编码器接口功率时钟控制位 0

19 PCI2C1 I2C1接口功率时钟控制位 1

Page 106: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 106/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

106

PCONP 功能 描述 复位值

20 保留 保留 NA

21 PCSSP0 SSP0接口功率时钟控制位 1

22 PCTIM2 定时器2功率时钟控制位 0

23 PCTIM3 定时器3功率时钟控制位 0

24 PCUART2 串口2功率时钟控制位 0

25 PCUART3 串口3功率时钟控制位 0

26 PCI2C2 I2C接口2功率时钟控制位 1

27 PCI2S I2S接口功率时钟控制位 0

28 保留 保留 NA

29 PCGPDMA 通用DMA功能功率时钟控制位 0

30 PCENET 以太网功率时钟控制位 0

31 PCUSB USB接口功率时钟控制位 0

5.12 通用输入/输出接口GPIO

5.12.1 LPC17xx GPIO口简介

LPC17xx的GPIO口均为快速I/O口(相对于LPC2000的GPIO口,LPC23xx和LPC24xx也集成有

快速GPIO功能)。GPIO寄存器被设计到外设 AHB总线上,这样可以以最快速度访问GPIO寄存器组,

通过设置屏蔽寄存器,允许对端口引脚成组操作,保留其它引脚状态不变。所有GPIO寄存器可以以

字节、半字和字的方式访问,所有端口值可以在单指令周期内完成操作,GPIO寄存器也可以通过GP

DMA方式访问。复位后所有的 I/O口默认为带有内部上拉的输入引脚。

LPC17xx的端口0和端口2的每根引脚都可以产生中断信号。每个中断信号可编程设置为上升沿

触发、下降沿触发或者脉冲触发,每个使能的中断可作为唤醒信号,用于将MCU从掉电模式中唤醒。

用户软件通过操作GPIO寄存器可以挂起上升沿中断、下降沿中断和GPIO总中断,端口GPIO0和端口

GPIO2与外部中断EINT3在NVIC中共享同一个中断通道。表5.29对GPIO管脚进行了简单的描述。

  表5.29 GPIO管脚描述

管脚名称 类型 描述

P0[31:0]

输入/输出

通用输入/输出口。通常这些管脚会和其他外设功能复用,因此可能在应用

中无法使用。特殊的MCU型号由于封装的不同,使得一些GPIO口不能存

在。

一些IO口可能根据复用外设功能而被削减了一些功能。例如,含有 I2C0功能

的管脚必须是开漏输出的。

P1[31:0]

P2[13:0]

P3[26:25]

P4[29:28]

5.12.2 GPIO寄存器简介为了与LPC23xx系列 ARM7控制器做到兼容的需求,LPC17xx加入了5组32位通用I/O口模组。所

Page 107: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 107/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

107

有的GPIO口都具有增强型GPIO的特性。详细的GPIO寄存器设置用户可参阅LPC17xx的用户手册,此

处仅对GPIO涉及的主要寄存器做简要介绍。

LPC17xx的GPIO寄存器映射表如表5.30所示。

  表5.30 GPIO寄存器映射表(局部总线可访问寄存器,增强的GPIO特性)

通用名称 描述 访问 复位值 PORTn名称和地址

FIODIR快速GPIO方向控制寄存器,该寄存器单独

控制每个I/O口的方向。读/写 0x0

FIO0DIR - 0x2009 C000

FIO1DIR - 0x2009 C020

FIO2DIR - 0x2009 C040

FIO3DIR - 0x2009 C060

FIO4DIR - 0x2009 C080

FIOMASK

快速GPIO屏蔽寄存器。对快速GPIO引脚

的写、置位、清除和读操作,只有在该寄

存器对应位为0时才能有效。

读/写 0x0

FIO0MASK - 0x2009 C010

FIO1MASK - 0x2009 C030

FIO2MASK - 0x2009 C050

FIO3MASK - 0x2009 C070

FIO4MASK - 0x2009 C090

FIOPIN

使用FIOMASK的快速端口引脚值寄存器。

不管引脚方向和模式如何设定,引脚的当前

状态都可从该寄存器中读出。当对该寄存器

执行写操作,并且设置FIOMASK对应位为0

时,可立即改变端口引脚电平。

注意:对于在FIOMASK寄存器中为1的位,

在FIOPIN寄存器中读出值为0,不管对应引脚

的物理状态如何。

读/写 0x0

FIO0PIN - 0x2009 C014

FIO1PIN - 0x2009 C034

FIO2PIN - 0x2009 C054

FIO3PIN - 0x2009 C074

FIO4PIN - 0x2009 C094

FIOSET

使用FIOMASK的快速端口输出置位寄存器。

改寄存器控制输出引脚状态。写1则引脚输出

高电平,写0无效。读操作返回该寄存器当前

端口输出状态,只有在FIOMASK寄存器对应

位为0时才能改变该引脚状态。

读/写 0x0

FIO0SET - 0x2009 C018

FIO1SET - 0x2009 C038

FIO2SET - 0x2009 C058

FIO3SET - 0x2009 C078

FIO4SET - 0x2009 C098

FIOCLR

使用FIOMASK的快速端口清除寄存器。该寄

存器控制输出引脚状态。写1则引脚输出低电

平,写0无效。只有在FIOMASK寄存器对应

位为0时才能改变该引脚状态。

只写 0x0

FIO0CLR - 0x2009 C01C

FIO1CLR - 0x2009 C03C

FIO2CLR - 0x2009 C05C

FIO3CLR - 0x2009 C07C

FIO4CLR - 0x2009 C09C

LPC17xx系列控制器中的GPIO中断寄存器映射如表5.31所示。

  表5.31 GPIO中断寄存器映射表

通用名称 描述 访问 复位值 PORTn名称和地址

IntEnR GPIO上升沿中断使能寄存器 读/写 0x0IO0IntEnR - 0x4002 8090

IO2IntEnR - 0x4002 80B0

IntEnF GPIO下降沿中断使能寄存器 读/写 0x0IO0IntEnR - 0x4002 8094

IO2IntEnR - 0x4002 80B4

IntStatR GPIO上升沿中断状态寄存器 只读 0x0IO0IntStatR - 0x4002 8084

IO2IntStatR- 0x4002 80A4

IntStatF GPIO下降沿中断状态寄存器 只读 0x0IO0IntStatF - 0x4002 8088

IO2IntStatF - 0x4002 80A8

IntClr GPIO中断清除寄存器 只写 0x0IO0IntClr - 0x4002 808C

IO2IntClr - 0x4002 80AC

IntStatus GPIO总中断状态寄存器 只读 0x0 IOIntStatus - 0x4002 8080

5.12.3 使用注意事项

Page 108: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 108/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

108

从端口同时输出0和1状态。

方法1:使用32位(1个字)快速GPIO寄存器,见程序清单5.2

程序清单5.2

  FIO0MASK = 0xFFFF00FF;

FIO0PIN = 0x0000A500; 

方法2:使用16位(1个半字)快速GPIO寄存器,见程序清单5.3

程序清单5.3

  FIO0MASKL = 0x00FF;

FIO0PINL = 0xA500; 

方法3:使用8位(1个字节)快速GPIO寄存器,见程序清单5.4。

程序清单5.4

  FIO0PIN1 = 0xA5; 

5.12.4 应用举例

本例使用端口2的P2.2、P2.3、P2.4和P2.5的四个IO口控制四盏LED 灯,当引脚输出高时电平

点亮LED灯,输出低电平时熄灭LED灯。图5.15示 IO口点亮LED的原理图,IO口通过74LVC244与4个

LED相连。

图5.15 GPIO驱动LED原理图

如程序清单5.5所示,主函数在初始化完系统后,将端口GPIO2的相应口置位输出状态,通过

GPIO2->FIOPIN来改变相应管脚上的输出电平。

程序清单5.5  GPIO驱动LED程序清单

const unsigned long led_mask[] = { 1<<2, 1<<3, 1<<4, 1<<5 }; //定义IO口

Page 109: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 109/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

109

int main (void) {

int num = -1;

int dir = 1;

SystemInit();//系统初始化函数

  SysTick_Config(SystemFrequency/1000 - 1); /* 系统定时器,每1ms产生一次中

断 */

FIO2DIR = 0x0000003C; /* 设置LED占用的IO口状态为输出 */

for (;;) { /* 死循环 */

/* 计算 'num': 0,1,...,LED_NUM-1,LED_NUM-1,...,1,0,0,... */

num += dir;

if (num == LED_NUM) { dir = -1; num = LED_NUM-1; } /* 此处LED_NUM为

4 */

 else if (num < 0) { dir = 1; num = 0; }

FIO2PIN |= led_mask[num]; //点亮相应LED

Delay(500); /* 延时500ms */

FIO2PIN &= ~led_mask[num]; //熄灭相应LED

Delay(500); /* 延时500ms */

}

}

5.13 定时器Timer0/1/2/3

5.13.1 特性

LPC17xx系列微控制器带有4个32位可编程定时/计数器。每个定时/计数器最少有两路捕捉、2路

比较匹配输出电路,定时器2带有4路匹配输出。

LPC17xx芯片的定时具有以下特点:

* 带有可编程32位预分频器的32位定时器/计数器;

Page 110: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 110/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

110

* 支持计数或者定时操作;

* 每个定时器具有2路32位的捕捉通道,当输入信号跳变时可取得定时器的瞬时值,也可以选择

使捕获事件产生中断;

* 4个32位匹配寄存器:

匹配时定时器继续工作,可选择产生中断;

匹配时停止定时器,可选择产生中断;

匹配时复位定时器,可选择产生中断;

* 多达4个对应于匹配寄存器的外部输出,具有以下特性:

匹配时设置为低电平;

匹配时设置为高电平;

匹配时反转;

匹配时无动作;

5.13.2 应用场合

* 作为对内部事件计数的内部计数器;

* 通过捕获输入实现脉冲宽度调制器;

* 作为普通的定时器。

5.13.3 引脚功能描述

定时/计数器相关引脚描述如表5.32所示。

  表5.32 定时/计数器引脚描述

引脚 类型 功能描述

CAP0[1:0]

CAP1[1:0]

CAP2[1:0]

CAP3[1:0]

输入

捕获信号 捕获引脚的跳变可配置为将定时器值装入一个捕获寄存器,并可选择

产生一个中断。可选择多个引脚用做捕获功能,当有多个引脚被选择用做一个

TIMER0/1通道的捕获输入时,使用编号最小的引脚

MAT0[1:0]

MAT1[1:0]

MAT2[3:0]

MAT3[1:0]

输出

外部匹配输出 当匹配寄存器(MR3:0)等于定时器计数器(TC)时,该输出可翻

转,变为低电平、变为高电平或不变。外部匹配寄存器(EMR)控制该输出的功能,

可选择多个引脚并行用作匹配输出功能。

5.13.4 寄存器功能简要描述

本节内容简单介绍定时/计数器涉及的所有寄存器,用户如需详细资料可参考LPC17xx的用户手

册,表5.33所示为定时/计数器所有寄存器,寄存器详细功能描述在本节后面给出。

 

Page 111: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 111/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

111

表5.33 定时/计数器寄存器列表

通用名称 功能描述 访问 复位值 名称和地址

IR

中断寄存器。读IR可识别中断源,向对应位写1

将清除相应中断源。读该寄存器可以识别8个中

断源哪个被挂起。

读/写 0

T0IR - 0x4000 4000

T1IR - 0x4000 8000

T2IR - 0x4009 0000

T3IR - 0x4009 4000

TCR定时器控制寄存器。TC R用于控制定时器功

能,通过该寄存器可以禁用或复位定时器读/写 0

T0TCR - 0x4000 4004

T1TCR - 0x4000 8004

T2TCR - 0x4009 0004

T3TCR - 0x4009 4004

TC定时器计数器。32位TC在每PR+1个PCLK周期

后增加1,该寄存器通过TCR控制读/写 0

T0TC - 0x4000 4008

T1TC - 0x4000 8008

T2TC - 0x4009 0008

T3TC - 0x4009 4008

PR

预分频寄存器。当预分频计数器PC的内容与该

寄存器数值相同时。下个时钟周期TC增加1并

且PC被清零

读/写 0

T0PR - 0x4000 400C

T1PR - 0x4000 800C

T2PR - 0x4009 000C

T3PR - 0x4009 400C

PC

预分频计数器。该寄存器是一个自增计数器,

数值计到与PR内容相同为止。当达到PR的数

值时TC增1并且PC被清除。PC内容可通过总线

接口观察或控制

读/写 0

T0PC - 0x4000 4010

T1PC - 0x4000 8010

T2PC - 0x4009 0010

T3PC - 0x4009 4010

MCR匹配控制寄存器。该寄存器用于控制当匹配时

间发生后是否产生中断或复位TC读/写 0

T0MCR- 0x4000 4014

T1MCR- 0x4000 8014

T2MCR- 0x4009 0014

T3MCR- 0x4009 4014

MR0

匹配寄存器0.该寄存器通过MCR控制。通过设

置在MR0匹配TC时复位TC,或同时停止TC和

PC,并且产生中断

读/写 0

T0MR0 - 0x4000 4018

T1MR0 - 0x4000 8018

T2MR0- 0x4009 0018

T3MR0 - 0x4009 4018

MR1 匹配寄存器1。功能同MR0 读/写 0

T0MR1- 0x4000 401C

T1MR1- 0x4000 801C

T2MR1- 0x4009 001C

T3MR1- 0x4009 401C

MR2 匹配寄存器2。功能同MR0 读/写 0

T0MR2- 0x4000 4020

T1MR2 - 0x4000 8020

T2MR2 - 0x4009 0020

T3MR2 - 0x4009 4020

MR3 匹配寄存器3。功能同MR0 读/写 0

T0MR3- 0x4000 4024

T1MR3 - 0x4000 8024

T2MR3 - 0x4009 0024

T3MR3 - 0x4009 4024

CCR

捕获控制寄存器。该寄存器控制用于装载捕获寄存

器CRx的捕获输入边沿以及在发生捕获时是否产生

中断

读/写 0

T0CCR- 0x4000 4028

T1CCR- 0x4000 8028

T2CCR- 0x4009 0028

T3CCR- 0x4009 4028

CR0捕获寄存器0。当CAPn.0上有事件发生时CR0与

TC的值一起被加载。只读 0

T0CR0- 0x4000 402C

T1CR0- 0x4000 802C

T2CR0- 0x4009 002C

T3CR0- 0x4009 402C

CR1 捕获寄存器1。功能同CR0 只读 0

T0CR1 - 0x4000 4030

T1CR1 - 0x4000 8030

T2CR1 - 0x4009 0030

T3CR1 - 0x4009 4030

EMR外 部 匹 配 寄 存 器 。 E M R 控 制 外 部 匹 配 引脚M A T n . 0 ~ M A T n . 3 ( M A T 0 . 0 ~ M A T 0 . 3和

MAT1.0~MAT1.3)

读/写 0

T0EMR-0x4000 403C

T1EMR- 0x4000 803C

T2EMR-0x4009 003C

T3EMR-0x4009 403C

Page 112: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 112/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

112

通用名称 功能描述 访问 复位值 名称和地址

CTCR计数器控制寄存器。选择定时器或计数器模式,计

数器模式下选择计数的引脚和边沿。读/写 0

T0CTCR-0x40004070

T1CTCR-0x40008070

T2CTCR-0x40090070

T3CTCR-0x40094070

5.13.5 应用举例--产生中断的定时器

在实际应用中,一般要求处理器间隔固定时间做相应处理,如定时读取外部数据或刷新数码管显

示等,这时使用定时器中断功能就非常有必要,而且在这种方式下,定时器与处理器可以并行工作,等

到定时器完成,通过中断打断处理器转而执行中断服务程序,这样的定时器方式可以提高处理器的使

用效率。

程序首先要初始化使用的定时器,init_timer ()函数执行的内容包括设置定时器的匹配寄存器MR

和匹配控制寄存器MCR,还有安装定时器中断服务函数等。该函数有两个参数:timer_num为初始化

定时器序号,TimerInterval为时钟周期个数,即定时器中断间隔,具体代码如程序清单5.6所示。

程序清单5.6

DWORD init_timer ( BYTE timer_num, DWORD TimerInterval )

{

NVIC_InitTypeDef NVIC_InitStructure;

if ( timer_num == 0 )

{

timer0_counter = 0;

T0MR0 = TimerInterval;/* 设置计时初值 */

  T0MCR = 3;/* 计数器的值与MR值匹配时的动作:发生中断、TC复位 */

  NVIC_InitStructure.NVIC_IRQChannel = TIMER0_IRQChannel;/* NVIC设置 */

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

return (TRUE);

}

......

return (FALSE);

Page 113: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 113/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

113

}

随后,程序使能计数器。这时定时器开始计数,直到TC与MR匹配产生中断,同时复位TC开始下

一轮计数。定时器使能函数如程序清单5.7所示,定时器中断服务函数如程序清单5.8所示。

程序清单5.7 定时器使能函数

void enable_timer( BYTE timer_num )

{

if ( timer_num == 0 )

{

T0TCR = 1;/* 计数器使能 */

}

else

{

T1TCR = 1;/* 计数器使能 */

}

return;

}

程序清单5.8 定时器中断服务函数

void TIMER0_IRQHandler (void) __irq

{

T0IR = 1; /* 清除中断标志位 */

  timer0_counter++; /* 进行中断处理 */

}

5.14 系统节拍定时器System Tick Timer 

Cortex-M3内核集成了一个系统节拍定时器。它可以被操作系统或者系统管理软件用来每隔固定

的10ms产生一次中断。具体可以参考《Cortex-M3 Technical Reference Manual》。

5.14.1 特性

LPC17xx微控制器集成有系统节拍定时器,它可以以10ms为间隔定时,此时钟可以由内部CPU时

钟源提供,也可以由一个时钟输入引脚(STCLK)提供。

Page 114: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 114/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

114

5.14.2 操作方法

系统节拍定时器是一个24位定时器,其向下计数直到减到0并产生中断,系统节拍定时器是为了

在中断之间产生固定的10ms定时,STCLK功能与P3.26上其他功能复用。为了在一定时间间隔内发生

多次中断,STRELOAD寄存器必须以正确的值初始化,STCALIB寄存器中提供了默认值,当然这个值

也可以被软件修改,默认值为CPU时钟为100MHz时10ms中断间隔时间,系统节拍定时器的结构框图

如图5.16所示。

图5.16 系统节拍定时器结构框图

5.14.3 系统节拍定时器寄存器描述

本节简要描述系统节拍定时器寄存器的情况,用户可参阅LPC17xx的用户手册获得更加详细的信

息。表5.34所示为系统节拍定时器涉及的所有寄存器。

  表5.34 系统节拍定时器寄存器

名称 描述 访问 复位值 地址

STCTRL 系统定时器控制和状态寄存器 读/写 0x4 0xE000 E010

STRELOAD 系统定时器重新加载数据寄存器 读/写 0 0xE000 E014

STCURR 系统定时器当前数据寄存器 读/写 0 0xE000 E018

STCALIB 系统定时器计算数据寄存器 读/写 0x000F 423F 0xE000 E01C

5.14.4 程序举例

程序清单5.9为系统节拍定时器初始化相关软件操作;程序清单5.10为系统节拍定时器中断处理

函数;程序清单5.11为利用系统节拍定时器产生延时的应用函数。

程序清单5.9

DWORD SysTick_Config(DWORD ticks)

{

if (ticks > SYSTICK_MAXCOUNT) return (1);

Page 115: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 115/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

115

  NVIC_ST_RELOAD = (ticks & SYSTICK_MAXCOUNT) - 1;

NVIC_SYS_H_PRI15 = 0x48;

NVIC_ST_CURRENT = 0x00;

NVI C_ST_CTRL = (1< < SYST I CK_CLKSOURCE) | (1< < SYST I CK_ENABLE) |

(1<<SYSTICK_TICKINT);

return 0;

}

程序清单5.10 系统节拍定时器中断处理函数

void SysTick_Handler(void)

{

TimeTick++;

}

程序清单5.11 系统节拍定时器产生延时函数

void Delay (DWORD tick) {

DWORD systickcnt;

systickcnt = TimeTick;

while ((TimeTick - systickcnt) < tick);

}

5.15 看门狗(Watch dog)

5.15.1 功能描述

使用看门狗(Watch Dog, WD)是指在系统进入错误状态后,为了防止系统死机,在一段合理时间

内复位系统。看门狗包括一个4分频的预分频器和一个32位计数器,时钟通过预分频器输入定时器,

定时器进行递减计数,定时器递减的最小值为0xFF,如果设置一个小于0xFF的值,系统会将0xFF装

入计数器,因此最小看门狗间隔时间为WDCLK×256×4,最大时间间隔为WDCLK×232×4,两者都是

WDCLK×4的倍数。

看门狗应该按照以下顺序使用:设置WDTC寄存器设定看门狗重装常数;通过WDMOD寄存器设

定工作模式;通过向WDFEED寄存器先写0xAA后写0x55序列使能看门狗;看门狗应该在计数器下溢

出前重新装入常数,避免复位或中断发生。

看门狗时钟WDCLK可以选择RTC时钟、内部RC晶振或者 APB总线设备时钟PCLK。

Page 116: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 116/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

116

5.15.2 看门狗结构描述

看门狗的逻辑结构框图如图5.17所示。

 

图5.17 看门狗逻辑结构框图

5.15.3 看门狗寄存器描述

本节简单介绍看门狗相关寄存器的内容,用户可以通过LPC17xx的用户手册深入了解LPC17xx的

看门狗的寄存器情况。表5.35所示为看门狗寄存器列表。

表5.35 看门狗寄存器列表

名称 描述 访问 复位值 地址WDMOD

看门狗模式寄存器。该寄存器包含看门狗定时的基本模式和

状态读/写 0 0xE000 0000

WDTC 看门狗定时器常数寄存器。该寄存器决定超时值。 读/写 0xFF 0xE000 0004

WDFEED看门狗喂狗寄存器。向该寄存器顺序写入0xAA和0x55使看

门狗定时器重新装入预设值。只写 NA 0xE000 0008

WDTV看门狗定时器值寄存器。从该寄存器读出看门狗定时器的当

前值。只读 0xFF 0xE000 000C

WDCLKSEL 看门狗时钟源选择寄存器 读/写 0 0xE000 0010

5.15.4 应用举例

程序清单 5.12是一 个使用看 门狗产生普 通中断的例子,产生系统 复位中断只需要 再多设置

WDRESET位即可。函数首先要安装看门狗中断服务函数,然后设置WDCLKSEL寄存器,选择内部RC

晶振为时钟源,由于内部RC晶振为4MHz,因此设置WDTC的值为4M-1。而看门狗时钟电路把时钟源

4分频,这样看门狗超时时间设置为4 秒,接着再设置WDMOD寄存器的WDEN位,最后完成一个喂狗

序列,使能看门狗定时器。

程序清单5.12 看门狗初始化函数

DWORD WDTInit( void )

Page 117: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 117/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

117

{

NVIC_InitTypeDef NVIC_InitStructure;

wdt_counter = 0;

NVIC_InitStructure.NVIC_IRQChannel = WDT_IRQChannel;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

WDCLKSEL = 0; /* 选择内部RC晶振为时钟源 */ 

  WDTC = WDT_FEED_VALUE;/* 一旦WDEN设置,看门狗在喂狗后将会启动 */

WDMOD = WDEN;

WDFEED = 0xAA; /* 按顺序喂狗 */

WDFEED = 0x55;

return( TRUE );

}

5.16 实时时钟

5.16.1 功能描述

实时时钟(Real Time Clock, RTC)提供一套计数器,可以在系统上电和关闭操作时对时间进行测

量,RTC在低功耗模式下功耗非常低。LPC17xx处理器的RTC时钟可以由独立的32.768kHz振荡器产

生1Hz的内部时间参考,RTC具有专用的电源引脚VBAT,可连接到电池或其他器件使用的相同的3.3V

电压上。

LPC17xx的实时时钟RTC具有如下特点:

* 测量保持日历或时钟的时间通路;

* 超低功耗设计,支持电池供电系统;

* 20字节的电池备份存储空间可供CPU无电源供给时由RTC操作;

* 专用32kHz超低功耗时钟源;

* 专用电池供电管脚;

* RTC供电部分独立于芯片上其他部分。

Page 118: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 118/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

118

5.16.2 实时时钟的结构

RTC的功能接口框图如图5.18所示。

图5.18 RTC的功能结构框图

5.16.3 寄存器功能描述

本节简单介绍RTC部分的寄存器功能,用户可参阅LPC17xx的用户手册获取更详细的信息。RTC

包含了许多寄存器,具体如表5.36所示。

  表5.36 RTC寄存器列表

组别 名称 寄存器位数 描述 访问 复位值 地址

混合寄存

器组

ILR 2 中断位置寄存器 读/写 0 0x4002 4000

CCR 3 时钟控制寄存器 读/写 NC 0x4002 4008

CIIR 8 计数器增量中断寄存器 读/写 0 0x4002 400C

 AMR 8 报警屏蔽寄存器 读/写 0 0x4002 4010

RTC_AUX 1 RTC辅助控制寄存器 读/写 0x8 0x4002 405C

RTC-AUXEN 1 RTC辅助使能寄存器 读/写 0 0x4002 4058

完整时间

寄存器组

CTIME0 32 完整时间寄存器0 只读 NC 0x4002 4014

CTIME1 32 完整时间寄存器1 只读 NC 0x4002 4018

CTIME2 32 完整时间寄存器2 只读 NC 0x4002 401C

时钟计数

寄存器组

SEC 6 秒寄存器 读/写 NC 0x4002 4020

MIN 6 分寄存器 读/写 NC 0x4002 4024

HOUR 5 小时寄存器 读/写 NC 0x4002 4028

DOM 5 日期(月)寄存器 读/写 NC 0x4002 402C

DOW 3 星期寄存器 读/写 NC 0x4002 4030

DOY 9 日期(年)寄存器 读/写 NC 0x4002 4034

MONTH 4 月寄存器 读/写 NC 0x4002 4038

YEAR 12 年寄存器 读/写 NC 0x4002 403C

CALIBRATION 18 计算值寄存器 读/写 NC 0x4002 4040

Page 119: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 119/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

119

组别 名称 寄存器位数 描述 访问 复位值 地址

通用寄存

器组

GPREG0 32 通用寄存器0 读/写 NC 0x4002 4044

GPREG1 32 通用寄存器1 读/写 NC 0x4002 4048

GPREG2 32 通用寄存器2 读/写 NC 0x4002 404C

GPREG3 32 通用寄存器3 读/写 NC 0x4002 4050

GPREG4 32 通用寄存器4 读/写 NC 0x4002 4054

报警寄存

器组

 ALSEC 6 秒报警值 读/写 NC 0x4002 4060

 ALMIN 6 分报警值 读/写 NC 0x4002 4064

 ALHOUR 5 小时报警值 读/写 NC 0x4002 4068

 ALDOM 5 日期(月)报警值 读/写 NC 0x4002 406C

 ALDOW 3 星期报警值 读/写 NC 0x4002 4070

 ALDOY 9 日期(年)报警值 读/写 NC 0x4002 4074

 ALMON 4 月报警值 读/写 NC 0x4002 4078

 ALYEAR 12 年报警值 读/写 NC 0x4002 407C

5.16.4 使用注意事项

如果使用RTC,VBAT必须连接到一个独立的电源(通常是外部的电池)或者悬空。在VDD(3V3)供

电的情况下,RTC区域可以由芯片内部电源供电,甚至VBAT不需连接外部电源。如果VDD(3V3)或者

VBAT的电源不符合要求,RTC丢失自己的时间数据和备份寄存器中的数据,如果时钟源丢失,中断或

者改变,那么RTC也无法维持时间计数。

5.16.5 应用举例

本例只适用了RTC的基本计时功能。程序通过设置基本年、月、日和时间后,每间隔1秒读取RTC

的实施时间和日期,并通过串口打印。在此只给出对RTC操作的几个函数的代码。

RTCInit()函数只初始化RTC的时钟频率,没有使能任 何报警中断,具体代码如程序清单 5.13所

示。

程序清单5.13 RTC初始化函数

void RTCInit( void )

{

alarm_on = 0;

/* 初始化RTC寄存器 */ 

 AMR = 0; /* 报警屏蔽 */

  CIIR = 0; /* 不产生中断 */

  CCR = 0; /* 使能复位 */

  return;

}

Page 120: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 120/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

120

RTCSetTime()函数用于设置RTC的日期和时间,主要对RTC模块的时间按计数器进行设置。该

函数参数为一个时间结构体RTCTime。结构体及函数定义见程序清单5.14和程序清单5.15。

程序清单5.14 RTCTimer 结构

typedef struct {

DWORD RTC_Sec; /* Second value - [0,59] */

DWORD RTC_Min; /* Minute value - [0,59] */

DWORD RTC_Hour; /* Hour value - [0,23] */

DWORD RTC_Mday; /* Day of the month value - [1,31] */

DWORD RTC_Mon; /* Month value - [1,12] */

DWORD RTC_Year; /* Year value - [0,4095] */

DWORD RTC_Wday; /* Day of week value - [0,6] */

DWORD RTC_Yday; /* Day of year value - [1,365] */

} RTCTime;

程序清单5.15 RTC时间设置函数RTCSetTime()

void RTCSetTime( RTCTime Time )

{

SEC = Time.RTC_Sec;

MIN = Time.RTC_Min;

HOUR = Time.RTC_Hour;

DOM = Time.RTC_Mday;

  DOW = Time.RTC_Wday;

DOY = Time.RTC_Yday;

MONTH = Time.RTC_Mon;

YEAR = Time.RTC_Year;

return;

}

在设置完时间和日期后,调用RTCStart()函数开始RTC计时,具体代码见程序清单5.16。

程序清单5.16 RTC启动函数

void RTCStart( void )

{

Page 121: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 121/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

121

/* 启动RTC计数器 */

CCR |= CCR_CLKEN;

ILR = ILR_RTCCIF;

return;

}

RTCGetTime()函数读取RTC的时间计数器寄存器的内容,并返回一个时间给结构体RTCTime,

具体见代码清单5.17。

程序清单5.17

RTCTime RTCGetTime( void )

{

RTCTime LocalTime;

LocalTime.RTC_Sec = SEC;

LocalTime.RTC_Min = MIN;

LocalTime.RTC_Hour = HOUR;

LocalTime.RTC_Mday = DOM;

LocalTime.RTC_Wday = DOW;

LocalTime.RTC_Yday = DOY;

LocalTime.RTC_Mon = MONTH;

LocalTime.RTC_Year = YEAR;

return ( LocalTime );

}

5.17 UART串口通信 

5.17.1 概述

LPC17xx处理器具有4个符合16C550工业标准的异步串口(UART )UART0、UART1、UART2和

UART3,其中UART1具有标准的MODEM接口和具有RS-485 / EIA-485模式,但是UART1不支持 IrDA

功能。UART1的485模式以及MODEM功能请参阅LPC17xx的用户手册。

LPC17xx处理器的4个串口具有以下特性

* 每个UART具有独立的16字节收发FIFO;* 寄存器位置符合16C550工业标准;

Page 122: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 122/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

122

* 接收器FIFO触发点可为1、4、8和14字节;

* 内置波特率发生器;

* 包含实现软件流控制的机制;

* UART3包含了一个支持红外通信的IrDA模式。

5.17.2 寄存器功能描述

每个UART包含的寄存器如表5.37所示,分频器锁存访问位(DLAB)包含在UnLCR7中,用于使能

访问分频锁存。

  表5.37 UART寄存器列表

名称 描述 访问 复位值 地址

RBR

(DLAB=0) 接收缓冲寄存器。包含即将读取的接收数据。 只读 NA

U0RBR - 0x4000 C000

U2RBR - 0x4009 8000U3RBR - 0x4009 C000

THR

(DLAB=0)发送保持寄存器。写入发送的数据。 只写 NA

U0THR - 0x4000 C000

U2THR - 0x4009 8000

U3THR - 0x4009 C000

DLL

(DLAB=1)分频锁存低位。 读/写 0x01

U0DLL - 0x4000 C000

U2DLL - 0x4009 8000

U3DLL - 0x4009 C000

DLM

(DLAB=0)分频锁存高位。 读/写 0x00

U0DLM - 0x4000 C004

U2DLM - 0x4009 8004

U3DLM - 0x4009 C004

IER

(DLAB=0)中断使能寄存器 读/写 0x00

U0IER - 0x4000 C004

U2IER - 0x4009 8004

U3IER - 0x4009 C004

IIR 中断标志寄存器 只读 0x01

U0IIR - 0x4000 C008

U2IIR - 0x4009 8008

U3IIR - 0x4009 C008

FCR FIFO控制寄存器 只写 0x00

U0FCR - 0x4000 C008

U2FCR - 0x4009 8008

U3FCR - 0x4009 C008

LCR 线控制寄存器 读/写 0x00

U0LCR - 0x4000 C00C

U2LCR - 0x4009 800C

U3LCR - 0x4009 C00C

LSR 线状态寄存器 只读 0x60

U0LSR - 0x4000 C014

U2LSR - 0x4009 8014

U3LSR - 0x4009 C014

SCR 缓存寄存器 读/写 0x00

U0SCR - 0x4000 C01C

U2SCR - 0x4009 801C

U3SCR - 0x4009 C01C

 ACR 自动波特率控制寄存器 读/写 0x00

U0ACR - 0x4000 C020

U2ACR - 0x4009 8020

U3ACR - 0x4009 C020

ICR IrDA控制寄存器 读/写 0U3ICR - 0x4009 C024

(UART3 only)

FDR 小数分频寄存器 读/写 0x10

U0FDR - 0x4000 C028

U2FDR - 0x4009 8028

U3FDR - 0x4009 C028

TER 传输使能寄存器 读/写 0x80

U0TER - 0x4000 C030

U2TER - 0x4009 8030

U3TER - 0x4009 C030

FIFOLVL FIFO等级寄存器 只读 0x00

U0FIFOLVL - 0x4000 C058

U2FIFOLVL - 0x4009 8058

U3FIFOLVL - 0x4009 C058

Page 123: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 123/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

123

5.17.3 硬件设计

图5.19所示为LPC17xx的串口电路。

图5.19 串口电路原理图

5.17.4 应用举例

查询方式

本例使用查询方式对UART0进行数据 传输,所以在初始化UART0时不需要使能任何中断位。

UART0初始化函数如程序清单5.18所示。

程序清单5.18 串口UART0初始化函数

DWORD UART0Init(DWORD baudrate)

{

DWORD Fdiv;

  PINSEL0 |= 0x00000050; /* 设置IO管脚为RxD0 和TxD0 */

U0LCR = 0x83; /* 设置数据格式为8位,无校验位,1位停止位 */

Fdiv = ( Fpclk / 16 ) / baudrate ; /* 计算波特率 */

U0DLM = Fdiv / 256;

U0DLL = Fdiv % 256;

U0LCR = 0x03; /* DLAB = 0,禁止访问DL寄存器 */

U0FCR = 0x07; /* 使能并复位发送和接收FIFO. */

return (TRUE);

}

当使用查询方式进行串口数据传输时,用户程序主要读取U0LSR线状态寄存器,通过读出的对应

位是否置位来判断操作是否完成,如程序清单5.19和程序清单5.20所示。

程序清单5.19

Page 124: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 124/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

124

void UART0SendByte(BYTE *BufferPtr)

{

U0THR = *BufferPtr;

While((U0LSR & 0x40) == 0); /* 检测THR是否为空,数据发送是否完毕 */

}

程序清单5.20

void UART0RecieveByte(BYTE *BufferPtr)

{

While((U0LSR & 0x01) == 0); /* 等待接受数据到达RBR */

*BufferPtr = U0RBR;

return;

}

中断方式

用中断方式使用串口更符合实际应用要求。当串口有接收、发送操作完成或者操作错误时产生中

断,CPU被中断后中断服务程序根据UnIIR中断标志寄存器的标志位来判断发生中断的类型,从而执

行相应的处理。我们只给出UART0初始化函数和中断服务程序,见程序清单5.21和程序清单5.22。在初始化函数中必须使能中断和挂载中断服务函数。其他串口操作函数与查询方式下的一样。

程序清单5.21

DWORD UART0Init( DWORD baudrate)

{

DWORD Fdiv;

NVIC_InitTypeDef NVIC_InitStructure;

PINSEL0 |= 0x00000050; /* 设置IO管脚为RxD0 和TxD0 *

U0LCR = 0x83; /* 设置数据格式为8位,无校验位,1位停止位 */

Fdiv = ( Fpclk / 16 ) / baudrate ; /* 计算波特率 */

U0DLM = Fdiv / 256;

U0DLL = Fdiv % 256;

U0LCR = 0x03; /* DLAB = 0,禁止访问DL寄存器 */

U0FCR = 0x07; /* 使能并复位发送和接收FIFO. */

/* 初始化中断控制器NVIC使能UART0 中断 */

Page 125: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 125/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

125

NVIC_InitStructure.NVIC_IRQChannel = UART0_IRQChannel;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

U0IER = IER_RBR | IER_THRE | IER_RLS; /*使能UART0的相关中断方式 */

return (TRUE);

}

程序清单5.22

void UART0_IRQHandler(void)

{

BYTE IIRValue, LSRValue;

BYTE Dummy = Dummy;

IIRValue = U0IIR;

IIRValue >>= 1;/* 跳过 IIR中的中断挂起位 */

IIRValue &= 0x07;/* 与上0x07得到中断标志位 */

if (IIRValue == IIR_RLS)/* 判断是否为一个线状态中断 */

{

LSRValue = U0LSR;/* 读出线状态寄存器的内容,判断具体状态 */

  if (LSRValue & (LSR_OE | LSR_PE | LSR_FE | LSR_RXFE | LSR_BI))

{

UART0Status = LSRValue;/* 读取LSR将清除该中断 */

Dummy = U0RBR;/* 读取一个无效数据,清除中断 */

return;

}

if (LSRValue & LSR_RDR) /* LSR的数据就绪标志 */

{

UART0Buffer[UART0Count] = U0RBR;/* 读取一个有效数据到接收缓冲区 */

UART0Count++;

if (UART0Count == BUFSIZE)

{

Page 126: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 126/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

126

UART0Count = 0; /* 缓冲区溢出复位 */

}

}

}

else if (IIRValue == IIR_RDA) /* 接收数据有效中断标志位 */

{

UART0Buffer[UART0Count] = U0RBR;/* 读取一个有效数据到接收缓冲区 */

UART0Count++;

if (UART0Count == BUFSIZE)

{

UART0Count = 0; /* 缓冲区溢出复位 */

}

}

else if (IIRValue == IIR_CTI) /* 字符超时指示中断标志位 */

{

UART0Status |= 0x100;

}

else if (IIRValue == IIR_THRE) /* 发送保持寄存器空中断标志位 */

{

  LSRValue = U0LSR;/* 读取U0LSR判断,THRE位是否为1 */

if (LSRValue & LSR_THRE)

{

UART0TxEmpty = 1;

}

else

{

UART0TxEmpty = 0;

}

}

}

Page 127: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 127/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

127

5.18 I2C接口

5.18.1 I2C总线简介

I2

C(Inter-Intergrated Circuit )总线是一种由飞利浦(Philips)公司开发的两线制串行总线,通过

SDA(串行数据线)和SCL(串行时钟线)两根线在连到总线上的器件之间传送数据,并根据地址识别每

个器件,用于连接微控制器及其外围设备。I2C总线支持任何一种IC制造工艺,并且恩智浦和其他厂商

提供了种类丰富的I2C兼容芯片。

每个 I2C总线器件都有唯一的地址,是一个一主多从式总线。I

2C总线上器件的角色有两类:主机

(Master )和从机(Slave)。主机负责启动总线,产生时钟,开放传送器件,此时任何被寻址的器件均被认

为是从机,且I2C总线的控制完全由挂接在总线上的主机送出的地址和数据决定。总线上主机和从机

角色的分配不是一成不变的,根据器件的功能可以通过软件程序使其工作于主机、从机或者是主/从机

角色。

5.18.2 I2C接口寄存器简述

LPC17xx系列微处理的每一个I2C接口都包含7个寄存器,如表5.38所示。

  表5.38 I2C接口寄存器总表

名称 描述 访问 复位值 寄存器名称和地址

I2CONSET

I2C控制置位寄存器。将1写入该寄存器的某

个位时,I2C控制寄存器的相应位会被置位。

写入0对I2C控制寄存器的相应位没有影响

读/写 0x00

I2C0CONSET 0x4001 C000

I2C1CONSET 0x4005 C000

I2C2CONSET 0400A 0000

I2CSTAT

I2C状态寄存器。在I

2C操作期间,该寄存器提

供详细的状态代码,允许软件决定下一步所

需的操作

只读 0xF8

I2C0STAT 0x4001 C004

I2C1STAT 0x4005 C004

I2C2STAT 0x400A 0004

I2DAT

I2C数据寄存器。在主机发送或从机发送模式

下,要发送的数据写入寄存器。在主机接受

或从机接受模式下,接收到的数据可以从该

寄存器中读取。

读/写 0x00

I2C0DAT 0x4001 C008

I2C1DAT 0x4005 C008

I2C2DAT 0x400A 0008

I2ADR0

I2C从机地址寄存器0。包含从机模式下I

2C接

口操作的7位从机地址,在主机模式下并没有

用。最低位决定从机是否响应通用呼叫地址

读/写 0x00

I2C0ADR0 0x4001 C00C

I2C1ADR0 0x4005 C00C

I2C2ADR0 0x400A 000C

I2SCLHSCH占空比寄存器低电平计数值。决定 I2C时

钟的高电平时间。读/写 0x04

I2C0SCLH 0x400 C010

I2C1SCLH 0x4005 C010

I2C2SCLH 0x400A 0010

I2SCLL

SCH占空比寄存器高低平计数值。决定 I2C时

钟的低电平时间。I2nSCLL和I2CnSCLH一起决

定由I2C产生的时钟频率,以及从机模式下使

用的某些事件

读/写 0x04

I2C0SCLL 0x400 C014

I2C1SCLL 0x4005 C014

I2C2SCLL 0x400A 0014

I2CONCLR

I2C控制清除寄存器。将1写入该寄存器的某

个位时,I2C控制寄存器的相应位会被复位。

写入0对I2C控制寄存器的相应位没有影响。

只写 NA

I2C0CONCLR 0x400 C018

I2C1CONCLR 0x4005 C018

I2C2CONCLR 0x400A 0018

MMCTRL 监控模式控制寄存器 读/写 0x00

I2C0MMCTRL 0x400 C01C

I2C1MMCTRL 0x4005 C01C

I2C2MMCTRL 0x400A 001C

Page 128: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 128/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

128

名称 描述 访问 复位值 寄存器名称和地址

I2ADR1

I2C从机地址寄存器1。包含从机模式下I

2C接

口操作的7位从机地址,在主机模式下并没有

用。最低位决定从机是否响应通用呼叫地址

读/写 0x00

I2C0ADR1 0x4001 C020

I2C1ADR1 0x4005 C020

I2C2ADR1 0x400A 0020

I2ADR2

I2C从机地址寄存器2。包含从机模式下I

2C接

口操作的7位从机地址,在主机模式下并没有

用。最低位决定从机是否响应通用呼叫地址

读/写 0x00

I2C0ADR2 0x4001 C024

I2C1ADR2 0x4005 C024

I2C2ADR2 0x400A 0024

I2ADR3

I2C从机地址寄存器3。包含从机模式下I

2C接

口操作的7位从机地址,在主机模式下并没有

用。最低位决定从机是否响应通用呼叫地址

读/写 0x00

I2C0ADR3 0x4001 C028

I2C1ADR3 0x4005 C028

I2C2ADR3 0x400A 0028

I 2 D A T A _  

BUFFER数据缓冲寄存器。 只读 0x00

I2C0DATA_BUFFER 0x4001

C02C

I2C1DATA_BUFFER 0x4005

C02C

I2C2DATA_BUFFER 0x400A

002C

I2MASK0 I2C从机地址屏蔽寄存器0 读/写 0x00

I2C0MASK0 0x4001 C030

I2C1MASK0 0x4005 C030

I2C2MASK0 0x400A 0030

I2MASK1 I2C从机地址屏蔽寄存器1 读/写 0x00

I2C0MASK1 0x4001 C034

I2C1MASK1 0x4005 C034

I2C2MASK1 0x400A 0034

I2MASK2 I2C从机地址屏蔽寄存器2 读/写 0x00

I2C0MASK2 0x4001 C038

I2C1MASK2 0x4005 C038

I2C2MASK2 0x400A 0038

I2MASK3 I2C从机地址屏蔽寄存器3 读/写 0x00

I2C0MASK3 0x4001 C03C

I2C1MASK3 0x4005 C03C

I2C2MASK3 0x400A 003C

5.18.3 应用举例

本节以 I2C接口查询方式读取温度传感器LM75为例,介绍I

2C接口的编程方法。本例将 I

2C接口设

置成主机模式。

1.电路原理图

LPC17xx与LM75连接方式如图5.20所示。

图5.20 I2C连接LM75电路原理图

2.头文件中相关定义

Page 129: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 129/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

129

程序清单5.23 头文件定义

/* I2C控制器设置寄存器I

2CONSET的各位定义 */

#define I2CONSET_I2EN 0x00000040

#define I2CONSET_A A 0x00000004

#define I2CONSET_SI 0x00000008

#define I2CONSET_STO 0x00000010

#define I2CONSET_STA 0x00000020

/* I2C控制器清除寄存器I2CCONCLR的各位定义 */

#define I2CONCLR_AAC 0x00000004

#define I2CONCLR_SIC 0x00000008

#define I2CONCLR_STAC 0x00000020

#define I2CONCLR_I2ENC 0x00000040

/* I2C控制器其他设置定义 */

#define I2DAT_I2C 0x00000000 /* I2C 数据地址寄存器 */

#define I2ADR_I2C 0x00000000 /* I2C 从机地址寄存器 */

#define I2SCLH_SCLH 0x00000080 /* I2C SCL 占空比高电平寄存器 */

#define I2SCLL_SCLL 0x00000080 /* I2C SCL 占空比低电平寄存器 */

3.I2C接口初始化函数

I2CInit()函数初始化处理器I

2C模块,包括选择处理器引脚功能,设置I

2C总线工作频率,设置处

理器为I2C总线主设备,并使能I

2C总线模块。具体代码程序清单5.24所示。

程序清单5.24

void I2CInit(void)

{

long fi2c = 400000;

PINSEL0 |= 0x00A00000; //选择SDA0,SCL0管脚功能

 

I2C2SCLH = (Fpclk/fi2c + 1) / 2; //设置时钟频率

I2C2SCLL = (Fpclk/f i2c) / 2;

I2C2CONCLR = (I2CONCLR_STAC|I2CONCLR_SIC|I2CONCLR_AAC);

I2C2CONSET = I2CONSET_I2EN; //使能I2C主机模式

Page 130: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 130/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

130

//setup interrupt...

}

4. I2C接口读LM75函数

I2CReadLM75Byte()函数实现从器件LM75的温度数据读出。具体代码见程序清单5.25。

程序清单5.25

DWORD I2CReadLM75Byte( void)

{

DWORD data;

DWORD data1,data2;

data = 0;

I2C2CONCLR = (I2CONCLR_STAC|I2CONCLR_SIC|I2CONCLR_AAC);

I2C2CONSET = I2CONSET_I2EN;//使能I2C作为主机

I2C2CONSET = I2CONSET_STA;//发送一个起始状态位

I2C2CONSET = I2CONSET_STA;//test restart!!

while(I2C2STAT != 0x8);//起始字必 须为0x8

I2C2DAT = 0x91;//设置 SLA+W

I2C2CONCLR = 0x8|0x20;//清零SI位,以传输SLA+W

while(I2C2STAT != 0x40);//起始字0x40

I2C2CONCLR = I2CONCLR_SIC;//清零SI位,以读取EEPROM

  while(I2C2STAT != 0x58);//接受数据,无 ACK

data1 = I2C2DAT;//读数据

while(I2C2STAT != 0x58);//起始字0x40

I2C2CONCLR = I2CONCLR_SIC;//清零SI位,以读取EEPROM

while(I2C2STAT != 0x58);//接受数据,无 ACK

data2 = I2C2DAT;//读数据 

I2C2CONCLR = (I2CONCLR_SIC|I2CONCLR_AAC);

I2C2CONSET = I2CONSET_STO;//设置ST0位为1,以停止传输

data = data1 << 8 | data2;

return data;

}

Page 131: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 131/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

131

5.19 SPI接口

5.19.1 接口概述

串行外设接口(SPI)是一个同步全双工串行接口。在同一总线上可以连接多个主机或从机,但同一

次传输过程中只能有一个主机和一个从机能够通信。在一次数据传输过程中,主机通常向从机发送8位

或16位数据,从机通常向主机返回1字节数据。

LPC17xx系列处理器具有1个SPI接口,遵循SPI规范,支持同步、串行、全双工通信,支持SPI主机

和从机,最大数据位速率为输入时钟速率的1/8,每次传输可以是8位或16位数据。

LPC17xx系列处理器的SPI接口模块的结构框图如图5.21。

图5.21 SPI接口模块结构框图

LPC17xx系列处理器的SPI接口占用4条引脚,分别是SCK、SSEL、MISO和MOSI,其具体描述如

表5.39示。

  表5.39 SPI接口引脚描述

名称 类型 引脚描述

SCK 输入/输出 串行时钟。

SSEL 输入 从机选择。

MISO 输入/输出 主机输入,从机输出。

MOSI 输入/输出 主机输出,从机输入

5.19.2 SPI的数据传输

LPC17xx系列处理器的SPI有4种不同的数据传输格式,其时序图如下图5.22所示。

图5.22描述的是8位数据的传输,需要注意的是,该时序图分成了3个水平的部分。第一部分描

述SCK和SSEL信号,第二部分描述了时钟相位CPHA=0时的 MOSI和MISO信号,第三部分描述了

Page 132: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 132/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

132

CPHA=1时的MOSI和MISO信号。

在时序图的第一部分中要注意两点:时序图包含了时钟极性CPOL设置为0和1的情况,SSEL信号

的激活和未激活,当CPHA=1时,SSEL信号在数据传输之间时总是保持未激活状态,当CPHA=0时则

不能保证这一点。

 

图5.22 SPI传输格式的时序图

数据和时钟的相位关系如表5.40所示。该表针对CPOL和CPHA的每一种设定值和以下三种情况

进行了总结:

* 当驱动第一个数据位时;

* 当驱动所有其他数据位时;

* 当采样数据时。

  表5.40 SPI数据与时钟的相位关系

CPOL和CPHA的设定 驱动第一个数据位 驱动所有其他数据位 采样数据

CPOL=0,CPHA=0 第一个SCK上升沿之前 SCK下降沿 SCK上升沿

CPOL=0,CPHA=1 第一个SCK上升沿 SCK上升沿 SCK下降沿

CPOL=1,CPHA=0 第一个SCK下降沿之前 SCK上升沿 SCK下降沿

CPOL=1,CPHA=1 第一个SCK下降沿 SCK下降沿 SCK上升沿

8位传输开始和停止时间的定义依赖于器件是主机还是从机,以及CPHA变量的设置。

当器件为主机时,传输的开始由准备好要发送数据字节的主机来指示,此时,主机可激活时钟并

开始传输,当传输的最后一个时钟周期结束时,传输结束。

当器件为从机并且CPHA=0时,传输从SSEL信号变成激活时开始,并在SSEL变为不活动时结

束。当器件为从机并且CPHA=1时,传输从从机被选中后的第一个时钟沿开始,并在数据采样的最后一

Page 133: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 133/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

133

个时钟沿结束。

5.19.3 SPI接口寄存器描述

LPC17xx系列处理器SPI接口共有5个寄存器,所有寄存器都可以以8位、16位和32位访问,详细

如表5.41所示。

  表5.41 SPI寄存器映射表

名称 描述 访问 复位值 地址

S0SPCR SPI控制寄存器。该寄存器控制SPI接口的操作 读/写 0x00 0x4002 0000

S0SPSR SPI状态寄存器。该寄存器显示SPI接口的状态 只读 0x00 0x4002 0004

S0SPDR SPI数据寄存器。该双向寄存器为SPI接口提供发送和接收数据 读/写 0x00 0x4002 0008

S0SPCCR SPI时钟计数寄存器。该寄存器控制注意SCK的频率。 读/写 0x00 0x4002 000C

S0SPINT SPI中断标志。该寄存器包含SPI接口的中断标志 读/写 0x00 0x4002 001C

5.20 CAN控制器

5.20.1 CAN接口描述

CAN(Controller Area NetWork 控制器局域网络)是一种为串行数据通信定义的高性能通信协议,

由于具有片上CAN控制器,LPC17xx系列处理器可以构建提供分布式实时控制、具有极高安全性、功

能强大的局域网络。CAN总线常应用于工业环境中,实现低成本高速网络多元化接线,减少了成行导

线并且提高了诊断和监督能力,CAN模块主要支持多重CAN总线,在各种应用中许多CAN总线允许作

为网关、开关或者路由器等装置来使用。

LPC17xx系列处理器拥有两个CAN控制器,分别命名为CAN1和CAN2,都完全实现CAN规范版

本2.0B中CAN协议。

LPC17xx系列处理器的CAN模块包括两个组成部分:控制器和接收滤波器,所有寄存器和RAM

要以32位来访问,CAN控制器模块的结构框图如图5.23所示。

Page 134: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 134/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

134

图5.23 CAN控制器结构框图

LPC17xx系列处理器的CAN控制器各占用2条引脚,分别是TD和RD,其具体描述如表5.42所

示。

  表5.42 CAN控制器引脚描述

名称 类型 描述

RD1、RD2 输入 串行输入,来自CAN收发器

TD1、TD2 输出 串行输出,输出到CAN收发器

5.20.2 CAN模块内存映射表

CAN控制器和滤波器占用了一部分 APB,详见表5.43。

  表5.43 CAN模块内存映射表

地址范围 用途

0x4003 8000~0x4003 87FF 接收滤波器RAM

0x4003 C000~0x4003 C017 接收滤波器寄存器

0x4004 0000~0x4004 0000B 核心CAN寄存器

0x4004 4000~0x4004 405F CAN控制器1寄存器

0x4004 8000~0x4004 805F CAN控制器2寄存器

0x400F C110~0x400F C114 CAN唤醒和睡眠寄存器

5.20.3 CAN控制器寄存器描述

CAN模块包括的寄存器如表5.44和表5.45所示。

  表5.44 CAN接收滤波器和核心CAN寄存器

名称 描述 访问 复位值 地址

 AFMR 接收滤波器寄存器 读/写 1 0x4003 C000

SFF_sa 标准帧独立起始地址寄存器 读/写 0 0x4003 C004

SFF_GRP_sa 标准帧群组起始地址寄存器 读/写 0 0x4003 C008

EFF_sa 扩展帧独立起始地址寄存器 读/写 0 0x4003C00C

EFF_GRP_sa 扩展帧群组起始地址寄存器 读/写 0 0x4003 C010

ENDofTable AF表结束寄存器 读/写 0 0x4003 C014

LUTerrAd LUT错误地址寄存器 只读 0 0x4003 C018

LUTerr LUT错误寄存器 只读 00x4003

C01C

CANTxSR CAN核心发送状态寄存器 只读 0x0003 0300 0x4004 0000

CANRxSR CAN核心接收状态寄存器 只读 0 0x4004 0004

CANMSR CAN核心杂项状态寄存器 只读 0 0x4004 0008

 

Page 135: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 135/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

135

  表5.45 CAN1和CAN2控制寄存器映射表

名称 描述 访问CAN1寄存器名称和地址

CAN2寄存器名称和地址

MOD 控制CAN控制器的操作模式 读/写CAN1MOD 0x4004 4000

CAN2MOD 0x4004 8000

CMR 影响CAN控制器状态的命令位 只写 CAN1CMR 0x4004 4004CAN2CMR 0x4004 8004

GSR 全局控制状态和错误计数器 只读CAN1GSR 0x4004 4008

CAN2GSR 0x4004 8008

ICR 中断状态,仲裁失败捕获、错误代码捕获 只读CAN1ICR 0x4004 400C

CAN2ICR 0x4004 800C

IER 中断使能 读/写CAN1IER 0x4004 4010

CAN2IRE 0x4004 8010

BTR 总线定时 读/写CAN1BTR 0x4004 4014

CAN2BTR 0x4004 8014

EWL 错误警告限制 读/写CAN1IER 0x4004 4018

CAN2IER 0x4004 8018

SR 状态寄存器 只读CAN1SR 0x4004 401C

CAN2SR 0x4004 801C

RFS 接受帧状态 读/写CAN1RFS 0x4004 4020

CAN2RFS 0x4004 8020

RID 接收的识别标识符 读/写CAN1RID 0x4004 4024

CAN2RID 0x4004 8024

RDA 接收数据字节1~4 读/写CAN1RDA 0x4004 4028

CAN2RDA 0x4004 8028

RDB 接收数据字节5~8 读/写CAN1RDB 0x4004 402C

CAN2RDB 0x4004 802C

TFI1 发送帧信息(Tx缓冲区1) 读/写CAN1TFI1 0x4004 4030

CAN2TFI1 0x4004 8030

TID1 发送标识符(Tx缓冲区1) 读/写CAN1TID1 0x4004 4034

CAN2TID1 0x4004 8034

TDA1 发送数据字节1~4(Tx缓冲区1) 读/写

CAN1TDA1 0x4004 4038

CAN2TDA1 0x4004 8038

TDB1 发送数据字节5~8(Tx缓冲区1) 读/写CAN1TDB1 0x4004 403C

CAN2TDB1 0x4004 803C

TFI2 发送帧信息(Tx缓冲区2) 读/写CAN1TFI2 0x4004 4040

CAN2TFI2 0x4004 8040

TID2 发送标识符(Tx缓冲区2) 读/写CAN1TID2 0x4004 4044

CAN2TID2 0x4004 8044

TDA2 发送数据字节1~4(Tx缓冲区2) 读/写CAN1TDA2 0x4004 4048

CAN2TDA2 0x4004 8048

TDB2 发送数据字节5~8(Tx缓冲区2) 读/写CAN1TDB2 0x4004 404C

CAN2TDB2 0x4004 804C

TFI3 发送帧信息(Tx缓冲区3) 读/写CAN1TFI3 0x4004 4050

CAN2TFI3 0x4004 8050

TID3 发送标识符(Tx缓冲区3) 读/写CAN1TID3 0x4004 4054

CAN2TID3 0x4004 8054

TDA3 发送数据字节1~4(Tx缓冲区31) 读/写CAN1TDA3 0x4004 4058

CAN2TDA3 0x4004 8058

TDB3 发送数据字节5~8(Tx缓冲区3) 读/写CAN1TDB3 0x4004 405C

CAN2TDB3 0x4004 805C

5.20.4 CAN控制器应用电路简介

图5.24所示为LPC17xx微控制器的CAN电路原理图,LPC17xx和SJA1040CAN收发器组成CAN

通讯电路。

Page 136: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 136/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

136

 

图5.24 CAN电路原理图

5.21 USB接口

5.21.1 USB接口概述

LPC17xx系列处理器具有一个USB接口,可以配置成为设备/主机/OTG(On the Go)。通用串行

总线(USB)是一种四线总线,可以支持主机与一个或者多个(最多可达127个)外设之间进行通信。

5.21.2 USB设备接口

LPC17xx系列微处理器的USB设备控制器允许与USB主机进行全速的数据交换,具有以下特

性:

* 完全遵守USB2.0规范(全速);

* 支持32个物理(16个逻辑)端点;

* 支持控制、块、中断和同步端点;

* 运行时端点伸缩实现;

* 运行软件能够选择端点最大包尺寸;

* 支持SoftConnect和GoodLink;

* 对于所有非控制端点都支持DMA传输;

* 允许CPU控制和DMA模式之间动态切换;

* 块端点和同步端点采用双缓冲实现。

其结构框图如图5.25所示。

Page 137: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 137/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

137

图5.25 USB设备接口结构框图

设备控制器可以访问USB端口,其引脚描述如表5.46所示。

USB设备控制器可以通过CPU直接访问,而且串行接口引擎(SIE)还有一些其他的寄存器可以通

过SIE命令寄存器间接访问。其寄存器描述如表5.47所示。

  表5.46 USB设备引脚描述

名称 方向 描述VBUS 输出 VBUS状态输入。当通过相关PINSEL寄存器禁止该功能时,该信号在内部被置为高。

USB_CONNECT 输出 软连接控制信号

USB_UP_LED 输出 GoodLink LED控制信号

USB_D+ 输入/输出 正向差分数据

USB_D- 输入/输出 负向差分数据

 

表5.47 USB设备寄存器映射表

名称 描述 访问 复位值 地址

时钟控制寄存器

USBClkCtrl USB时钟控制 读/写 0x0000 0000 0x5000 CFF4

USBClkSt USB时钟状态 只读 0x0000 0000 0x5000 CFF8

设备中断寄存器

USBIntSt USB中断状态 读/写 0x8000 0000 0x400F C1C0

USBDevIntSt USB设备中断状态 只读 0x0000 0010 0x5000 C200

USBDevIntEn USB设备中断使能 读写 0x0000 0000 0x5000 C204

USBDevIntClr USB设备中断清除 只写 0x0000 0000 0x5000 C208

USBDevIntSet USB设备中断设置 只写 0x0000 0000 0x5000 C20C

USBDevIntPri USB设备中断优先级 只写 0x00 0x5000 C22C

端点中断寄存器

Page 138: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 138/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

138

名称 描述 访问 复位值 地址

USBEpIntSt USB端点中断状态 只读 0x0000 0000 0x5000 C230

USBEpIntEn USB端点中断使能 读写 0x0000 0000 0x5000 C234

USBEpInClr USB端点中断清除 只写 0x0000 0000 0x5000 C238

USBEpInSet USB端点中断设置 只写 0x0000 0000 0x5000 C23C

USBEpIntPri USB端点中断优先级 只写 0x0000 0000 0x5000 C240

端点实现寄存器

USBReEp USB实现端点 读写 0x0000 0003 0x5000 C244

USBEpInd USB端点索引 只写 0x0000 0000 0x5000 C248

USBMaxPSize USB最大包尺寸 读写 0x0000 0008 0x5000 C24C

USB传输寄存器

USBRxData USB接收数据 只读 0x0000 0000 0x5000 C218

USBRxPLen USB接收包长度 只读 0x0000 0000 0x5000 C220

USBTxData USB发送数据 只写 0x0000 0000 0x5000 C21C

USBTxPLen USB发送包长度 只写 0x0000 0000 0x5000 C224

USBCtrl USB控制 读写 0x0000 0000 0x5000 C228

SIE命令寄存器

USBCmdCode USB命令代码 只读 0x0000 0000 0x5000 C210

USBCmdData USB命令数据 只读 0x0000 0000 0x5000 C214

DMA寄存器

USBDMARSt USB DMA请求状态 只读 0x0000 0000 0x5000 C250

USBDMARClr USB DMA请求清除 只写

0x0000 0000 0x5000 C254

USBDMARSet USB DMA请求设置 只写 0x0000 0000 0x5000 C258

USBUDCAH USB UDCA头 读写 0x0000 0000 0x5000 C280

USBEpDMASt USB端点DMA状态 只读 0x0000 0000 0x5000 C284

USBEpDMAEn USB端点DMA使能 只写 0x0000 0000 0x5000 C288

USBEpDMADis USB端点DMA禁用 只写 0x0000 0000 0x5000 C28C

USBDMAIntSt USB DMA中断状态 只读 0x0000 0000 0x5000 C290

USBDMAIntEn USB DMA中断使能 读写 0x0000 0000 0x5000 C294

USBEoTIntSt USB传输结束中断状态 只读 0x0000 0000 0x5000 C2A0

USBToTIntClr USB传输结束中断清除 只写 0x0000 0000 0x5000 C2A4

USBToTIntSet USB传输结束中断设置 只写 0x0000 0000 0x5000 C2A8

USBNDDRIntSt USB新DD请求中断状态 只读 0x0000 0000 0x5000 C2AC

USBNDDRIntClr USB新DD请求中断清除 只写 0x0000 0000 0x5000 C2B0

USBNDDRIntSet USB新DD请求中断设置 只写 0x0000 0000 0x5000 C2B4

USBSysErrIntSt USB系统错误中断状态 只读 0x0000 0000 0x5000 C2B8

USBSysErrIntClr USB系统错误中断清除 只写 0x0000 0000 0x5000 C2BC

USBSysErrIntSet USB系统错误中断设置 只写 0x0000 0000 0x5000 C2C0

5.21.3 USB主机接口

Page 139: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 139/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

139

LPC17xx系列处理器的USB主机接口是USB 2.0 OTG双角色核的一部分,该核集成了主机控制

器、设备控制器和 I2C接口。I

2C接口控制着外部OTG的模拟收发器。

主机控制器通过基于令牌的协议来分配USB带宽连接设备。所有交易都由主机发起。主机控制

器使能连接在总线上的设备进行数据交换。它由寄存器接口、总线主机接口、主机控制器和收发器控

制逻辑组成。其接口框图如图5.26所示。USB主机引脚如表5.48所示。端口配置成主机模式时,USB

主机寄存器映射表如表5.49所示。

图5.26 USB主机接口框图

  表5.48 USB主机端口引脚描述

管脚名称 方向 描述 引脚归类

USB_D+ 输入/输出 正向差分数据 USB连接器

USB_D- 输入/输出 负向差分数据 USB连接器

USB_UP_LED 输出 GoodLink LED控制器信号 控制

 PPWRUSB _  输出 端口电源使能 主机电源开关

USB_PWRD 输入 端口电源状态 主机电源开关

OVRCRUSB _  输入 过流状态监测 主机电源开关

表5.49 USB主机寄存器映射表

名称 描述 访问 复位值 地址

HcRevision BCD码表示的主机控制器实现的HCI规范的版本号 只读 0x10 0x5000 C000

HcControl 定义HC的操作模式 读写 0x00 0x5000 C004

HcCommandStatus该寄存器用于接收来自主机控制驱动器的命令,也可

以表示HC的状态读写 0x00 0x5000 C008

HcInterruptStatus通过设置相应位来表示导致硬件中断的不同事件的状

态读写 0x00

0 x 5 0 0 0

C00C

HcInterruptEnable控制HcInterruptStatus寄存器中的位,并表示哪个时

间将产生硬件中断读写 0x00 0x5000 C010

HcInterrptDisable该寄存器中的位用于禁止HcInterruptStatus寄存器中

的相应位,并禁止该事件产生硬件中断读写 0x00 0x5000 C014

HcHCCA 包含主机控制器通信区域的物理地址 读写 0x00 0x5000 C018

HcPeriodCurrentED 包含当前同步或中断端点描述器的物理地址 只读 0x000 x 5 0 0 0

C01C

Page 140: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 140/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

140

名称 描述 访问 复位值 地址

HcControlHeadED 包含控制列表中当前端点描述器的物理地址 读写 0x00 0x5000 C020

HcControlCurrentED 包含控制列表中当前端点描述器的物理地址 读写 0x00 0x5000 C024

HcBulkHeadED 包含块列表中第一个端点描述器的物理地址 读写 0x00 0x5000 C028

HcBulkCurrentED 包含块列表中当前端点描述器的物理地址 读写 0x000 x 5 0 0 0

C02C

HcDoneHead 包含块列表中当前端点描述器的物理地址 只读 0x00 0x5000 C030

HcFmInterval定义一帧中位时间间隔和不会发生超界全速最大包尺

寸读写 0x2EDF 0x5000 C034

HcFmRemaining 表示当前帧剩余位时间的14位计数器 只读 0x00 0x5000 C038

HcFmNumber 包含一个16位计数器,并未HC和HCD中发生的事件

提供时间参考只读 0x00

0 x 5 0 0 0

C03C

HcPeriodicStart包含决定HC可以启动处理一个周期列表的可编程14

位值读写 0x00 0x5000 C040

HcLSThreshold包含被HC用来决定是否在EOF之前要发送一个最大8

字节LS包读写 0x628 0x5000 C044

HcRhDescriptorA 描述根集线器特征两寄存器中的第一个 读写 0xFF000902 0x5000 C048

HcRhDescriptorB 描述根集线器特征两寄存器中的第二个 读写 0x600000 x 5 0 0 0

C04C

HcRhStatus该寄存器分为两个部分。低字表示集线器状态域,而

高字表示集线器状态变化域读写 0x00 0x5000 C050

HcRhPortStatus[1] 控制和报告每端中的端口事件 读写 0x00 0x5000 C054

HcRhPortStatus[2] 控制和报告每端中的端口事件 读写 0x00 0x5000 C058

M o d u l e _ I D / V e r _  

Rev_ID

IP号,其中yy(0x00)是唯一版本号,zz(0x00)是

唯一的修订版本号只读 0x3505yyzz 0x5000C0FC

5.21.4 USB OTG接口

USB OTG(On-The-Go)是USB2.0规范的补充,通过为现有移动设备和USB外设增加主机功能来

加强它们的能力,其接口结构框图如图5.27所示。

图5.27 USB OTG接口结构框图

主机、设备、OTG和I2C控制器可以通过寄存器接口编程。OTG控制器允许主机和设备角色之间利

用主机协商协议(HNP)进行动态切换,一个端口可以连接到外部OTG收发器以支持OTG连接,寄存

器接口和外部OTG接收器之间的通信是通过I2C接口和外部OTG收发器中断信号来处理的。

Page 141: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 141/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

141

USB OTG引脚描述如表5.50所示。

  表5.50 USB OTG端口引脚描述

管脚名称 方向 描述 引脚归类

USB_D+ 输入/输出 正向差分数据 USB连接器

USB_D- 输入/输出 负向差分数据 USB连接器

USB_UP_LED 输出 GoodLink LED控制信号 控制

USB_SCL 输入/输出 I2C串行时钟 外部OTG收发器

USB_SDA 输入/输出 I2C串行数据 外部OTG收发器

LPC17xx系列微控制器的USB OTG及相关I2C寄存器映射表如表5.51所示。

  表5.51 USB OTG和I2C寄存器映射表

名称 功能 访问 地址

中断寄存器

USBIntSr USB中断状态 读写 0x400F C1C0

OTG寄存器

OTGIntSt OTG中断状态 只读 0x5000 C100

OTGIntEn OTG中断使能 读写 0x5000 C104

OTGIntSet OTG中断设置 只写 0x5000 C108

OTGIntClr OTG中断清除 只写 0x5000 C10C

OTGStCtrl OTG状态和控制 读写 0x5000 C110

OTGTmr OTG定时器 读写 0x5000 C114

I2C寄存器

I2C_RX I

2C接收 只读 0x5000 C300

I2C_TX I2C发送 只写 0x5000 C300

I2C_STS I

2C状态 只读 0x5000 C304

I2C_CTL I

2C控制 读写 0x5000 C308

I2C_CLKHI I

2C时钟高位 读写 0x5000 C30C

I2C_CLKLO I

2C时钟低位 只写 0x5000 C310

时钟控制寄存器

OTGClkCtrl OTG时钟控制器 读写 0x5000 CFF4

5.22 以太网接口

5.22 .1 以太网接口概述

LPC17xx系列处理器的以太网模块包含一个全特性的10Mbps和100Mbps以太网介质访问控制器

(MAC),采用DMA硬件加速器可以提供最优化的性能。其特性包括:提供一组丰富的控制寄存器,支

持半双工或全双工操作、流量控制、控制帧,具有发送重试的硬件加速器、接受包过滤器和支持局域

网活动唤醒功能等。利用Scatter-Gather DMA自动发送和接收数据帧可以大大减轻CPU的负担。

Page 142: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 142/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

142

以太网模块与片外以太网物理层(PHY )接口采用RMII(简化的MII)协议,并采用片上MIIM(MII管

理)串行总线。

5.22.2 结构和引脚描述

LPC17xx系列处理器的以太网模块结构框图如图5.28所示。

 

图5.28 以太网模块结构框图

以太网模块由以下几个部分组成。

* 主机寄存 器模 块:包含软件使用的寄存器组,并处理 AHB对以太网模块的访问。主机寄存器

连接发送和接受数据通路以及MAC;

* DMA到 AHB接口:提供 AHB主设备的连接,允许以太网模块访问以太网SRAM读描述字、写状

态和读/写数据缓冲器;

* 以太网MAC和相连的RMII适配器:这是MAC到片外物理层的接口;

* 发送数据通路;

* 接受数据通路。

LPC17xx系列处理器的以太网模块可以将MII或RMII连接到外部的物理层,其中连接RMII的引脚

描述如表5.52所示,而MIIM使用的引脚如表5.53所示。

  表5.52 以太网RMII引脚描述

引脚名称 类型 引脚描述

ENET_TX_EN 输出 发送数据使能

ENET_TXD[1:0] 输出 发送数据,2位

ENET_RXD[1:0] 输入 接收数据,2位

ENET_RX_ER 输入 接收错误

ENET_CRS 输入 载波侦听/数据有效

Page 143: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 143/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

143

引脚名称 类型 引脚描述

ENET_REF_CLK/

ENET_RX_CLK输入 参考时钟/接收时钟

  表5.53 以太网MIIM引脚描述引脚名称 类型 引脚描述

ENET_MDC 输出 MIIM时钟

ENET_MDIO 输入/输出 MI数据输入和输出

5.22. 3 寄存器描述

LPC17xx系列微 控制器以太网的寄存 器分为4大类,包括MAC寄存器类、控制寄存器类、接收滤

波器类以及模块控制寄存器类,表5.54所示为寄存器的地址等基本信息。

表5.54 以太网寄存器定义

符号 地址 读/写 描述

MAC寄存器

MAC1 0x5000 0000 读写 MAC配置寄存器1

MAC2 0x5000 0004 读写 MAC配置寄存器2

IPGT 0x5000 0008 读写 Back-to-Back空闲帧寄存器

IPGR 0x5000 000C 读写 非Back-to-Back空闲帧寄存器

CLRT 0x5000 0010 读写 冲突窗口/重传寄存器

MAXF 0x5000 0014 读写 最大帧寄存器

SUPP 0x5000 0018 读写 物理链路(PHY)支持寄存器

TEST 0x5000 001C 读写 测试寄存器

MCFG 0x5000 0020 读写MII(介质独立接口)管理设置寄存

MCMD 0x5000 0024 读写 MII管理命令寄存器

MADR 0x5000 0028 读写 MII管理地址寄存器

MWTD 0x5000 002C 只写 MII管理写数据寄存器

MRDD 0x5000 0030 只读 MII管理读数据寄存器

MIND 0x5000 0034 只读 MII管理指示寄存器

--0x5000 0038~0x5000

00FC- 保留

SA0 0x5000 0040 读写 站地址寄存器0

SA1 0x5000 0044 读写 站地址寄存器1

SA2 0x5000 0048 读写 站地址寄存器2

--0x5000 004C~0x5000

00FC-- 保留

控制寄存器

Command 0x5000 0100 读写 命令寄存器

Status 0x5000 0104 只读 状态寄存器

RxDescriptor 0x5000 0108 读写 接收描述符基址寄存器

RxStatus 0x5000 010C 读写 接收状态基址寄存器

Page 144: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 144/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

144

符号 地址 读/写 描述

RxDescriptorNumber 0x5000 0110 读写 接收描述符数量寄存器

RxProduceIndex 0x5000 0114 只读 接收产生索引寄存器

RxConsumeIndex 0x5000 0118 读写 接收消耗索引寄存器

TxDescriptor 0x5000 011C 读写 发送描述符基址寄存器

TxStatus 0x5000 0120 读写 发送状态基址寄存器

TxDescriptorNumber 0x5000 0124 读写 发送描述符数量寄存器

TxProduceIndex 0x5000 0128 读写 发送产生索引寄存器

TxConsumeIndex 0x5000 012C 读写 发送消耗索引寄存器

--0x5000 0130~0x5000

0154-- 保留

TSV0 0x5000 0158 只读 发送状态向量0寄存器

TSV1 0x5000 015C 只读 发送状态向量1寄存器

RSV 0x5000 0160 只读 接收状态向量寄存器

--0x5000 0164~0x5000

01FC-- 保留

Rx滤波器寄存器

RxFilterCtrl 0x5000 0200 接收滤波器控制寄存器

RxFilterWolStatus 0x5000 0204 接收滤波器WoL状态寄存器

RxFilterWolClear 0x5000 0208 接收滤波器WOL清除寄存器

-- 0x5000 020C -- 保留

HashFilterL 0x5000 0210 哈希过滤器表低位寄存器

HashFilterH 0x5000 0214 哈希过滤器表高位寄存器

-- 0x5000 0218~0x50000FDC

-- 保留

模块控制寄存器

IntStatus 0x5000 0FE0 只读 中断状态寄存器

IntEnable 0x5000 0FE4 读写 中断使能寄存器

IntClear 0x5000 0FE8 只写 中断清除寄存器

IntSet 0x5000 0FEC 只写 中断设置寄存器

-- 0x5000 0FF0 -- 保留

PowerDown 0x5000 0FF4 读写 掉电寄存器

-- 0x5000 0FF8 -- 保留

5.22.4 应用举例

图5.29所示为LPC17xx微控制器以太网部分的电路原理图,PHY选择的是DP83848,接口方式为

RMII。

Page 145: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 145/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

145

图5.29 LPC17xx微控制器以太网原理图

以太网MAC接口编程,其中主要包括11个调用函数,集中在实验EasyWeb历程的EMAC.c文件

中。这些函数的描述如表5.55所示。

 表5.55 EMAC.c文件中的调用函数

函数原型 功能

void Init_EMAC(void) 初始化EMAC

unsigned short ReadFrameBE_EMAC(void) 从帧端口读一个字

void CopyFromFrame_EMAC(void *Dest, unsigned int Size) 从帧端口复制数据到MCU的存储器

void WriteFrame_EMAC(unsigned short Data) 将一个字写入帧端口

void CopyToFrame_EMAC(void *Source, unsigned int Size) 从MCU的存储器复制数据到帧端口

void DummyFrame_EMAC(unsigned short Size) 在帧端口做一次读动作,但不读实际内容

unsigned short StartReadFrame(void)开始读帧端口

void EndReadFrame(void) 结束读帧端口

unsigned int CheckFrameReceived(void) 检测是否接收帧

void RequestSend(unsigned short FrameSize) 在EMAC存储器中申请空间以存储发送的帧

unsigned int Rdy4Tx(void) 检测以太网控制器是否准备接收要发送的帧

MAC初始化

Init_EMAC()函数完成以太网MAC的初始化工作,主要包括为以太网控制器配置引脚端口、复位

控制器,并启动控制器的配置过程。具体代码如程序清单5.26所示。

Page 146: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 146/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

146

程序清单5.26

void Init_EMAC(void)

{

// Keil: function modified to access the EMAC

// 初始化以太网MAC

unsigned int regv,tout,id1,id2;

/* 使能EMAC控制器 */

PCONP |= 0x40000000;

/* 使能P1以太网管脚 */

PINSEL2 = 0x50150105;

PINSEL3 = (PINSEL3 & ~0x0000000F) | 0x00000005;

/* 复位所有的EMAC内部模块 */

EMAC_MAC1 = MAC1_RES_TX | MAC1_RES_MCS_TX | MAC1_RES_RX | MAC1_ 

RES_MCS_RX | MAC1_SIM_RES | MAC1_SOFT_RES;

EMAC_Command = CR_REG_RES | CR_TX_RES | CR_RX _RES | CR_PASS_RUNT_ 

FRM;

/* 复位后等待一段时间 */

for (tout = 100; tout; tout--);

/* 初始化以太网控制器寄存器 */

EMAC_MAC1 = MAC1_PASS_ALL;

EMAC_MAC2 = MAC2_CRC_EN | MAC2_PAD_EN;

EMAC_MAXF = ETH_MAX_FLEN;

EMAC_CLRT = CLRT_DEF;

EMAC_IPGR = IPGR_DEF;

/* 使能RMII接口 */

EMAC_Command = CR_RMII | CR_PASS_RUNT_FRM;

/* 设置DP83848C复位模式 */

write_PHY (PHY_REG_BMCR, 0x8000);

/* 等待硬件复位结束 */

for (tout = 0; tout < 0x100000; tout++) {

regv = read_PHY (PHY_REG_BMCR);

Page 147: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 147/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

147

if (!(regv & 0x8000)) {

/* 复位完成 */

  break;

}

}

/* 检查是否是DP83848C */

id1 = read_PHY (PHY_REG_IDR1);

id2 = read_PHY (PHY_REG_IDR2);

if (((id1 << 16) | (id2 & 0xFFF0)) == DP83848C_ID) {

/* 配置PHY,使用自动协商方法确定链接速率 */

write_PHY (PHY_REG_BMCR, PHY_AUTO_NEG);

/* 等待自动协商结束 */

for (tout = 0; tout < 0x100000; tout++) {

regv = read_PHY (PHY_REG_BMSR);

if (regv & 0x0020) {

/* 自动协商结束 */

break;

}

}

}

/* 检查连接状态. */

for (tout = 0; tout < 0x10000; tout++) {

regv = read_PHY (PHY_REG_STS);

if (regv & 0x0001) {

/* 连接好 */

break;

}

}

/* 配置全 /半双工模式 */

if (regv & 0x0004) {

/* 全双工使能 */

Page 148: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 148/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

148

  EMAC_MAC2 |= MAC2_FULL_DUP;

EMAC_Command |= CR_FULL_DUP;

EMAC_IPGT = IPGT_FULL_DUP;

}

else {

/* 半双工模式 */

EMAC_IPGT = IPGT_HALF_DUP;

}

/* 配置100Mbit/10Mbit模式 */

if (regv & 0x0002) {

/* 10MBit模式 */

EMAC_SUPP = 0;

}

else {

/* 100MBit模式. */

EMAC_SUPP = SUPP_SPEED;

}

/* 设置以太网MAC地址寄存器 */

EMAC_SA0 = (MYMAC_1 << 8) | MYMAC_2;

EMAC_SA1 = (MYMAC_3 << 8) | MYMAC_4;

EMAC_SA2 = (MYMAC_5 << 8) | MYMAC_6;

/* 初始化Tx和Rx DMA描述符 */

rx_descr_init ();

tx_descr_init ();

/* 接收广播包和完美匹配包 */

EMAC_RxFilterCtrl = RFC_BCAST_EN | RFC_PERFECT_EN;

/* 使能EMAC中断 */

EMAC_IntEnable = INT_RX_DONE | INT_TX_DONE;

/* 复位所有中断 */

EMAC_IntClear = 0xFFFF;

/* 使能MAC接收和发送模式 */

Page 149: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 149/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

149

  EMAC_Command |= (CR_RX_EN | CR_TX_EN);

EMAC_MAC1 |= MAC1_REC_EN;

}

从MCU存储器复制字节到帧端口

CopyToFrame_EMAC()函数负责将数据从MCU的存储器复制到帧端口以便发送。需要注意的

是,MCU的存储器必须是字对齐的,当帧写完时也有可能只发送了奇数字节。具体代码如程 序清单

5.27所示。

程序清单5.27

void CopyToFrame_EMAC(void *Source, unsigned int S ize)

{

unsigned short * piSource;

unsigned int idx;

piSource = Source;

Size = (Size + 1) & 0xFFFE; // 循环大小为满足字节数要求的最小偶数

while (Size > 0) {

WriteFrame_EMAC(*piSource++); //写帧数据

Size -= 2;

}

idx = EMAC_TxProduceIndex;

if (++idx == NUM_TX_FRAG) idx = 0;

EMAC_TxProduceIndex = idx;

}

从帧端口复制字节到MCU存储器

CopyFromFrame_EMAC ()函数负责将数据从帧端口复制到MCU的存储器,以实现接收,需要注

意的是,MCU的存储器同样必须是字对齐的,当帧读完时也能是只接收到奇数字节。具体代码如程序

清单5.28所示

程序清单5.28

void CopyFromFrame_EMAC(void *Dest, unsigned short Size)

{

  unsigned short * piDest;

Page 150: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 150/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

150

piDest = Dest;

while (Size > 1) {

*piDest++ = ReadFrame_EMAC(); //读帧数据

Size -= 2;

}

if (Size) {

*(unsigned char *)piDest = (char)ReadFrame_EMAC();

}

}

5.23 数模转换器和模数转换器

5.23.1 数模转换器DAC的特性

LPC17xx系列微控制器中的数模转换器DAC的特性有:

* 10位数模转换器;

* 电阻线结构;

* 缓冲输出;

* 具有掉电模式;

* 转换速度及功耗可选。

5.23.2 DAC引脚和寄存器描述

表5.56所示为DAC的主要相关引脚。

  表5.56 DAC引脚描述

引脚名称 类型 功能描述

 AOUT 输出模拟输出。在向DACR寄存器写入一个新数值后,该引脚输出电压值为

VALUE/1024×VREF

VREF 参考电压 参考电压。该引脚想DAC提供参考电压值

VDDA、VSSA 电源 模拟电源及地。应与数字地和电源隔离

DAC寄存器(DACR 0x4008 C0000)可为读/写寄存器,包括了数模转换数值、性能功耗选择位,

如表5.57所示。寄存器的0~5位为保留位,以适应将来更高位数的数模转换器使用。

表5.57 DAC寄存器位描述

位 名称 功能描述 复位值5:0 -- 保留位 NA

15:6 VALUE向 该 位 段 写 入 经 过 设 定 的 转 换 时 间 后 , 在 引 脚 A O U T 上 输 出 电 压 值 为

VALUE/1024×VREF0

Page 151: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 151/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

151

16 BIAS0:设置DAC的最大转换时间为1uS,最大电流为700uA

1:设置DAC的最大转换时间为2.5uS,最大电流为350uA0

31:17 -- 保留位 NA

5.23.3 DAC基本操作

寄存 器PINSEL1的位21和位 20用于控制DAC是否使能以及引脚P0.26的状态。当这两位的值为

10时,DAC供电并被使能。所以DAC的基本操作顺序为:

* 设置PINSEL1寄存器,使能DAC;

* 设置DAC寄存器的BIAS位,选择DAC的转换时间;

* 在程序中向DAC寄存器的VALUE位写入需要转换的数字值。

5.23.4  ADC的特性

LPC17xx微控制器中的模数转换器( ADC)的特性如下:

* 12位逐次逼近式模数转换器;

* 8个引脚复用为输入引脚;

* 支持掉电模式;

* 测量范围:0~VREFP(典型值为3V);

* 200kHz的12位转换频率;* 一个或者多个输入的突发转换模式;

* 可选择由输入跳变或者定时器匹配信号触发转换。

 ADC的基本时钟由 APB时钟提供。每个转换 器包含一个可编程分频器,将时钟调整至逐步逼近

转换所需的时钟(最大13Mhz),完全满足精度要求的转换需要11个转换时钟。

5.23.5  ADC引脚描述

表5.58所示为 ADC的主要引脚。

  表5.58 ADC引脚描述

引脚名称 类型 功能描述

 AD0[7:0] 输入

模拟输入。 A/D转换单元可测量输入信号的电压。注意,即使引脚复用寄存器将他们设定为端口引脚,这些模拟输入还是连接在引脚上。通过将这些引脚驱动成端口输出来实现 A/D转换器的简单自测。注意:当使用 A/D转换器时,模拟输入引脚的信号电平在任何时候都不能大于VDDA,否则,读出的 A/D值无效。如果应用中未使用 A/D转换器,则 A/D输入引脚用作可承受5V电压的数字I/O

口。

VREF 参考电压 参考电压。该引脚向DAC提供参考电压值

VDDA、VSSA 电源 模拟电源及地。应与数字地和电源隔离

Page 152: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 152/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

152

5.23.6  ADC寄存器描述

 ADC寄存器整体描述如表5.59所示。

 表5.59 ADC寄存器列表

引脚名称 功能描述 访问 复位值 地址

 ADCR ADC控制寄存器。在使用 ADC之前必须初始化以选择操作模式 读写 0x0000 0001 0x4003 4000

 ADGDR ADC全局数据寄存器。包含了最新的 ADC转换结构 读写 NA 0x4003 4004

 ADINTEN ADC中断使能寄存器。使能 ADC各个通道的中断 读写 0x0000 0100 0x4003 400C

 ADDR0 ADC通道0数据寄存器。该寄存器包含了通道0最新的转换结果 读写 NA 0x4003 4010

 ADDR1 ADC通道1数据寄存器。该寄存器包含了通道1最新的转换结果 读写 NA 0x4003 4014

 ADDR2 ADC通道2数据寄存器。该寄存器包含了通道2最新的转换结果 读写 NA 0x4003 4018

 ADDR3 ADC通道3数据寄存器。该寄存器包含了通道3最新的转换结果 读写 NA 0x4003 401C

 ADDR4 ADC通道4数据寄存器。该寄存器包含了通道4最新的转换结果 读写 NA 0x4003 4020

 ADDR5 ADC通道5数据寄存器。该寄存器包含了通道5最新的转换结果 读写 NA 0x4003 4024

 ADDR6 ADC通道6数据寄存器。该寄存器包含了通道6最新的转换结果 读写 NA 0x4003 4028

 ADDR7 ADC通道7数据寄存器。该寄存器包含了通道7最新的转换结果 读写 NA 0x4003 402C

 ADSTAT ADC状态寄存器。该寄存器包含了 ADC完成,溢出和中断等标志位 只读 0x0000 0000 0x4003 4030

 ADRTM ADC修正寄存器 读写 0x00 0x4003 4034

5.23.7  ADC基本操作

1.硬件触发转换如果 ADCR的突发位为0且开始字段的值包含在010~111之内,那么当所选引脚或定时器匹配信号

发生跳变时 A/D转换器启动一次转换。也可选择在4个匹配信号中任何一个指定边沿转换,或者在2个

捕获/匹配引脚中任何一个的指定边沿转换。将所选端口的引脚状态或者所选的匹配信号与 ADCR的

位27相异或所得的结果用做边沿检测逻辑。

2.中断

当完成位为1时, ADC转换模块向NVIC发出中断请求,如果使能NVIC中的 A/D转换中断使能位,

则会产生中断,读取 ADDR将清零完成位。

3.精度和数字接收器

 ADC转换器用来测量 Ain引脚的电压时,可以不理会引脚在引脚选择寄存 器中的设置,但是通过

禁止引脚的数字接收器来选择 Ain功能可以提高转换精度。

5.24 电机控制PWM

电机控制PWM(MCPWM)适合3相 AC和DC电机的控制应用,同样也适合用于需要定时,计数,

捕获以及比较的应用中。

Page 153: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 153/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

153

5.24.1 电机控制PWM简述

MCPWM包含3个独立的通道,每个通道包括:

* 一个32位的定时/计数器(TC);

* 一个32位的限制寄存器(LIM);

* 一个32位的匹配寄存器(MAT);

* 一个10位死区寄存器(DT)和一个相关的10位死区计数器;

* 一个32位捕获寄存器(CAP);

* 两个调制输出端口(MCOA和MCOB)带有对立的极性;

* 一个周期中断,一个脉冲宽度中断和一个捕获中断

5.24.2 电机控制PWM引脚简述

  表5.60 电机控制PWM引脚列表 

管脚名称 类型 描述

MCOA0-2 输出 输出 A的通道0-2

MCOB0-2 输出 输出B的通道0-2

 MCABORT 输入 低电平激活快速

MCI0-2 输出 输入口0-2

5.24.3 电机控制PWM寄存器简述

电机控制PWM寄存器如表5.61所示。

表5.61 电机控制PWM寄存器列表

名称 描述 访问 复位值 地址

MCCON PWM控制读地址 只读 0 0x400B 8000

MCCON_SET PWM控制设置地址 只写 - 0x400B 8004

MCCON_CLR PWM控制清除地址 只写 - 0x400B 8008

MCCAPCON 捕捉控制读地址 只读 0 0x400B 800C

MCCAPCON_SET 捕捉控制设置地址 只写 - 0x400B 8010

MCCAPCON_CLR 捕获控制清除地址 只写 - 0x400B 8014

MCTC0 定时器寄存器寄存器,通道0 读写 0 0x400B 8018

MCTC1 定时器寄存器寄存器,通道1 读写 0 0x400B 801C

MCTC2 定时器寄存器寄存器,通道2 读写 0 0x400B 8020

MCLIM0 限制寄存器,通道0 读写 0xFFFF FFFF 0x400B 8024

MCLIM1 限制寄存器,通道1 读写 0xFFFF FFFF 0x400B 8028

MCLIM2 限制寄存器,通道2 读写 0xFFFF FFFF 0x400B 802C

MCMAT0 匹配寄存器,通道0 读写 0xFFFF FFFF 0x400B 8030

MCMAT1 匹配寄存器,通道1 读写 0xFFFF FFFF 0x400B 8034

MCMAT2 匹配寄存器,通道2 读写 0xFFFF FFFF 0x400B 8038

Page 154: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 154/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

154

名称 描述 访问 复位值 地址

MCDT 死区寄存器 读写 0x3FFF FFFF 0x400B 803C

MCCP 通信模式寄存器 读写 0 0x400B 8040

MCCAP0 捕获寄存器,通道0 只读 0 0x400B 8044

MCCAP1 捕获寄存器,通道1 只读 0 0x400B 8048

MCCAP2 捕获寄存器,通道2 只读 0 0x400B 804C

MCINTEN 中断使能读地址 只读 0 0x400B 8050

MCINTEN_SET 中断使能设置地址 只写 - 0x400B 8054

MCINTEN_CLR 中断使能清除地址 只写 - 0x400B 8058

MCCNTCON 计数控制读地址 只读 0 0x400B 805C

MCCNTCON_SET 计数控制设置地址 只写 - 0x400B 8060

MCCNTCON_CLR 计数控制清除地址 只写 - 0x400B 8064

MCINTF 中断标志读地址 只读 0 0x400B 8068

MCINTF_SET 中断标志设置地址 只写 - 0x400B 806C

MCINTF_CLR 中断标志清除地址 只写 - 0x400B 8070

MCCAP_CLR 捕获清除地址 只写 - 0x400B 8074

5.25 LPC17xx的调试手段

5.25.1 简介

LPC17xx系列微控制器支持标准的JTAG以及 ARM Serial Wire Debug(SWD)模式,可以直接调

试所有的存储器件,寄存器和外设。具有8个断点(6个指令断点,2个数据比较器),支持4个观测点。

LPC17xx系列默认使用JTAG作为调试手段。一旦进入JTAG调试模式,调试工具可以切换到SWD

模式下。

5.25.2 管脚描述

一些管脚的功能可能是复用的,所以不能在同一时刻使用除仿真调试功能外的其他的功能。使

用JTAG端口也就包括使用串行线路调试和串行线路输出的端口。使用并行跟踪需要5个管脚,这5个

管脚可能用于其他的用户功能。使用串行线路 输出跟踪并没有这个限制,但是在带宽上有所限制。表

5.62、表5.63和表5.64分别描述了JTAG、SWD和并行跟踪器所涉及的管脚。

  表5.62 JTAG管脚描述

管脚名称 类型 描述

TCK 输入 JTAG测试时钟。在JTAG调试模式下,该管脚提供调试逻辑所需时钟。

TMS 输入 JTAG测试模式选择。该管脚选择在TAP状态机中的下一个状态。

TDI 输入 JTAG测试数据输入。该管脚为移位寄存器输入串行数据。

TDO 输出 JTAG测试数据输出。该管脚从移位寄存器输出串行数据。

TRSTn 输入 JTAG测试复位。该管脚可以用来复位被测试的逻辑器件以及调试逻辑器件。

Page 155: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 155/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

155

管脚名称 类型 描述

RTCK 输出 JTAG反馈测试时钟。

 

表5.63 串行调试SWD管脚描述

管脚名称 类型 描述

SWDCLK 输入 串行线路时钟。该管脚为SWD模式下的调试逻辑提供时钟。

SWDIO 输入/输出串行调试SWD数据输入/输出。该管脚被外部调试器件用来和

Cortex-M3处理器通信以及控制。

SWO 输出 串行线路输出。该管脚可被选择用来从ITM或者ETM中给外部调试器件提供数据。

  表5.64 并行跟踪管脚描述

管脚名称 类型 描述

TRACECLK 输入 跟踪时钟。该管脚提供跟踪数据的采样时钟。

TRACEDATA[3:0] 输出 跟踪数据位3到0。这些管脚被外部调试工具用来在跟踪时传递跟踪数据。

5.25.3 应用电路

图5.30、图5.31、图5.32和分别展示了ETM(Embedded Trace Macrocell)、JTAG、SWD和的基本

电路原理图。

图5.30 并行跟踪调试ETM接口电路原理图

图5.31 JTAG接口电路原理图

Page 156: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 156/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

156

图5.32 SWD调试电路接口原理图

5.26 LCD接口简介

LCP17xx不像恩智浦的LPC247x和LPC32xx系列控制器那样带有LCD控制器。LCD控制可以直

接与带有LCD驱动的LCD TFT屏幕相连接。如果用户需要使用LPC17xx连接TFT之类的显示器件,可

以选择带有控制器的LCD。目前市面上有很多“山寨”手机使用的LCD,价格低廉,可互相替代的品牌

很多。这些“山寨”屏幕的大小多为1.5寸到3寸左右的小屏,分辨率通常为320×240。

Linpo-PS-LPC17xx开发板上选择的是一颗2.4寸,分辨率320×240带有控制器的TFT LCD屏幕,

其名称为LM2411TLCM。LCD控制器一般跟MCU的连接方式有8080并行总线方式,6800总线方式

以及部分LCD控制器可以使用SPI接口方式进行数据通信和控制。6800和8080的主要区别是总线的

控制方式上,8080是通过“读使能(RE)”和“写使能(WE)”两条控制线进行读写操作,6800是通过

“总是能(E)”和“读写选择(W/R)”两条控制线进行。

5.26.1 8080并行接口方式简介

LM2411TLCM支持8080并行接口方式连接,其控制和传输数据所需主要管脚如表5.65所示。

LM2411TLCM使用ILI9320控制器,其与MCU连接的方式如图5.33所示。

  表5.65 LCD控制和传输数据所需管脚列表

管脚名称 功能描述

DB0-DB17 数据总线

CS  芯片选择管脚

RS 命令/数据选择管脚

写使能管脚

 RD 读使能管脚

IM0 IM0=0:16位数据总线方式,IM0=1:8位数据总线方式

 RESET  复位信号管脚

Page 157: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 157/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

157

图5.33 LCD模块和ILI9320连接示意图

8080接口的时序如图5.34所示。

 

图5.34 8080时序结构图

5.26.2 硬件连接原理图

8080总线方式可以使用LPC17xx的I/O功能模拟。实际的硬件原理图如图5.35所示。

 

图5.35 LM2411TLCM与LPC17xx连接原理图

5.26.3 软件结构分析 

文件中定义了相关IO口模拟8080总线时所充当的功能。如程序清单5.29所示。

程序清单5.29

#define LCD_CS_1 FIO0SET |= (1<<19)

#define LCD_RESET_1 FIO0SET |= (1<<20)

#define LCD_RS_1 FIO0SET |= (1<<21)

Page 158: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 158/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

158

#define LCD_RD_1 FIO0SET |= (1<<22)

#def ine LCD_WR_1 FIO1SET |= (1<<29)

#define LCD_CS_0 FIO0CLR |= (1<<19)

#define LCD_RESET_0 FIO0CLR |= (1<<20)

#define LCD_RS_0 FIO0CLR |= (1<<21)

#define LCD_RD_0 FIO0CLR |= (1<<22)

#define LCD_WR_0 FIO1CLR |= (1<<29)

#define LCD_DATA(ch) FIO1PIN &= 0xF807FFFF;\

FIO1PIN |= (ch << 19);

LCD驱动中基本的几个函数如表5.66所示。

表5.66 LCD驱动基本函数列表

函数名称 功能描述

void LCD_WriteReg(WORD LCD_Reg, WORD LCD_ 

RegValue)对控制器写寄存器函数

void LCD_WR_Data(unsigned int data) 对控制器的写数据函数

void LCD_WR_Start(void ) 开始写数据函数

void LCD_Set_XY(unsigned char Xpos, unsigned int Ypos) 设定显示开始的X和Y坐标

void LCDInit(void) LCD初始化函数

void GUI_Point(DWORD X, DWORD Y, DWORD Color) LCD画点函数

LCD的初始化函数LCDInit()中的相关初始化过程是由LCD的厂家提供的一份初始化参考代码,

用户根据该代码进行相应的修改。

LCD的画图操作无论是画线还是画圆以及更复杂的图形界面,在根本上其实是对LCD的点的操

作,GUI_Ponit()函数完成了画点的任务,其具体见程序清单5.30所示。

程序清单5.30

void GUI_Point(DWORD X, DWORD Y, DWORD Color)

{

LCD_Set_XY(X,Y);//设置坐标

LCD_WR_Start();//开始写数据

LCD_WR_Data(Color); //颜色数据

  LCD_CS_1;//一次画点结束

}

Page 159: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 159/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

159

5.27 基于Cortex-M3内核编程简述

5.27.1 CMSIS简介

为基于Cortex系列内核的微控制器编程, ARM公司定义了一个标准,可以见 ARM公司的《Cortex

Micontroller Softerware Interface Standard》一文。 ARM公司于2008年11月提出该标准,目的是为了

使得Cortex-M3处理器的编程更为轻松,软件移植更加方便,基本屏蔽了不同厂商基于Cortex-M3内

核处理器之间的差异。该标准简称CMSIS。

CMSIS使得芯片厂商能够将他们的资源专注于对其产品的外设特性进行差异化,并且消除他们为

对微控制器进行编程时需要维持不同的、互相不兼容标准的需求。这个标准被设计为可以完全升级,

以保证它适用于所有Cortex-M处理器系列微控制器,包括从最小的8KB设备到带有复杂通讯外设的设

备,例如以太网或者USB-OTG(CMSIS对核心外设接入层的代码存储要求小于1KB,RAM存储要求小

于10比特)。

 ARM计划未来为CMSIS添加一个中间件访问层,能够为以太网、SD/MMC提供标准软件接口,同

时为实时操作系统kernel(RTOS Kernel)进行持续的、kernel-aware的调试提供一个调试接口,这一

对CMSIS的扩展将会简化基于Cortex的新微控制器标准中间件的配置。

CMSIS以一整套的文件形式提供,可以整合到设备使用手册中。CMSIS可以免费在www.onARM.

com网站下载,这是一个为嵌入式开发者提供全面资源的网站。CMSIS文件和软件层维护将由 ARM提

供。

5.27.2 相关编译器简介

目前国内开发Cortex-M3主流的编译器主要是KEIL公司的MDK以及IAR公司的 IAR Embedded

Workbench for ARM,读者可以从www.keil.com和www.iar.com获取两种开发工具的体验版。用户

可参考相关数据获取两种 IDE更为详细的操作说明。因本文篇幅有限,不再深入讲解如何使用两种

IDE。

Page 160: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 160/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

160

附录一 MCU开发资源总汇

一、官网大全

1、恩智浦官方网站 www.nxp.com

2、恩智浦应用资讯站  www.nxpchina.com

3、恩智浦MCU资源频道 www.standardics.nxp.com/microcontrollers

4、恩智浦32位MCU最新信息 www.nxp.com/campaigns/experience_mcuoptions

5、恩智浦MCU应用指南大全 http://www.standardics.nxp.com/support/documents/

microcontrollers/

6、周立功单片机 www.zlgmcu.com

7、品佳集团官网 www.sacg.com.tw

8、Keil官网 www.keil.com

9、 ARM Realview开发工具官网 www.realview.com.cn

10、 ARM官网 www.arm.com

11、英蓓特信息技术 www.embedinfo.com

12、麦克泰技术 www.bmrtech.com

二、专业网站、MCU开发博客信息

1、电子创新网 www.eetrend.com

2、电子工程专辑 www.eetchina.com

3、电子设计技术 www.ednchina.com

4、电子系统设计 www.ed-china.com

5、21IC中国电子网 www.21ic.com

6、电子产品世界 www.eepw.com.cn

7、老古开发网 www.laogu.com

8、中电网 www.eccn.com 

9、嵌入式在线 www.mcuol.com

Page 161: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 161/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

161

附录二 编委信息与后记

在众多编委的努力和协作下,《32 位MCU开发全攻略》经过 3个月的编撰终于和大家见面了,在

此特别向参与此书编撰的编委们表示衷心地感谢,她(他)们是:

陈劼 恩智浦市场传讯经理

王朋朋 恩智浦微控制器项目经理

王超 恩智浦资深应用工程师

陆军 恩智浦资深应用工程师

王维 恩智浦微控制器产品市场助理经理

白延敏 南京航空航天大学

牛晓东 上海丰宝电子有限公司

随着32位MCU应用升温,本土工程师需要掌握必要的基础知识,《32 位MCU开发全攻略》从基

础知识起步,以恩智浦MCU为实例,讲解了32位MCU开发的实用知识,希望这本电子书能给MCU开发

者带来实际的帮助!也欢迎工程师朋友就MCU开发需求与我们交流,以便我们可以开发后续版本提供

更好的内容,提升本土MCU应用创新水平!

再次感谢大家的支持!

张国斌

《32位MCU开发全攻略》主编

  [email protected]

Page 162: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 162/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

162

附录三 版权声明

1、《32位MCU开发全攻略》著作权属于张国斌等编委共同所拥有;

2、本着服务大众的思想,我们授权任何对MCU开发有兴趣的工程师或媒体免费下载并自由复

制、传播该书;

3、非经作者(张国斌为代表)书面同意,不可以对本电子书加以切割、编辑及部分内容传播;

4、任何商业用途必须得到作者(张国斌为代表)的书面同意。

5、作者联系方式:[email protected]

Page 163: 《32位MCU开发全攻略》(上)

7/16/2019 32 MCU

http://slidepdf.com/reader/full/32mcu 163/163

32位MCU开发全攻略--工程师创新宝典  上册 基础篇

附录四 参考文献

1、 ARM原理与嵌入式应用 桂电-丰宝联合实验室编者 电子工业出版社 2008

2、嵌入式技术及其应用 方尔正,王燕 编著 哈尔滨工业大学出版社 2008

3、周立功单片机网站:www.zlgmcu.com

4、维基百科网站:zh.wikipedia.org