译者序
从2008年开始,基于CortexM3的单片机以其高性能、低成本及易于使用等诸多优势,已经取代ARM7,成长为32位微控制器的主流。而且由于其诸多特性,之前“ARM9+OS”(如“ARM9+Linux”等)的多种方案,目前也可以由“CortexM3+嵌入式OS”的方式取代。
支持CortexM3的芯片厂家也在日益增多,包括ST、TI、Atmel等在内的芯片巨头都有多款基于CortexM3的微控制器产品,而且具有Flash及内存大小、外设以及运行频率等,这也使得我们的选择更加广泛。利用一定的程序架构,我们可以开发出基于多种硬件平台的程序,为产品提供了更多的保障。
在平常工作中,我接触最多的就是CortexM3了,从最开始的STM32,到后来TI、Atmel以及Fujitsu等多家的CortexM3单片机,使用过程中体会最深的就是芯片的高性能和易用性。
在以往编写8位机的代码时,为了保证任务的正确执行,我们可能还要考虑代码的执行速度能否满足任务的需求; 而对于CortexM3,由于芯片本身的性能及编译器的效率,一般情况下,我们无须为执行时间而优化代码,编写单片机的代码就如同计算机程序一样方便。
另外,尽管这些单片机都具有诸多外设以及众多控制和状态寄存器,要透彻了解它们,需要花费一定的时间。幸运的是,厂家一般都提供了丰富的底层驱动库,结合开发工具提供的工程实例,我们无须在底层代码上花费太多时间,从而可以专注于应用功能的实现。由于这些单片机都具有相同的内核架构,因此只要熟悉了其中的一个产品,其他产品也就能很快上手。
在所有介绍CortexM3的书籍中,本书无疑是最经典的一本。一方面,作者本身就是ARM公司的专家,了解CortexM3架构的设计; 另一方面,作者选取的角度非常合适,既有架构设计的细节,也有程序代码实现的实例,而且对容易出现问题的地方进行了说明。另外,由于CortexM3处理器版本的更新,本书作为第2版,也对上一版的内容进行了大量修改和补充。
由于本书内容丰富,无论你是新手还是熟练开发人员,都可以从中找到有用的信息。限于译者水平,疏漏之处敬请批评指正。最后,希望这本书能给读者带来帮助。
吴常玉2014年5月
推荐序(一)
从本书第1版出版开始,ARM微控制器大家庭的成员不断增加,这已经极大地超出了我们的预计,而且毫不夸张地说,这也是微控制器单元(MCU)领域的革命。成千上万的终端用户都在使用基于ARM的MCU,它也成为市场上增长最快的MCU技术。Joseph编写的《ARM CortexM3权威指南(第2版)》非常及时,可以提供MCU技术的最新信息。
整体来看,我们在许多方面都取得了巨大的进步,其中包括生产基于CortexTMM3处理器器件的合作伙伴的数量(目前已超过30家)。Cortex微控制器软件接口标准(CMSIS)的发展简化了Cortex处理器和芯片供应商之间的产品的代码移植,而且CortexM0处理器的发布也进一步降低了ARM MCU的成本。
由于目前的巨大变化,现在开发基于CortexM3处理器的嵌入式方案非常令人振奋!
Richard York
(英)ARM产品市场总监
推荐序二
微控制器编程人员本来就是很灵活的一个群体,从一个确定设计方案出发,他们可以通过某种特定的方式创造出令人惊异的新产品。一般来说,他们需要精确计算,最大限度地节省系统设计。要施展这种魔法,所需要的最主要的元素为工具链环境,也正是因为这个原因,ARM自己的工具链部门人员才会同CPU设计者一道,设计出合理、简化以及优化的ARM7TDMI处理器。
作为这种组合的产物,ARM CortexTMM3的出现,标志着ARM架构取得了令人兴奋的发展。该设备在融合了32位ARM架构最优的特性以及非常成功的Thumb2指令集设计的同时,还增加了许多新的功能。尽管进行了这些修改,CortexM3还是保留了为人熟知的简单编程模型。
Wayne Lyons
(英)ARM嵌入式方案技术总监
前言
本书适合对ARM CortexTMM3处理器感兴趣的软件和硬件工程师阅读,《CortexM3技术参考手册》(CortexM3 Technical Reference Manual,TRM)和《ARMv7M架构应用层参考手册》(ARMv7M Architecture Application Level Reference Manual)已经提供了本处理器的许多信息,但它们涉及了太多细节,可能不太适合新手。
本书适合编程人员、嵌入式产品设计人员、片上系统(SoC)工程师、电子爱好者、研究人员以及对CortexM3感兴趣且有微控制器或微处理器使用经验的其他人员。文中系统介绍了架构、指令集描述、指令实例、硬件特性以及处理器高级调试系统,还提供了大量应用程序实例,包括使用ARM工具以及GNU工具链开发CortexM3软件的基本步骤。若工程师要将软件从ARM7TDMI移植到CortexM3处理器上,本书也非常适合,因其涉及两个处理器间的差异以及从ARM7TDMI到CortexM3的应用程序软件移植。
Joseph Yiu
致谢
感谢以下朋友,他们给我提供了帮助、指导以及对本书第2版如何改进的宝贵建议:
Richard York、Andrew Frame、Reinhard Keil、Nick Sampays、Dev Banerjee、Robert Boys、Dominic Pajak、Alan Tringham、Stephen Theobald、Dan Brook、David Brash、Haydn Povey、Gary Campbell、Kevin McDermott、Richard Earnshaw、Shyam Sadasivan、Simon Craske、Simon Axford、Takashi Ugajin、Wayne Lyons、Samin Ishtiaq以及Simon Smith。
感谢National Instruments(美国国家仪器公司)的Ian Bell和Jamie Brettle的支持,他们帮我检查了涉及NI LabVIEW的材料。还要感谢CodeSourcery 的Carlos ODonell、Brian Barrera和Daniel Jacobowitz的支持,他们帮我检查了涉及CodeSourcery工具链软件开发的材料。当然,还要感谢Elsevier的工具人员,有了他们专业的工作,本书才得以顺利出版。
最后,感谢Peter Cole和Ivan Yardley在本书编写过程中给予的建议和支持。
Joseph Yiu
本书约定
本书在印刷时遵循如下的诸多约定:
(1) 普通汇编程序代码:
MOV R0, R1; 将寄存器R1中的数据送到R0中
(2) 汇编代码语法中,<>中的内容要用实际的寄存器名代替:
MRS reg, special_reg
(3) C程序代码:
for (i=0;i3;i++) { func1(); }
(4) 伪代码:
if (a b) { …
(5) 数据:
① 4’hC和 0x123都是16进制数值;
② #3表示3号项目(如IRQ#3表示编号为3的IRQ);
③ #immed_12表示12位立即数。
(6) 寄存器位:
一般表示基于位所在位置的部分数据值,bit[15∶12]表示15位到12位。
(7) 寄存器访问类型如下:
① R为只读;
② W为只写;
③ R/W为可读可写;
④ R/Wc为可读,且可被写访问清除。
术语和缩写
缩写含义
ADK AMBA设计套件
AHB 高级高性能总线
AHBAP AHB访问端口
AMBA 高级微控制器总线架构
APB 高级外设总线
ARM TRM ARM架构参考手册
ASIC 专用集成电路
ATB 高级跟踪总线
BE8 字节不变大端模式
CMSIS Cortex微控制器软件接口标准
CPI 周期指令比
CPU 中央处理单元
CS3 CodeSourcery通用启动代码序列
DAP 调试访问端口
DSP 数字信号处理器/数字信号处理
DWT 数据监视点和跟踪单元
EABI/ABI 嵌入式应用程序二进制接口
ETM 嵌入式跟踪宏单元
FPB Flash补丁和断点单元
FPGA 现场可编程门阵列
FSR 错误状态寄存器
HTM CoreSight AHB跟踪宏单元
ICE 在线仿真器
IDE 集成开发环境
IRQ 中断请求(一般指外部中断)
ISA 指令集架构
ISR 中断服务程序
ITM 指令跟踪宏单元
JTAG 联合测试行动小组(一种测试/调试接口标准)
JTAGDP JTAG调试端口
LR 链接寄存器
LSB 最低位
LSU 加载/存储单元
MCU 微控制器单元
MDKARM Keil ARM微控制器开发套件
MMU 存储器管理单元
MPU 存储器保护单元
MSB 最高位
MSP 主栈指针
NMI 不可屏蔽中断
NVIC 嵌套向量中断控制器
OS 操作系统
PC 程序计数器
PMU 电源管理单元
PSP 进程栈指针
PPB 私有外设总线
PSR 程序状态寄存器
SCB 系统控制块
SCS 系统控制空间
SIMD 单指令,多数据
SoC 片上系统
SP 栈指针
SRPG 状态保持功率门
SW 串行线
SWDP 串行线调试端口
SWJDP 串行线JTAG调试端口
SWV 串行线查看(TPIU的一种操作模式)
TCM 紧密耦合存储器(CortexM1特性)
TPA 跟踪端口分析仪
TPIU 跟踪端口接口单元
TRM 技术参考手册
UAL 统一汇编语言
UART 通用异步接收/发送装置
WIC 唤醒中断控制器