第1章 介绍 1
1.1 ARM Cortex-M3处理器是什么 1
1.2 ARM和ARM架构的背景 2
1.2.1 历史简介 2
1.2.2 架构版本 3
1.2.3 处理器命名 5
1.3 指令集开发 6
1.4 Thumb-2技术和指令集架构 7
1.5 Cortex-M3处理器应用 7
1.6 本书的组织结构 8
1.7 深入阅读 8
第2章 Cortex-M3综述 10
2.1 基础 10
2.2 寄存器 11
2.2.1 R0~R12:通用目的寄存器 11
2.2.2 R13:栈指针 11
2.2.3 R14:链接寄存器 12
2.2.4 R15:程序计数器 12
2.2.5 特殊寄存器 12
2.3 操作模式 13
2.4 内置的嵌套向量中断控制器 13
2.4.1 支持嵌套中断 14
2.4.2 支持向量中断 14
2.4.3 支持动态修改优先级 14
2.4.4 中断等待减小 14
2.4.5 中断屏蔽 14
2.5 存储器映射 14
2.6 总线接口 15
2.7 MPU 16
2.8 指令集 16
2.9 中断和异常 17
2.10 调试支持 19
2.11 特点概括 19
2.11.1 高性能 20
2.11.2 中断处理的高级特性 20
2.11.3 低功耗 21
2.11.4 系统特性 21
2.11.5 调试支持 21
第3章 Cortex-M3基础 22
3.1 寄存器 22
3.1.1 通用目的寄存器R0~R7 22
3.1.2 通用目的寄存器R8~R12 22
3.1.3 栈指针R13 22
3.1.4 链接寄存器R14 24
3.1.5 程序计数器R15 25
3.2 特殊寄存器 25
3.2.1 程序状态寄存器 26
3.2.2 PRIMASK、FAULTMASK和BASEPRI寄存器 27
3.2.3 控制寄存器 28
3.3 操作模式 29
3.4 异常和中断 31
3.5 向量表 32
3.6 栈存储操作 32
3.6.1 栈的基本操作 33
3.6.2 Cortex-M3栈的应用 34
3.6.3 Cortex-M3的双栈模型 35
3.7 复位流程 36
第4章 指令集 38
4.1 汇编基础 38
4.1.1 汇编语言:基本语法 38
4.1.2 汇编语言:后缀的使用 39
4.1.3 汇编语言:统一汇编语言 40
4.2 指令列表 41
4.3 指令描述 46
4.3.1 汇编语言:传送数据 47
4.3.2 LDR和ADR伪指令 50
4.3.3 汇编语言:处理数据 51
4.3.4 汇编语言:调用和无条件跳转 54
4.3.5 汇编语言:决断和条件跳转 56
4.3.6 汇编语言:组合比较和条件跳转 59
4.3.7 汇编语言:指令屏障和存储器屏障指令 60
4.3.8 汇编语言:饱和运算 61
4.4 Cortex-M3上一些有用的指令 63
4.4.1 MSR和MRS 63
4.4.2 进一步了解IF-THEN指令块 64
4.4.3 SDIV和UDIV 66
4.4.4 REV、REVH和REVSH 66
4.4.5 位反转 66
4.4.6 SXTB、SXTH、UXTB和UXTH 67
4.4.7 位域清除和位域插入 67
4.4.8 UBFX和SBFX 68
4.4.9 LDRD和STRD 68
4.4.10 表格跳转字节和表格跳转半字 69
第5章 存储器系统 71
5.1 存储器系统特性概述 71
5.2 存储器映射 71
5.3 存储器访问属性 73
5.4 默认的存储器访问权限 75
5.5 位段操作 75
5.5.1 位段操作的优势 78
5.5.2 不同数据宽度的位段操作 81
5.5.3 C程序实现位段操作 81
5.6 非对齐传输 82
5.7 排他访问 84
5.8 端模式 85
第6章 Cortex-M3设计综述 88
6.1 流水线 88
6.2 详细框图 89
6.3 Cortex-M3上的总线接口 92
6.3.1 I-CODE总线 92
6.3.2 D-CODE总线 92
6.3.3 系统总线 92
6.3.4 外部PPB 93
6.3.5 DAP总线 93
6.4 Cortex-M3上的其他接口 93
6.5 外部PPB 94
6.6 典型连接 94
6.7 复位类型和复位信号 95
第7章 异常 97
7.1 异常类型 97
7.2 优先级定义 98
7.3 向量表 103
7.4 中断输入和挂起行为 104
7.5 错误异常 106
7.5.1 总线错误 106
7.5.2 存储器管理错误 107
7.5.3 使用错误 108
7.5.4 硬件错误 109
7.5.5 处理错误 110
7.6 请求管理调用和可挂起的服务调用 111
第8章 嵌套向量中断控制器和中断控制 114
8.1 嵌套向量中断控制器概述 114
8.2 基本的中断配置 114
8.2.1 中断使能和清除使能 115
8.2.2 中断设置挂起和清除挂起 116
8.2.3 优先级 117
8.2.4 活跃状态 117
8.2.5 PRIMASK和FAULTMASK特殊寄存器 118
8.2.6 BASEPRI特殊寄存器 118
8.2.7 其他异常的配置寄存器 119
8.3 设置中断的步骤实例 121
8.4 软件中断 123
8.5 SYSTICK定时器 123
第9章 中断行为 126
9.1 中断/异常流程 126
9.1.1 压栈 126
9.1.2 取向量 127
9.1.3 寄存器更新 127
9.2 异常退出 128
9.3 嵌套中断 128
9.4 末尾连锁中断 128
9.5 延迟到达 129
9.6 进一步了解异常返回值 130
9.7 中断等待 131
9.8 中断相关的错误 132
9.8.1 压栈 132
9.8.2 出栈 132
9.8.3 取向量 132
9.8.4 非法返回 132
第10章 Cortex-M3编程 133
10.1 概述 133
10.2 典型的开发流程 133
10.3 使用C 134
10.3.1 使用RealView开发组件的简单C程序实例 134
10.3.2 使用Keil MDK-ARM编译相同的例程 137
10.3.3 用C访问存储器映射的寄存器 138
10.3.4 内在函数 140
10.3.5 嵌入式汇编和内联汇编 141
10.4 CMSIS 142
10.4.1 CMSIS背景 142
10.4.2 标准化的问题 142
10.4.3 CMSIS的组织结构 143
10.4.4 使用CMSIS 143
10.4.5 CMSIS的优势 145
10.5 使用汇编 146
10.5.1 汇编和C的接口 147
10.5.2 汇编编程的第一步 147
10.5.3 生成输出 148
10.5.4 “Hello World”实例 149
10.5.5 使用数据存储器 153
10.6 在信号量中使用排他访问 153
10.7 在信号量中使用位段 156
10.8 使用位域提取和表格跳转 157
第11章 异常编程 159
11.1 使用中断 159
11.1.1 设置栈 159
11.1.2 设置向量表 160
11.1.3 设置中断优先级 160
11.1.4 使能中断 161
11.2 异常/中断处理 163
11.3 软件中断 165
11.4 向量表重定位实例 166
11.5 使用SVC 168
11.6 SVC实例:在文字消息输出函数中的应用 170
11.7 用C实现SVC 172
第12章 高级编程特性和系统行为 175
12.1 运行具有两个独立栈的系统 175
12.2 双字栈对齐 177
12.3 非基本线程使能 178
12.4 性能考虑 180
12.5 锁定的情况 181
12.5.1 锁定期间发生了什么 182
12.5.2 避免锁定 183
12.6 FAULTMASK 183
第13章 存储器保护单元 184
13.1 概述 184
13.2 MPU寄存器 184
13.3 设置MPU 189
13.4 典型设置 196
第14章 Cortex-M3的其他特性 199
14.1 SYSTICK定时器 199
14.2 电源管理 201
14.2.1 休眠模式 201
14.2.2 退出休眠特性 203
14.2.3 唤醒中断控制器 203
14.3 多处理器通信 205
14.4 自复位控制 209
第15章 调试架构 211
15.1 调试特性概述 211
15.2 CoreSight概述 211
15.2.1 处理器调试接口 212
15.2.2 调试主机接口 212
15.2.3 DP模块、AP模块和DAP 213
15.2.4 跟踪接口 213
15.2.5 CoreSight特点 214
15.3 调试模式 215
15.4 调试事件 217
15.5 Cortex-M3 中的断点 219
15.6 调试时访问寄存器内容 219
15.7 其他的内核调试特性 221
第16章 调试部件 222
16.1 概述 222
16.2 跟踪部件:DWT 223
16.3 跟踪部件:ITM 224
16.3.1 使用ITM的软件跟踪 225
16.3.2 使用ITM和DWT的硬件跟踪 226
16.3.3 ITM时间戳 226
16.4 跟踪部件:ETM 226
16.5 跟踪部件:TPIU 227
16.6 Flash补丁和断点单元 229
16.6.1 断点特性 229
16.6.2 Flash补丁特性 229
16.6.3 比较器 229
16.7 高级高性能总线访问端口 231
16.8 ROM表 232
第17章 Cortex-M3处理器入门 235
17.1 选择一款Cortex-M3产品 235
17.2 开发工具 236
17.2.1 C编译器和调试器 236
17.2.2 嵌入式OS支持 236
17.3 Cortex-M3版本0和版本1之间的区别 238
17.4 Cortex-M3版本1和版本2之间的区别 240
17.4.1 双字栈对齐的默认配置 240
17.4.2 辅助控制寄存器 240
17.4.3 ID寄存器数值更新 241
17.4.4 调试特性 241
17.4.5 休眠特性 241
17.5 版本2新特性的优势和效果 242
17.6 Cortex-M3和Cortex-M0之间的区别 243
17.6.1 编程模型 243
17.6.2 异常和NVIC 243
17.6.3 指令集 244
17.6.4 存储器系统特性 245
17.6.5 调试特性 245
17.6.6 兼容性 245
第18章 ARM7到Cortex-M3的应用程序移植 247
18.1 概述 247
18.2 系统特性 247
18.2.1 存储器映射 247
18.2.2 中断 248
18.2.3 MPU 248
18.2.4 系统控制 249
18.2.5 操作模式 249
18.3 汇编语言文件 250
18.3.1 Thumb状态 250
18.3.2 ARM状态 250
18.4 C程序文件 252
18.5 重编译的目标文件 252
18.6 优化 252
第19章 使用GNU工具链开发Cortex-M3 254
19.1 背景 254
19.2 获得GNU工具链 255
19.3 开发流程 255
19.4 程序实例 256
19.4.1 实例1:第一个程序 256
19.4.2 实例2:链接多个文件 258
19.4.3 实例3:简单的“Hello World”程序 260
19.4.4 实例4:RAM中的数据 261
19.4.5 实例5:C程序 262
19.4.6 实例6:C实现的重定向 265
19.4.7 实例7:编写自己的向量表 267
19.5 访问特殊寄存器 267
19.6 使用不支持的指令 268
19.7 GNU C编译器中的内联汇编 268
第20章 Keil RealView微控制器开发套件入门 270
20.1 概述 270
20.2 μVision入门 270
20.3 通过UART输出“Hello World”消息 275
20.4 软件测试 278
20.5 使用调试器 280
20.6 指令集模拟器 284
20.7 修改向量表 286
20.8 使用CMSIS的秒表中断实例 286
20.9 移植现有程序使用CMSIS 292
第21章 用NI LabVIEW编程Cortex-M3 293
21.1 概述 293
21.2 什么是LabVIEW 293
21.2.1 典型应用领域 294
21.2.2 如何使用LabVIEW和 ARM 295
21.3 开发流程 295
21.4 LabVIEW工程实例 297
21.4.1 创建工程 297
21.4.2 定义输入和输出 297
21.4.3 创建程序 299
21.4.4 构建设计并测试应用程序 300
21.5 LabVIEW如何工作 302
21.6 LabVIEW的其他特性 302
21.7 移植到另外一个ARM处理器 304
附录A Cortex-M3指令集和参考资料 305
A.1 指令集总结 305
A.2 关于指令集介绍 308
A.2.1 操作数 308
A.2.2 使用PC或SP的限制 309
A.2.3 灵活的第二个操作数 309
A.2.4 移位操作 310
A.2.5 地址对齐 312
A.2.6 PC相关语句 313
A.2.7 条件执行 313
A.2.8 指令宽度选择 315
A.3 存储器访问指令 316
A.3.1 ADR 316
A.3.2 LDR和STR,立即数偏移 317
A.3.3 LDR和STR,寄存器偏移 319
A.3.4 LDR和STR,非特权 320
A.3.5 LDR,PC相关 321
A.3.6 LDM和STM 322
A.3.7 PUSH和POP 324
A.3.8 LDREX和STREX 325
A.3.9 CLREX 326
A.4 普通数据处理指令 327
A.4.1 ADD、ADC、SUB、SBC和RSB 328
A.4.2 AND、ORR、EOR、BIC和ORN 330
A.4.3 ASR、LSL、LSR、ROR和RRX 331
A.4.4 CLZ 332
A.4.5 CMP和CMN 332
A.4.6 MOV和MOVN 333
A.4.7 MOVT 335
A.4.8 REV、REV16、REVSH和RBIT 335
A.4.9 TST和TEQ 336
A.5 乘法和除法指令 337
A.5.1 MUL、MLA和MLS 337
A.5.2 UMULL、UMLAL、SMULL和SMLAL 338
A.5.3 SDIV和UDIV 339
A.6 饱和指令 340
A.7 位域指令 341
A.7.1 BFC和BFI 342
A.7.2 SBFX和UBFX 342
A.7.3 SXT和UXT 343
A.8 跳转和控制指令 344
A.8.1 B、BL、BX和BLX 344
A.8.2 CBZ和CBNZ 346
A.8.3 IT 347
A.8.4 TBB和TBH 349
A.9 其他指令 350
A.9.1 BKPT 350
A.9.2 CPS 351
A.9.3 DMB 352
A.9.4 DSB 352
A.9.5 ISB 352
A.9.6 MRS 353
A.9.7 MSR 353
A.9.8 NOP 354
A.9.9 SEV 355
A.9.10 SVC 355
A.9.11 WFE 355
A.9.12 WFI 356
附录B 16位Thumb指令和架构版本 357
附录C Cortex-M3异常快速参考 358
附录D 嵌套向量中断控制器和系统控制块寄存器快速参考 359
附录E Cortex-M3疑难解答 370
E.1 概述 370
E.2 开发错误处理 371
E.2.1 报告错误状态寄存器 371
E.2.2 报告压栈PC和其他压栈寄存器 372
E.2.3 读取错误地址寄存器 374
E.2.4 清除错误状态位 374
E.2.5 其他问题 374
E.3 了解错误的原因 374
E.4 其他可能的问题 377
附录F CodeSourcery G++链接器脚本实例 380
附录G CMSIS内核访问函数参考 385
G.1 异常和中断编号 385
G.2 NVIC访问函数 386
G.3 系统和SYSTICK函数 388
G.4 内核寄存器访问函数 389
G.5 CMSIS内在函数 389
G.6 调试消息输出函数 390
附录H 调试和跟踪接头 391
H.1 概述 391
H.2 20针Cortex调试+ETM接头 391
H.3 10针Cortex调试接头 392
H.4 老式的20针IDC接头 392
H.5 老式的38针Mictor接头 393
参考文献 395