当前位置:首页 > 工业技术
ARM Cortex-M0与Cortex-M0+权威指南  第2版
ARM Cortex-M0与Cortex-M0+权威指南  第2版

ARM Cortex-M0与Cortex-M0+权威指南 第2版PDF电子书下载

工业技术

  • 电子书积分:18 积分如何计算积分?
  • 作 者:Jsoseph Yiu著;吴常玉,张淑,吴卫东译
  • 出 版 社:北京:清华大学出版社
  • 出版年份:2018
  • ISBN:9787302473312
  • 页数:608 页
图书介绍:ARM Cortex—M0与Cortex—M0+权威指南(第2版)第1版就是亚马逊五星级畅销书。第2版新增了关于Cortex—M0+权威指南的最新技术细节,适合从事ARM Cortex—M0与Cortex—M0+开发的高年级学生及工程技术人员参考使用。
《ARM Cortex-M0与Cortex-M0+权威指南 第2版》目录
标签:权威 指南

第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

返回顶部