《ARM Cortex M0权威指南》PDF下载

  • 购买积分:14 如何计算积分?
  • 作  者:(英)JosephYiu著;吴常玉,魏军译
  • 出 版 社:北京:清华大学出版社
  • 出版年份:2013
  • ISBN:9787302330042
  • 页数:434 页
图书介绍:本书系统论述了ARM最新工控嵌入式产品Cortex—M0的体系架构与编程,适合作为从事嵌入式开发的研究生及工程技术人员阅读;本书作者未ARM公司资深硬件架构师,图书在亚马逊销量较好,五星级图书。

第1章 绪论 1

1.1 为什么要选择Cortex-M0 1

1.1.1 能耗效率 1

1.1.2 代码密度 1

1.1.3 易于使用 2

1.2 Cortex-M0处理器的应用 2

1.3 ARM和ARM处理器的背景 3

1.4 Cortex-M0处理器说明和ARM体系结构 5

1.5 ARM处理器和ARM生态系统 8

1.6 开始使用Cortex-M0处理器 9

1.7 本书的结构和资源 9

第2章 Cortex-M0技术综述 10

2.1 Cortex-M0处理器简介 10

2.2 ARM Cortex-M0处理器的特性 11

2.2.1 系统特性 11

2.2.2 应用特性 12

2.2.3 调试特性 12

2.2.4 其他特性 13

2.3 Cortex-M0处理器的优势 13

2.3.1 能耗效率 13

2.3.2 8位和16位架构的局限性 15

2.3.3 易于使用,软件可移植 16

2.3.4 选择多样化 16

2.4 低功耗应用 16

2.4.1 门数量低 17

2.4.2 高效率 17

2.4.3 低功耗特性 17

2.4.4 逻辑单元提升 17

2.5 Cortex-M0的软件可移植性 18

第3章 体系结构 19

3.1 概述 19

3.2 系统模型 19

3.2.1 操作模式和状态 19

3.2.2 寄存器和特殊寄存器 20

3.2.3 R0-R12 21

3.2.4 R13,栈指针(SP) 21

3.2.5 R14,链接寄存器(LR) 21

3.2.6 R15,程序计数器(PC) 21

3.2.7 xPSR,组合程序状态寄存器 22

3.2.8 应用程序状态寄存器(APSR)的行为 23

3.2.9 PRIMASK:中断屏蔽特殊寄存器 24

3.2.1 0 CONTROL:特殊寄存器 24

3.3 存储器系统 25

3.4 栈空间操作 26

3.5 异常和中断 27

3.6 嵌套向量中断控制器(NVIC) 28

3.6.1 灵活的中断管理 28

3.6.2 支持嵌套中断 29

3.6.3 向量化的异常入口 29

3.6.4 中断屏蔽 29

3.7 系统控制块(SCB) 29

调试系统 29

3.8 程序映像和启动流程 30

第4章 Cortex-M0编程入门 33

4.1 嵌入式系统编程入门 33

4.1.1 微控制器是如何启动的 33

4.1.2 嵌入式程序设计 34

4.2 输入和输出 37

4.3 开发流程 38

4.4 C编程和汇编编程 41

4.5 什么是程序映像 42

4.5.1 向量表 42

4.5.2 C启动代码 44

4.5.3 程序代码 44

4.5.4 C库代码 45

4.5.5 RAM中的数据 45

4.6 C编程:数据类型 46

4.7 用C语言操作外设 47

4.8 Cortex微控制器软件接口标准(CMSIS) 51

4.8.1 CMSIS介绍 51

4.8.2 CMSIS中有什么是标准化的 52

4.8.3 CMSIS的组织结构 52

4.8.4 使用CMSIS 53

4.9 CMSIS的优势 55

第5章 指令集 57

5.1 ARM和Thumb指令集的背景 57

5.2 汇编基础 59

5.2.1 汇编语法一览 59

5.2.2 后缀的使用 61

5.2.3 Thumb代码和统一汇编语言(UAL) 62

5.2.4 指令列表 62

5.2.5 处理器内移动数据 63

5.2.6 存储器访问 65

5.2.7 栈空间访问 68

5.2.8 算术运算 69

5.2.9 逻辑运算 73

5.2.10 移位和循环操作 74

5.2.11 展开和顺序反转操作 76

5.2.12 程序流控制 78

5.2.13 存储器屏障指令 80

5.2.14 异常相关指令 81

5.2.15 休眠模式特性相关指令 82

5.2.16 其他指令 83

5.3 伪指令 84

第6章 指令集使用实例 85

6.1 概述 85

6.2 程序控制 85

6.2.1 If-Else 85

6.2.2 循环 86

6.2.3 进一步了解跳转指令 86

6.2.4 跳转条件的典型用法 87

6.2.5 函数调用和函数返回 88

6.2.6 跳转表 89

6.3 数据访问 90

6.3.1 简单数据访问 90

6.3.2 使用存储器访问指令的例子 91

6.4 数据类型转换 93

6.4.1 数据大小的转换 93

6.4.2 大小端转换 94

6.5 数据处理 94

6.5.1 64位/128位加法 94

6.5.2 64位/128位减法 95

6.5.3 整数除法 95

6.5.4 无符号整数开方根 97

6.5.5 位和位域运算 98

第7章 存储器系统 100

7.1 概述 100

7.2 存储器映射 101

7.3 程序存储器,Boot Loader和存储器重映射 104

7.4 数据存储器 105

7.5 支持小端和大端 106

7.5.1 数据类型 107

7.5.2 硬件行为对编程的影响 108

7.5.3 数据对齐 108

7.5.4 访问非法地址 109

7.5.5 多寄存器加载和存储指令的使用 109

7.6 存储器属性 110

第8章 异常和中断 112

8.1 什么是异常和中断 112

8.2 Cortex-M0处理器的异常类型 112

8.2.1 不可屏蔽中断(NMI) 113

8.2.2 硬件错误 113

8.2.3 SVC(请求管理调用) 113

8.2.4 PendSV(可挂起的系统调用) 113

8.2.5 系统节拍 114

8.2.6 中断 114

8.3 异常优先级定义 114

8.4 向量表 116

8.5 异常流程概述 117

8.5.1 接受异常请求 117

8.5.2 压栈和出栈 117

8.5.3 异常返回指令 118

8.5.4 末尾连锁 118

8.5.5 延迟到达 119

8.6 EXC_RETURN 119

8.7 异常入口流程的细节 121

8.7.1 压栈 121

8.7.2 取出向量并更新PC 123

8.7.3 寄存器更新 123

8.8 异常退出流程的细节 123

8.8.1 寄存器出栈 123

8.8.2 从返回地址取值并执行 123

第9章 中断控制和系统控制 125

9.1 NVIC和系统控制块特性 125

9.2 中断使能和清除使能 125

9.3 中断挂起和清除挂起 127

9.4 中断优先级 128

9.5 中断控制的通用汇编代码 130

9.5.1 使能和禁止中断 130

9.5.2 设置和清除中断挂起状态 131

9.5.3 设置中断优先级 132

9.6 异常屏蔽寄存器(PRIMASK) 133

9.7 中断输入和挂起行为 134

简单的中断处理 134

9.8 中断等待 137

9.9 系统异常的控制寄存器 138

9.10 系统控制寄存器 140

9.10.1 CPU ID基址寄存器 140

9.10.2 应用中断和复位控制寄存器 140

9.10.3 配置和控制寄存器 142

第10章 支持操作系统的特性 143

10.1 支持操作系统的特性概述 143

为什么要使用嵌入式操作系统 143

10.2 SysTick定时器 145

10.3 SysTick寄存器 145

10.3.1 设置SysTick 147

10.3.2 SysTick用于时间测量 148

10.4 进程栈和进程栈指针 148

10.5 SVC 152

10.6 PendSV 153

第11章 低功耗特性 155

11.1 低功耗嵌入式系统概述 155

11.2 Cortex-M0处理器的低功耗优势 156

11.3 低功耗特性概述 157

11.4 休眠模式 158

11.5 等待事件(WFE)和等待中断(WFI) 160

11.5.1 等待事件(WFE) 160

11.5.2 等待中断(WFI) 161

11.5.3 唤醒条件 162

11.6 退出休眠特性 164

11.7 唤醒中断控制器 165

第12章 错误处理 167

12.1 错误异常概述 167

错误是怎么发生的 167

12.2 分析错误 168

12.3 意外切换至ARM状态 169

12.4 实际应用中的错误处理 170

12.5 锁定 172

12.5.1 锁定的原因 172

12.5.2 锁定期间发生了什么 173

12.6 防止锁定 173

第13章 调试特性 175

13.1 软件开发和调试特性 175

13.2 调试特性一览 176

13.3 调试接口 176

13.4 暂停模式和调试事件 179

13.5 调试系统 180

第14章 Keil MDK入门 182

14.1 Keil MDK介绍 182

14.2 使用Keil MDK的第一步 183

14.2.1 创建Blinky工程 183

14.2.2 创建工程代码 185

14.2.3 工程设置 190

14.2.4 编译和建立程序 194

14.2.5 使用调试器 195

14.3 其他的工程配置 197

14.3.1 目标,源文件组 197

14.3.2 编译器和代码生成选项 198

14.3.3 模拟器 199

14.3.4 在RAM中运行 201

14.4 定制Keil中的启动代码 204

14.5 使用Keil中的分散加载特性 204

第15章 简单应用程序开发 206

15.1 使用CMSIS 206

15.2 将SysTick用作单发定时器 209

15.3 UART示例 211

15.3.1 简单的输入和输出 211

15.3.2 重定向 214

15.3.3 开发自己的输入和输出函数 219

15.4 简单中断编程 222

15.4.1 中断编程概述 222

15.4.2 度盘控制接口实例 223

15.4.3 中断控制函数 229

15.5 CMSIS的不同版本 231

第16章 汇编工程和C与汇编混合工程 233

16.1 用汇编开发工程 233

16.2 汇编编程的建议规则 233

16.3 汇编函数的结构 235

16.4 简单的汇编工程实例 236

16.5 为变量分配数据空间 244

16.6 用汇编实现UART 246

16.7 其他的文字输出函数 247

复杂的跳转处理 249

16.8 混合语言工程 249

16.8.1 在汇编中调用C函数 250

16.8.2 在C代码中调用汇编函数 250

16.9 嵌入汇编 251

16.10 使用特殊指令 252

16.11 习语识别 253

第17章 在编程中使用低功耗特性 255

17.1 概述 255

17.2 Cortex-M0处理器的休眠模式回顾 255

17.3 在程序中使用WFE和WFI 256

17.4 使用挂起发送事件特性 257

17.5 使用退出休眠特性 258

17.6 唤醒中断控制器(WIC)特性 259

17.7 事件通信接口 260

17.8 开发低功耗应用程序 262

17.9 LPC111x的低功耗特性使用示例 263

第18章 使用SVC、PendSV和Keil RTX Kernel 272

18.1 概述 272

18.2 使用SVC异常 272

18.3 使用PendSV异常 276

18.4 使用嵌入式OS 278

18.5 Keil RTX实时内核 278

18.6 OS启动流程 280

18.6.1 简单的OS实例 281

18.6.2 任务间通信 284

18.6.3 事件通信 285

18.6.4 互斥体 287

18.6.5 信号量 288

18.6.6 信箱消息 289

18.6.7 周期时间间隔 292

18.6.8 其他的RTX特性 294

18.6.9 应用程序实例 294

第19章 ARM RealView开发组件入门 299

19.1 概述 299

19.2 简单的应用程序实例 300

19.3 使用分散加载文件 303

19.4 用C实现的含有向量表的实例 304

19.5 在RVDS中使用MicroLIB 308

19.6 在RVDS中使用汇编进行应用程序开发 309

19.7 Flash编程 311

19.8 使用RealView调试器进行调试 312

19.9 使用RealView调试器的串行线调试 317

19.10 RVDS中的重定向 319

第20章 GNU C编译器入门 321

20.1 概述 321

20.2 典型的开发流程 322

20.3 简单的C程序开发 323

20.4 CodeSourcery通用启动代码 326

20.5 使用用户定义的向量表 327

20.6 在gcc中使用Printf 331

20.7 内联汇编 332

20.8 gcc中的SVC实例 333

20.9 硬件错误异常实例 336

20.10 Flash编程和调试 339

第21章 软件移植 340

21.1 概述 340

21.2 ARM处理器 340

21.3 ARM7TDMI和Cortex-M0之间的差异 341

21.3.1 操作模式 341

21.3.2 寄存器 341

21.3.3 指令集 343

21.3.4 中断 343

21.4 从ARM7TDMI向Cortex-M0移植软件 343

21.4.1 启动代码和向量表 343

21.4.2 中断 344

21.4.3 C程序代码 344

21.4.4 汇编代码 345

21.4.5 原子操作 345

21.4.6 优化 345

21.5 Cortex-M1和Cortex-M0之间的差异 346

21.5.1 指令集 346

21.5.2 NVIC 346

21.5.3 系统级特性 346

21.6 在Cortex-M0和Cortex-M1之间移植软件 346

21.7 Cortex-M3和Cortex-M0之间的差异 347

21.7.1 系统模型 347

21.7.2 NVIC和异常 347

21.7.3 指令集 349

21.7.4 系统级特性 349

21.7.5 调试特性 350

21.8 在Cortex-M0和Cortex-M3之间移植软件 350

21.9 在Cortex-M0和Cortex-M4处理器之间移植软件 351

21.10 从8位机/16位机往Cortex-M0移植程序 353

21.10.1 通用改动 353

21.10.2 存储器需求 354

21.10.3 8位机和16位机不再适用的优化 355

21.10.4 实例:从8051移植到ARM Cortex-M0 355

第22章 Cortex-M0产品 358

22.1 概述 358

22.2 微控制器产品和专用标准产品(ASSP) 358

22.2.1 NXP Cortex-M0微控制器 358

22.2.2 NuMicro微控制器 359

22.2.3 Mocha-1 ARM Cortex-M0可配置阵列 360

22.2.4 Melfas MCS-7000系列触摸屏控制器 361

22.3 编译器和软件开发组件 361

22.3.1 Keil微控制器开发套件(MDK) 361

22.3.2 TASKING VX-Toolset for ARM 362

22.3.3 IAR Embedded Workbench for ARM 362

22.3.4 CrossWorksforARM 362

22.3.5 Red Suite 362

22.3.6 LabVIEW C代码生成器 363

22.4 开发板 365

22.4.1 LPCXpresso 365

22.4.2 IAR的LPC1114入门套件 365

22.4.3 LPC1114 Cortex-M0模块 365

22.4.4 Keil Cortex-M0开发板 366

附录A Cortex-M0指令集 367

附录B Cortex-M0异常类型快速参考 371

B.1 异常类型 371

B.2 异常压栈后的栈内容 371

附录C 软件接口标准(CMSIS)快速参考 373

C.1 数据类型 373

C.2 异常枚举 373

C.3 NVIC操作函数 374

C.4 系统和SysTick操作函数 376

C.5 内核寄存器操作函数 376

C.6 特殊指令操作函数 377

附录D NVIC、SCB以及SysTick寄存器快速参考 378

D.1 NVIC寄存器一览 378

D.2 中断设置使能寄存器(NVIC—>ISER) 378

D.3 中断清除使能寄存器(NVIC—>ICER) 378

D.4 中断设置挂起寄存器(NVIC—>ISPR) 379

D.5 中断清除挂起寄存器(NVIC—>ICPR) 379

D.6 中断优先级寄存器(NVIC—>IRP[0]到NVIC—>IRP[7]) 379

D.7 SCB寄存器一览 380

D.8 CPU ID基地址寄存器(SCB—>CPUID) 380

D.9 中断控制状态寄存器(SCB—>ICSR) 381

D.10 应用中断和控制状态寄存器(SCB—>AIRCR) 381

D.11 系统控制寄存器(SCB—>SCR) 382

D.12 配置控制寄存器(SCB—>CCR) 382

D.13 系统处理优先级寄存器2(SCB—>SHR[0]) 383

D.14 系统处理优先级寄存器3(SCB—>SHR[1]) 383

D.15 系统处理控制和状态寄存器 383

D.16 SysTick寄存器一览 383

D.17 SysTick控制和状态寄存器(SysTick—>CTRL) 384

D.18 SysTick重装载值寄存器(SysTick—>LOAD) 384

D.19 SysTick当前值寄存器(SysTick—>VAL) 384

D.20 SysTick校准值寄存器(SysTick—>CALIB) 385

附录E 调试寄存器快速参考 386

E.1 概述 386

E.2 内核调试寄存器 386

E.3 断点单元 388

E.4 数据监视点单元 389

E.5 ROM表寄存器 391

附录F 调试接头分配 394

F.1 10针Cortex调试连接头 394

F.2 20针Cortex调试+ETM接头 394

F.3 老式的20针IDC接头排列 395

附录G CodeSourcery G++Lite的链接器脚本 396

附录H 实例代码文件 401

H.1 system_LPC11xx.c 401

H.2 system_LPC11xx.h 411

H.3 LPC11xx.hs 412

H.4 uart_test.s 418

H.5 RTX_config.c 423

附录I 疑难解答 428

I.1 程序不运行/启动 428

I.1.1 向量表丢失或位置错误 428

I.1.2 使用了错误的C启动代码 428

I.1.3 复位向量中的值错误 428

I.1.4 程序映像没有正确地编程到Flash中 428

I.1.5 错误的工具链配置 429

I.1.6 错误的栈指针初始值 429

I.1.7 错误的大小端设置 429

I.2 程序启动,却进入了硬件错误 429

I.2.1 非法存储器访问 429

I.2.2 非对齐数据访问 429

I.2.3 从总线返回错误 429

I.2.4 异常处理中的栈被破坏 429

I.2.5 程序在某些C函数中崩溃 430

I.2.6 意外地试图切换至ARM状态 430

I.2.7 在错误的优先级上执行SVC 430

I.3 休眠问题 430

I.3.1 执行WFE不进入休眠 430

I.3.2 退出休眠过早地引起休眠 430

I.3.3 中断已经在挂起态时SEVONPEND不工作 430

I.3.4 由于休眠模式可能禁止了某些时钟,处理器无法唤醒 431

I.3.5 竞态 431

I.4 中断问题 432

I.4.1 执行了多余的中断处理 432

I.4.2 执行了额外的SysTick处理 432

I.4.3 在中断处理中禁止中断 432

I.4.4 错误的中断返回指令 432

I.4.5 异常优先级设置的数值 432

I.5 其他问题 433

I.5.1 错误的SVC参数传递方法 433

I.5.2 调试连接受到I/O设置或低功耗模式的影响 433

I.5.3 调试协议选择 433

I.5.4 使用事件输出作为脉冲I/O 433

附录J 实用参考文档 434