图书前言

译者序

在现代社会,我们周围到处都能看到微控制器(微处理器)的身影,它们广泛应用于家用电器、汽车电子以及工业控制等各个领域,无时无刻不在影响着我们的生活。目前,市场上微控制器(微处理器)种类繁多,而ARM处理器无疑是其中的一朵奇葩,在我们日常使用的手机、平板电脑等设备中都能看到ARM处理器的身影。从ARM7、ARM9到Cortex系列,ARM给我们带来了一次次的惊喜。本书介绍的CortexM0处理器就是一款优秀的产品,它集高性能、低成本、低功耗等多种优势于一身,为开发者提供了更多的选择。

从最初的8051、ARM7到今天的CortexM0和CortexM3等处理器,译者使用微控制器(微处理器)已经超过了10年,得出的经验是——要想学习好微控制器(微处理器),熟练进行开发,就应该多看、多想和多练。

多看就是要多了解微控制器(微处理器)开发的相关知识,对于初学者而言,这不应仅仅是器件手册加指令集或者C语言,还应该包括模拟和数字电路等硬件相关内容、操作系统以及算法设计等。正所谓“他山之石可以攻玉”,丰富的知识结构对微控制器(微处理器)开发大有裨益,可以减少在编程过程中可能出现的错误,提高产品研发效率。

多想就是在学习过程中要开动脑筋,多问些为什么。只有这样,学习知识才能深入,才能融会贯通。实际工作中也是一样,解决一个问题可以有一种通用的方法,也可以想一下是否可以有其他更简单、更具效率的方法,好的思路既可以降低程序错误的风险,也可以缩短开发时间、提高工作效率。

多练就是要学以致用,在实际产品开发中锻炼自己。微控制器(微处理器)本身就是面向应用的,没有实际操作过硬件,是很难提高的。目前,市场上的开发板和开发工具琳琅满目,而且价格低廉,使用仿真器连接计算机和开发板,就可以建立自己的开发环境。只有实际操作过,才能将理论应用于实际,才能感受到第一次点亮LED或者将数据打印到计算机上所带来的喜悦。

在翻译本书的过程中,遵循了以下原则: ①尽量使用短句,方便读者阅读; ②忠实原文,传达技术真意; ③专业术语使用中英对照,减少阅读同类文档时带来的差异; ④文中涉及的参考文档提供了中英对照,便于读者理解和查找。

本书的内容涵盖了多个方面,既有简单的微控制器操作和程序实例,又有微控制器的内部原理和实现细节,相信无论你是新手还是熟练开发人员,都可以从本书中找到有用的信息。限于译者水平,疏漏之处敬请批评指正,最后希望这本书能给读者带来帮助。

对于微控制器使用者,现在是让人非常兴奋的时期,各家供应商推出的ARM CortexM设备的种类越来越多,而且应用范围也越来越广泛。许多使用8位和16位控制器的用户转而使用基于ARM CortexM的设备,自从引入了ARM CortexM0,他们都很惊讶于这些32位设备的容易使用,而且性价比极高。

因此,我很高兴Joseph Yiu为用户写了这样一本ARM CortexM0设备指南,作为之前的8位机用户以及ARM CortexM家族的权威专家,Joseph在指导新用户接触ARM Cortex微控制器,以及给高级用户分享CortexM0的细节知识方面,确实有独到之处。

Dominic Pajak博士ARM CortexM0产品经理

前言

我是在大学时开始学习微控制器的,那时我使用的单板计算机有些还是8位微控制器,程序存储在外部可擦除可编程的只读存储器中(EEPROM)。EEPROM使用相对比较大的双列直插封装(DIP),它可以通过玻璃窗里的紫外线擦除。从那时起,微控制器技术发生了很大变化: 外部EEPROM被片上Flash存储器代替,DIP也变成了表面贴装,而且多数微控制器是在系统可重复编程的。越来越多的外设被加到微控制器中来,软件的复杂度也显著地提高了。

从2004年起,微控制器市场发生了很大的变化,之前,市场上的微控制器基本上都是8位和16位的,32位微控制器受成本所限,主要用于高端产品。尽管多数8位和16位微控制器可以使用C编程,而试图将所有的所需功能整合到一个小的微控制器中却变得越来越困难。你可能需要1天时间来写C程序,然后发现由于微控制器的处理速度太慢,无法应对所需的处理任务,你还得花两天时间用汇编重写部分程序。

即便你在开发简单的应用程序,对微控制器的处理能力没有很高的要求,而由于项目的需要,你可能需要偶尔使用另外一种架构的微控制器,这可能会花费一定的工夫。你不但需要花钱购买新的工具,还得用上几周的时间学习使用开发工具,以及数月的时间熟悉新的架构。

2004年10月,ARM7微控制器的价格降到了3美元以内,对于那些需要开发复杂的嵌入式软件的用户来说,这是一个很好的消息。从那时起,随着CortexM3的推出,ARM微控制器的价格进一步下降,现在你用1美元就足以买到一个ARM微控制器了。因此,ARM微控制器为越来越多的人所接受。除了可以提供极佳的性能以外,现代的ARM微控制器具备极低的功耗,已经不再局限于高端应用了。

和许多好的想法一样,CortexM0的理念开始于酒吧里工程师间的对话。一些ARM合作伙伴在寻找一种很小的32位处理器,这个想法很快就成为了一个成熟的项目(代号为Swift)。2009年,CortexM0的设计完成,它很快就成为了最成功的ARM处理器产品之一。

通过本书中的例子,你会发现CortexM0微控制器非常易于使用。在有些方面,由于线性存储器架构的简化,简单却灵活的异常模型,易于理解的调试特性以及ARM公司、微控制器和软件方案供应商提供的各种软件程序,它们甚至比8位机还要简单。

由于CortexM处理器是非常C友好的,用汇编优化代码是没有必要的,而且编写中断处理也不用许多特殊的C伪指令。对于有些嵌入式开发者来说,切换到ARM微控制器也就意味着在微控制器之间的切换将会更加简单,因为他们无须再购买新的开发工具和学习新的架构了。在网上你可以发现许多人已经开始使用CortexM0微控制器,并开发了许多有趣的项目。

在开发了多个ARM处理器的项目之后,我也逐渐获得了一些使用CortexM处理器的经验(可能还有些白发)。在得到许多朋友的鼓励和帮助后,我决定将这些经验写在一本书中,并且和那些使用ARM CortexM处理器的嵌入式开发者分享。在写第一本书的时候我学到了很多东西,那本书是关于CortexM3处理器的。在第一本书出版以后,我收到了很多读者非常有价值的反馈信息(有些甚至不是关于ARM的),我对这些读者表示感谢。我知道自己的作品并不完美,但欣慰的是许多读者发现我撰写的有关CortexM3的书Joseph Yiu撰写的经典图书《The Definitive Guide to the ARM CortexM3, Second Edition》和《The Definitive Guide to ARM CortexM3 and CortexM4 Processors,Third Edition》。——编辑注的价值,并且期待《ARM CortexM0权威指南》将会更好。

本书面向的读者包括学生、开发爱好者、嵌入式软件开发者、研究人员,甚至是半导体产品工程师; 因此,本书涵盖的信息非常广泛,包括大多数嵌入式开发者都会觉得有用的大量高级技术细节。同时,书中还有许多实例,可供嵌入式软件开发新手使用。

希望本书对你有用,并希望你可以在下一个项目中找到使用CortexM0的乐趣!

Joseph Yiu

致谢

在本书的调查和书写过程中,我得到了许多人的帮助。

首先感谢我在ARM公司的同事,他们对本书进行了检查并提出了改进的建议,尤其是Edmund Player、Nick Sampays和Dominic Pajak,以及Drew Barbier、Colin Jones 、Simon Crakes、Jon Marsh和Robert Boys。

我还要感谢其他公司的朋友,这些朋友的意见帮助我改进了本书中技术信息的质量,他们是NXP的Joe Yu和Kenneth Dwyer,Glasgow University的John Davies,以及Triad Semiconductor的Jeffrey S. Mueller。除了那些在出版前对本书进行审校的人,我还要感谢下面的这些人,他们在本书写作过程中对我的技术问题进行了解答并提供了产品信息,他们是NXP的Kenneth Dwyer、David Donley和Amit Bhojraj,ARM的Drew Barbier,Keil的Milorad Cvjetkovic,Triad Semiconductor的Jeffrey S. Mueller、William Farlow和Jim Kemerling,National Instruments的Jamie Brettle,Code Red Technologies的Derek Morris,CodeSourcery的Brian Barrera,以及Rowley Associates、Steinert Technologies、IAR Systems和TASKING的销售团队。

我还要感谢Elsevier的工作人员,本书的出版有赖于他们专业的工作。

最后,非常感谢我工作和生活中的朋友,有了他们不遗余力的鼓励,本书才得以开始并完成。

Joseph Yiu

本书约定

本书写作约定如下: 

(1) 普通汇编程序代码: 

MOVR0, R1;将数据从寄存器R1送到寄存器R0中

(2) 汇编程序语法(“<>”中的内容需要被实际的寄存器名代替): 

MRSreg, special_reg 

(3) C程序代码: 

for (i = 0; i  3; i++) {func1(); }

(4) 数值: 

 4′hC、0x123都是16进制数值; 

#3表示3号条目(如IRQ#3表示编号为3的IRQ); 

#immed_12表示12位立即数; 

寄存器位主要用于表示基于位的一部分数值,例如bit[15:12]表示15到12位。

(5) 寄存器访问类型: 

R为只读; 

W为只写; 

R/W为可读可写; 

R/Wc表示可读,可被写操作清除。

缩写术语

缩写含义

AAPCSARM架构过程调用标准

AHB高级高性能总线

ALU算术逻辑单元

AMBA高级微控制器总线架构

ARM ARMARM架构参考手册

BE8字节不变大端模式

BPU断点单元

CMOS互补金属氧化物半导体

CMSISCortex微控制器软件接口标准

DWT数据监视点和跟踪单元

EXC_RETURN异常返回

FPGA现场可编程门阵列

gccGNU C编译器

ICE在线仿真器

IDE集成开发环境

ISA指令集架构

ISR中断服务程序

JTAG联合测试行动小组(一种标准测试和调试接口)

LR链接寄存器

LSB最低位

MCU微控制器单元

MDK/MDKARMARM Keil微控制器开发套件

MSB最高位

MSP主栈指针

NMI不可屏蔽中断

NVIC嵌套向量中断控制器

OS操作系统

PC程序计数器

PSP进程栈指针

PSR/xPSR程序状态寄存器

RVDSARM RealView开发组件

RTOS实时操作系统

RTXKeil实时执行内核

SCB系统控制块

SCS系统控制空间

TAP测试访问端口

TRM技术参考手册

WIC唤醒中断控制器