图书介绍
ARM Cortex-M0与Cortex-M0+权威指南 第2版pdf电子书版本下载
- Jsoseph Yiu著;吴常玉,张淑,吴卫东译 著
- 出版社: 北京:清华大学出版社
- ISBN:9787302473312
- 出版时间:2018
- 标注页数:608页
- 文件大小:70MB
- 文件页数:639页
- 主题词:微处理器-指南
PDF下载
下载说明
ARM Cortex-M0与Cortex-M0+权威指南 第2版PDF格式电子书版下载
下载的文件为RAR压缩包。需要使用解压软件进行解压得到PDF格式图书。建议使用BT下载工具Free Download Manager进行下载,简称FDM(免费,没有广告,支持多平台)。本站资源全部打包为BT种子。所以需要使用专业的BT下载软件进行下载。如 BitComet qBittorrent uTorrent等BT下载工具。迅雷目前由于本站不是热门资源。不推荐使用!后期资源热门了。安装了迅雷也可以迅雷进行下载!
(文件页数 要大于 标注页数,上中下等多册电子书除外)
注意:本站所有压缩包均有解压码: 点击下载压缩包解压工具
图书目录
第1章 概论 1
1.1 欢迎来到嵌入式处理器的世界 1
1.1.1 处理器有什么作用 1
1.1.2 处理器、CPU、内核、微控制器及其命名 2
1.1.3 嵌入式系统的编程 2
1.1.4 学习微控制器需要了解什么 3
1.2 理解处理器的类型 3
1.2.1 处理器为什么有很多种类 3
1.2.2 ARM处理器家族概述 4
1.2.3 模糊边界 6
1.2.4 ARM Cortex-M处理器系列 6
1.2.5 ARM Cortex-M0和Cortex-M0+处理器简介 9
1.2.6 从Cortex-M0处理器到Cortex-M0+处理器 10
1.2.7 Cortex-M0和Cortex-M0+处理器的应用 13
1.3 微控制器内部有什么 14
1.3.1 微控制器内常见部件 14
1.3.2 微控制器应用的处理器的特点 15
1.3.3 硅片技术 17
1.4 ARM介绍 17
1.4.1 ARM生产芯片吗 17
1.4.2 ARM的产品是什么 17
1.4.3 芯片厂商为什么不设计自己的处理器 18
1.4.4 ARM生态系统有什么特殊之处 18
1.5 ARM处理器和ARM微控制器方面的资源 19
1.5.1 ARM主页 19
1.5.2 微控制器厂商提供的资源 21
1.5.3 工具厂商提供的资源 21
1.5.4 其他资源 22
第2章 技术综述 23
2.1 Cortex-M0和Cortex-M0+处理器 23
2.2 模块框图 25
2.3 典型系统 27
2.4 什么是ARMv6-M架构 29
2.5 Cortex-M处理器间的软件可移植性 30
2.6 ARM Cortex-M0和Cortex-M0+处理器的优势 31
2.6.1 低功耗和能耗效率 31
2.6.2 高代码密度 32
2.6.3 低中断等待和确定行为 32
2.6.4 易于使用 32
2.6.5 系统级特性和OS支持特性 33
2.6.6 调试特性 33
2.6.7 可配置性、灵活性和可扩展性 33
2.6.8 软件可移植性和可重用性 34
2.6.9 产品选择的多样性 34
2.6.10 生态系统支持 35
2.7 Cortex-M0和Cortex-M0+处理器的应用 35
2.7.1 微控制器 35
2.7.2 传感器 36
2.7.3 传感器集线器 36
2.7.4 电源管理IC 36
2.7.5 ASSP和ASIC 36
2.7.6 片上系统中的子系统 37
2.8 为什么要在微控制器应用中使用32位处理器 37
2.8.1 性能 37
2.8.2 代码密度 38
2.8.3 ARM架构的其他优势 40
2.8.4 软件可重用性 41
第3章 嵌入式软件开发介绍 42
3.1 欢迎进入嵌入式系统编程 42
3.2 基本概念 42
3.2.1 复位 42
3.2.2 时钟 43
3.2.3 电压 43
3.2.4 输入和输出 44
3.2.5 嵌入式软件程序流程介绍 44
3.2.6 编程语言选择 48
3.3 ARM Cortex-M编程介绍 49
3.3.1 C编程数据类型 49
3.3.2 用C访问外设 50
3.3.3 程序映像内有什么 54
3.3.4 SRAM中的数据 55
3.3.5 微控制器启动时会发生什么 56
3.4 软件开发流程 58
3.5 Cortex微控制器软件接口标准 60
3.5.1 CMSIS介绍 60
3.5.2 CMSIS-CORE所做的标准化 62
3.5.3 CMSIS-CORE的组织 63
3.5.4 使用CMSIS-CORE 63
3.5.5 CMSIS的优势 66
3.6 软件开发的其他信息 67
第4章 架构 68
4.1 ARMv6-M架构综述 68
4.1.1 架构的含义 68
4.1.2 ARMv6-M架构背景 68
4.2 编程模型 69
4.2.1 操作模式和状态 69
4.2.2 寄存器和特殊寄存器 71
4.2.3 APSR的行为 75
4.3 存储器系统 76
4.3.1 概述 76
4.3.2 单周期I/O接口 77
4.3.3 存储器保护单元 78
4.4 栈存储操作 78
4.5 异常和中断 80
4.6 嵌套向量中断控制器 81
4.6.1 灵活的中断管理 81
4.6.2 嵌套中断支持 82
4.6.3 向量异常入口 82
4.6.4 中断屏蔽 82
4.7 系统控制块 82
4.8 调试系统 82
4.9 程序映像和启动流程 83
第5章 指令集 86
5.1 指令集是什么 86
5.2 ARM和Thumb指令集背景 87
5.3 汇编基础 89
5.3.1 汇编语法一览 89
5.3.2 后缀的使用 93
5.3.3 统一汇编语言(UAL) 93
5.4 指令列表 94
5.4.1 处理器内传送数据 95
5.4.2 存储器访问 97
5.4.3 栈存储访问 101
5.4.4 算术运算 102
5.4.5 逻辑运算 107
5.4.6 移位和循环移位运算 109
5.4.7 展开和顺序反转运算 111
5.4.8 程序流控制 113
5.4.9 存储器屏障指令 115
5.4.10 异常相关指令 117
5.4.11 休眠模式特性相关指令 118
5.4.12 其他指令 119
5.5 伪指令 120
第6章 指令使用示例 122
6.1 概述 122
6.2 程序控制 122
6.2.1 if-then-else 122
6.2.2 循环 123
6.2.3 跳转指令 123
6.2.4 跳转指令的典型用法 124
6.2.5 函数调用和函数返回 125
6.2.6 跳转表 126
6.3 数据访问 128
6.3.1 简单数据访问 128
6.3.2 使用存储器访问指令的例子 128
6.4 数据类型转换 130
6.4.1 数据大小的转换 131
6.4.2 大小端转换 131
6.5 数据处理 132
6.5.1 64位/128位加法 132
6.5.2 64位/128位减法 133
6.5.3 整数除法 133
6.5.4 无符号整数开方根 135
6.5.5 位和位域计算 136
第7章 存储器系统 139
7.1 微控制器中的存储器系统 139
7.2 Cortex-M0和Cortex-M0+处理器中的总线系统 140
7.3 存储器映射 141
7.3.1 概述 141
7.3.2 系统级设计 143
7.4 程序存储器、Bootloader和存储器重映射 144
7.4.1 程序存储器和Bootloader 144
7.4.2 存储器映射 144
7.5 数据存储器 145
7.6 小端和大端支持 146
7.7 数据类型 148
7.8 存储器属性和存储器访问权限 149
7.9 硬件行为对编程的影响 151
7.9.1 数据对齐 151
7.9.2 访问非法地址 152
7.9.3 多加载和存储指令的使用 152
7.9.4 等待状态 152
第8章 异常和中断 154
8.1 异常和中断的含义 154
8.2 Cortex-M0和Cortex-M0+处理器内的异常类型 155
8.2.1 概述 155
8.2.2 不可屏蔽中断 156
8.2.3 HardFault 156
8.2.4 SVC 156
8.2.5 可挂起的系统调用 156
8.2.6 系统节拍 157
8.2.7 中断 157
8.3 NVIC简介 157
8.4 异常优先级定义 158
8.5 向量表 159
8.6 异常流程概述 161
8.6.1 接受异常 161
8.6.2 压栈和出栈 161
8.6.3 异常返回指令 162
8.6.4 末尾连锁 162
8.6.5 延迟到达 162
8.7 EXC RETURN 163
8.8 用于中断控制的NVIC控制寄存器 166
8.8.1 NVIC控制寄存器概述 166
8.8.2 中断使能和清除使能 166
8.8.3 中断挂起和清除挂起 168
8.8.4 中断优先级 169
8.9 异常屏蔽寄存器(PRIMASK) 171
8.10 中断输入和挂起行为 172
8.10.1 简单中断处理 172
8.10.2 简单的脉冲中断处理 173
8.10.3 中断挂起状态在得到服务前取消 173
8.10.4 外设在确认中断请求时清除挂起状态 174
8.10.5 ISR完成后中断请求保持为高 174
8.10.6 进入ISR前产生了多个中断请求脉冲 175
8.10.7 在ISR执行期间产生了中断请求脉冲 175
8.10.8 已禁止中断的中断请求确认 176
8.11 异常入口流程 176
8.11.1 压栈 176
8.11.2 取出向量并更新PC 178
8.11.3 更新寄存器 178
8.12 异常退出流程 178
8.12.1 寄存器出栈 179
8.12.2 从返回地址取指并执行 180
8.13 中断等待 180
第9章 系统控制和低功耗特性 181
9.1 系统控制寄存器简介 181
9.2 SCB中的寄存器 182
9.2.1 SCB中的寄存器列表 182
9.2.2 CPU ID寄存器 182
9.2.3 用于系统异常管理的控制寄存器 183
9.2.4 向量表偏移寄存器 184
9.2.5 应用中断和复位控制寄存器 185
9.2.6 系统控制寄存器 186
9.2.7 配置和控制寄存器 186
9.2.8 系统处理控制和状态寄存器 187
9.3 使用自复位特性 187
9.4 使用向量表重定位特性 189
9.5 低功耗特性 190
9.5.1 概述 190
9.5.2 休眠模式 191
9.5.3 等待事件和等待中断 192
9.5.4 唤醒条件 194
9.5.5 退出时休眠特性 196
9.5.6 唤醒中断控制器 197
第10章 操作系统支持特性 200
10.1 支持OS的特性概述 200
10.2 嵌入式系统的操作系统介绍 200
10.3 SysTick定时器 202
10.3.1 SysTick寄存器 202
10.3.2 设置SysTick 204
10.3.3 SysTick用于时间测量 206
10.3.4 将SysTick用作单发定时器 206
10.4 进程栈和 PSP 207
10.5 SVCall异常 211
10.6 PendSV 212
10.7 高级话题:在编程中使用SVC和PendSV 213
10.7.1 使用SVC异常 214
10.7.2 使用PendSV异常 217
10.8 高级话题:实际的上下文切换 219
第11章 错误处理 232
11.1 错误异常概述 232
11.2 错误是如何产生的 232
11.3 分析错误 233
11.4 意外切换至ARM状态 234
11.5 实际应用中的错误处理 234
11.6 软件开发期间的错误处理 235
11.7 锁定 237
11.7.1 锁定的原因 238
11.7.2 锁定期间发生了什么 238
11.8 避免锁定 239
11.9 和ARMv7-M架构中错误处理的对比 240
第12章 存储器保护单元 242
12.1 MPU是什么 242
12.2 MPU适用的情形 242
12.3 技术介绍 244
12.4 MPU寄存器 244
12.4.1 MPU类型寄存器 245
12.4.2 MPU控制寄存器 245
12.4.3 MPU区域编号寄存器 246
12.4.4 MPU区域基地址寄存器 247
12.4.5 MPU区域基本属性和大小寄存器 247
12.5 设置MPU 250
12.6 存储器屏障和MPU配置 256
12.7 使用子区域禁止 257
12.7.1 允许高效的存储器划分 257
12.7.2 减少所需的区域总数 258
12.8 使用MPU时的注意事项 259
12.8.1 程序代码 259
12.8.2 数据存储器 259
12.9 和Cortex-M3/M4/M7处理器的MPU间的差异 259
第13章 调试特性 261
13.1 软件开发和调试特性 261
13.2 调试接口 262
13.2.1 JTAG和串行线调试通信协议 262
13.2.2 Cortex-M处理器和CoreSight调试架构 264
13.2.3 调试接口的设计考虑 265
13.3 调试特性一览 265
13.4 调试系统 266
13.5 暂停模式和调试事件 267
13.6 利用MTB实现指令跟踪 268
第14章 Keil微控制器开发套件入门 272
14.1 Keil微控制器开发套件介绍 272
14.1.1 概述 272
14.1.2 工具 272
14.1.3 Keil MDK的优势 273
14.1.4 安装 273
14.2 典型的程序编译流程 274
14.3 硬件介绍 276
14.3.1 Freescale Freedom开发板(FRDM-KL25Z) 276
14.3.2 STMicroelectronics STM32L0 Discovery 277
14.3.3 STMicroelectronics STM32F0 Discovery 278
14.3.4 NXP LPC1114FN28 278
14.4 μVision IDE入门 279
14.4.1 如何开始 279
14.4.2 启动Keil MDK 279
14.4.3 Freescale FRDM-KL25Z工程设置步骤 280
14.4.4 ST Microelectronics STM32L0 Discovery工程设置步骤 290
14.4.5 STMicroelectronice STM32F0 Discovery工程设置步骤 300
14.4.6 NXP LPC1114FN28工程设置步骤 310
14.5 使用IDE和调试器 319
14.6 底层内容 322
14.6.1 CMSIS文件 322
14.6.2 时钟设置 323
14.6.3 栈和堆的设置 323
14.6.4 编译 324
14.7 工程环境的优化 324
14.7.1 目标选项 324
14.7.2 优化选项 326
14.7.3 运行时环境选项 328
14.7.4 工程管理 328
14.8 使用模拟器 330
14.9 在SRAM中执行程序 331
14.10 使用MTB指令跟踪 333
第15章 IAR embedded workbench for ARM入门 336
15.1 IAR embedded workbench for ARM概述 336
15.2 典型的程序编译流程 337
15.3 创建简单的blinky工程 339
15.4 工程选项 344
15.5 在IAR EWARM中使用MTB指令跟踪 346
15.6 提示和要点 347
第16章 GCC入门 351
16.1 GCC工具链 351
16.2 关于本章中的例子 351
16.3 典型开发流程 352
16.4 创建简单的Blinky工程 354
16.5 命令行选项概述 355
16.6 Flash编程 358
16.7 在Keil MDK-ARM中使用ARM嵌入式处理器GNU工具 360
16.8 在CooCox IDE中使用ARM嵌入式处理器GNU工具 367
16.8.1 概述和设置 367
16.8.2 创建新的工程 369
16.8.3 使用IDE和调试器 375
第17章 mbed入门 377
17.1 什么是mbed 377
17.2 mbed系统是怎么工作的 378
17.3 mbed的优势 380
17.4 设置FRDM-KL25Z板和mbed账号 380
17.4.1 检查mbed Web网页 380
17.4.2 注册mbed账号 380
17.4.3 个入计算机的设置 381
17.5 创建blinky程序 381
17.5.1 只开关红色LED的简单版本 381
17.5.2 利用脉宽调试控制LED 383
17.6 支持的常用外设对象 384
17.7 使用printf 385
17.8 应用实例:火车模型控制器 387
17.9 中断 392
17.10 要点和提示 393
第18章 编程实例 395
18.1 利用通用异步收发器来产生输出 395
18.1.1 通用异步收发器通信概述 395
18.1.2 微控制器上的UART配置概述 397
18.1.3 配置FRDM-KL25Z中的UART 397
18.1.4 配置STM32L0 Discovery板中的UART 399
18.1.5 配置STM32F0 Discovery板上的UART 400
18.1.6 配置LPC1114FN28上的UART 401
18.2 实现printf 404
18.2.1 概述 404
18.2.2 Keil MDK的重定向 405
18.2.3 IAR EWARM的重定向 406
18.2.4 GNU编译器套件的重定向 407
18.2.5 IAR EWARM的半主机 407
18.2.6 CoIDE的半主机 409
18.3 开发输入和输出函数 410
18.3.1 为何要重新开发 410
18.3.2 其他接口 413
18.3.3 有关scanf的其他信息 413
18.4 中断编程实例 414
18.4.1 中断处理概述 414
18.4.2 中断控制函数概述 415
18.5 应用实例:火车模型用的另一个控制器 416
18.6 CMSIS-CORE的不同版本 419
第19章 超低功耗设计 422
19.1 超低功耗使用示例 422
19.1.1 概述 422
19.1.2 进入休眠模式 422
19.1.3 WFE与WFI 423
19.1.4 利用退出时休眠特性 424
19.1.5 利用挂起发送事件特性 426
19.1.6 利用唤醒中断控制器 426
19.1.7 利用事件通信接口 427
19.2 低功耗设计要求 429
19.3 能量去哪里了 429
19.4 开发低功耗应用 431
19.4.1 低功耗设计概述 431
19.4.2 降低功耗的各种方法 432
19.4.3 选择正确的方法 433
19.5 调试考虑 434
19.5.1 调试和低功耗 434
19.5.2 调试和Flash编程的“安全模式” 434
19.5.3 低电压引脚和调试接口 434
19.6 低电压设备的检测 434
19.6.1 ULPBench的背景 434
19.6.2 ULPBench-CP概述 435
19.7 Freescale KL25Z低功耗特性使用示例 438
19.7.1 目标 438
19.7.2 测试设置 438
19.7.3 KL25Z的低功耗模式 438
19.7.4 时钟设计 439
19.7.5 测试设置 440
19.7.6 测量结果 445
19.8 LPC1114低功耗特性使用示例 446
19.8.1 LPC1114FN28概述 446
19.8.2 实验1:使用12MHz内部和外部晶振 448
19.8.3 实验2:使用降频1MHz和100kHz 451
19.8.4 其他改进 452
19.8.5 利用LPC1114的深度休眠 453
第20章 嵌入式OS编程 460
20.1 介绍 460
20.1.1 背景 460
20.1.2 嵌入式OS和RTOS 460
20.1.3 为什么要使用嵌入式OS 461
20.1.4 CMSIS-RTOS的作用 461
20.1.5 关于Keil RTX Kernel 462
20.1.6 在Keil MDK中构建一个简单RTX实例 463
20.2 RTX Kernel概述 467
20.2.1 线程 467
20.2.2 RTX配置 468
20.2.3 深入研究第一个例子 469
20.2.4 线程间通信概述 472
20.2.5 信号事件通信 472
20.2.6 互斥体(Mutex) 476
20.2.7 信号量 478
20.2.8 消息队列 481
20.2.9 邮件队列 483
20.2.10 内存池管理特性 485
20.2.11 通用等待函数和超时数值 488
20.2.12 定时器特性 488
20.2.13 给非特权线程增加SVC服务 491
20.3 在应用中使用RTX 495
20.4 调试RTX应用 498
20.5 疑难解答 499
20.5.1 栈大小需求 499
20.5.2 优先级 499
20.5.3 利用OS错误报告 500
20.5.4 OS特性配置 500
20.5.5 其他问题 500
20.6 其他要点和提示 500
20.6.1 修改RTX_Config_CM.c 500
20.6.2 线程优先级 501
20.6.3 缩短等待时间 501
20.6.4 其他信息 501
第21章 混合语言工程 502
21.1 汇编在工程开发中的应用 502
21.2 汇编编程实践和AAPCS 503
21.3 汇编函数概述 504
21.3.1 ARM工具链 504
21.3.2 GCC工具链 505
21.3.3 IAR Embedded Workbench for ARM 506
21.3.4 汇编函数结构 506
21.4 内联汇编 507
21.4.1 ARM工具链 507
21.4.2 GNU编译器组件 508
21.5 嵌入汇编特性(ARM工具链) 509
21.6 混合语言工程 510
21.6.1 概述 510
21.6.2 在汇编代码中调用C函数 510
21.6.3 在C代码中调用汇编函数 511
21.7 在Keil MDK-ARM中创建汇编工程 512
21.7.1 一个简单的工程 512
21.7.2 Hello World 513
21.7.3 其他文本输出函数 514
21.8 用于中断控制的通用汇编代码 516
21.8.1 使能和禁止中断 516
21.8.2 设置和清除中断挂起状态 517
21.8.3 设置中断优先级 518
21.9 汇编语言的其他编程技巧 519
21.9.1 为变量分配数据空间 519
21.9.2 复杂跳转处理 522
21.10 使用特殊指令 522
21.10.1 CMSIS-CORE 522
21.10.2 习语识别 524
第22章 软件移植 525
22.1 概述 525
22.2 从8位/16位微控制器向ARM Cortex-M移植软件 525
22.2.1 通用改动 525
22.2.2 存储器需求 527
22.2.3 8位或16位微控制器不再适用的优化 528
22.2.4 实例:从8051移植到ARM Cortex-M0/Cortex-M0+ 528
22.3 ARM7TDMI和Cortex-M0/M0+处理器间的差异 530
22.3.1 经典ARM处理器概述 530
22.3.2 操作模式 531
22.3.3 寄存器 532
22.3.4 指令集 533
22.3.5 中断 533
22.4 从ARM7TDMI向Cortex-M0/Cortex-M0+处理器移植软件 533
22.4.1 启动代码和向量表 533
22.4.2 中断 534
22.4.3 C程序代码 535
22.4.4 汇编代码 535
22.4.5 原子访问 535
22.4.6 优化 536
22.5 各种Cortex-M处理器间的差异 536
22.5.1 概述 536
22.5.2 系统模型 537
22.5.3 NVIC和异常 538
22.5.4 指令集 540
22.5.5 系统级特性 541
22.5.6 调试和跟踪特性 541
22.6 在Cortex-M处理器间移植时的通用改动 542
22.7 Cortex-M0/M0+和Cortex-M1间的软件移植 543
22.8 Cortex-M0/M0+和Cortex-M3间的软件移植 543
22.9 Cortex-M0/M0+和Cortex-M4/M7间的软件移植 545
第23章 高级话题 547
23.1 C语言实现的位数据处理 547
23.2 C实现的启动代码 549
23.3 栈溢出检测 554
23.3.1 什么是栈溢出 554
23.3.2 工具链的栈分析 554
23.3.3 栈的测试分析 555
23.3.4 利用存储器保护单元对栈进行限制 555
23.3.5 OS上下文切换期间的栈检测 556
23.4 中断服务程序重入 556
23.5 信号量设计 558
23.6 存储器顺序和存储器屏障 558
附录A 指令集快速参考 561
附录B 异常类型快速参考 565
B.1 异常类型 565
B.2 异常压栈后栈的内容 566
附录C CMSIS-CORE快速参考 567
C.1 数据类型 567
C.2 异常枚举 567
C.3 嵌套向量中断控制器访问函数 568
C.4 系统和SysTick操作函数 569
C.5 内核寄存器操作函数 570
C.6 特殊指令操作函数 570
附录D NVIC、SCB和SysTick寄存器快速参考 571
D.1 NVIC寄存器一览 571
D.2 中断设置使能寄存器(NVIC->ISER) 571
D.3 中断清除使能寄存器(NVIC->ICER) 571
D.4 中断设置挂起寄存器(NVIC->ISPR) 572
D.5 中断清除挂起寄存器(NVIC->ICPR) 572
D.6 中断优先级寄存器(NVIC->IRQ[0]到NVIC->IRQ[7]) 573
D.7 SCB寄存器一览 573
D.8 CPU ID寄存器(SCB->CPUID) 573
D.9 中断控制状态寄存器(SCB->ICSR) 574
D.10 向量表偏移寄存器(SCB->VTOR,0xE000ED08) 575
D.11 应用中断和控制状态寄存器(SCB->AIRCR) 575
D.12 系统控制寄存器(SCB->SCR) 575
D.13 配置控制寄存器(SCB->CCR) 576
D.14 系统处理优先级寄存器2(SCB->SHR[0]) 576
D.15 系统处理优先级寄存器3(SCB->SHR[1]) 576
D.16 系统处理控制和状态寄存器 577
D.17 SysTick寄存器一览 577
D.18 SysTick控制和状态寄存器(SysTick->CTRL) 577
D.19 SysTick重装载值寄存器(SysTick->LOAD) 578
D.20 SysTick当前值寄存器(SysTick->VAL) 578
D.21 SysTick校准值寄存器(SysTick->CALIB) 578
附录E 调试寄存器快速参考 579
E.1 内核调试寄存器 579
E.2 断点单元 581
E.3 数据监视点单元 582
E.4 ROM表寄存器 584
E.5 微跟踪缓冲 584
E.6 POSITION寄存器 586
E.7 MASTER寄存器 586
E.8 FLOW寄存器 587
E.9 BASE寄存器 587
E.10 包格式 587
E.11 实例 588
附录F 调试接头分配 590
F.1 10针Cortex调试连接头 590
F.2 20针Cortex调试+ETM接头 590
F.3 老式的20针IDC接头排列 591
附录G 疑难解答 592
G.1 程序不运行/启动 592
G.1.1 向量表丢失或位置错误 592
G.1.2 使用了错误的C启动代码 592
G.1.3 复位向量中的值错误 592
G.1.4 程序映像没有被正确地编程到Flash中 593
G.1.5 错误的工具链配置 593
G.1.6 错误的栈指针初始值 593
G.1.7 错误的大小端设置 593
G.2 程序启动,却进入了硬件错误 593
G.2.1 非法存储器访问 594
G.2.2 非对齐数据访问 594
G.2.3 存储器访问权限(只限于Cortex-M0+处理器) 594
G.2.4 从总线返回错误 594
G.2.5 异常处理中的栈被破坏 595
G.2.6 程序在某些C函数中崩溃 595
G.2.7 意外地试图切换至ARM状态 595
G.2.8 在错误的优先级上执行SVC 595
G.3 休眠问题 595
G.3.1 执行WFE不进入休眠 595
G.3.2 退出时休眠过早地引起休眠 595
G.3.3 中断已经在挂起态时SEVONPEND不工作 596
G.3.4 由于休眠模式可能禁止了某些时钟,处理器无法唤醒 596
G.3.5 竞态 596
G.4 中断问题 597
G.4.1 执行了多余的中断处理 597
G.4.2 执行了多余的SysTick处理 597
G.4.3 在中断处理中禁止中断 597
G.4.4 错误的中断返回指令 597
G.4.5 异常优先级设置的数值 598
G.5 其他问题 598
G.5.1 错误的SVC参数传递方法 598
G.5.2 调试连接受到I/O设置或低功耗模式的影响 598
G.5.3 调试协议选择/配置 598
G.5.4 使用事件输出作为脉冲I/O 598
G.5.5 向量表和代码位置的设备实际需求 599
G.6 其他可能的编程陷阱 599
G.6.1 中断优先级 599
G.6.2 同时使用主栈和进程栈时的栈溢出 599
G.6.3 数据对齐 600
G.6.4 丢失volatile关键字 600
G.6.5 函数指针 601
G.6.6 读-修改-写 601
G.6.7 中断禁止 601
G.6.8 SystemInit函数 602
G.6.9 断点和内联 602
附录H ARM Cortex-M0微控制器面包板工程 604
H.1 背景 604
H.2 硬件设计 604
附录I 参考文档 607