图书介绍

ARM Cortex-M0与Cortex-M0+权威指南 第2版2025|PDF|Epub|mobi|kindle电子书版本百度云盘下载

ARM Cortex-M0与Cortex-M0+权威指南 第2版
  • Jsoseph Yiu著;吴常玉,张淑,吴卫东译 著
  • 出版社: 北京:清华大学出版社
  • ISBN:9787302473312
  • 出版时间:2018
  • 标注页数:608页
  • 文件大小:70MB
  • 文件页数:639页
  • 主题词:微处理器-指南

PDF下载


点此进入-本书在线PDF格式电子书下载【推荐-云解压-方便快捷】直接下载PDF格式图书。移动端-PC端通用
种子下载[BT下载速度快]温馨提示:(请使用BT下载软件FDM进行下载)软件下载地址页直链下载[便捷但速度慢]  [在线试读本书]   [在线获取解压码]

下载说明

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 电源管理IC36

2.7.5 ASSP和ASIC36

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-CORE63

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-else122

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 程序存储器和Bootloader144

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 HardFault156

8.2.4 SVC156

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 RETURN163

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 取出向量并更新PC178

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 设置SysTick204

10.3.3 SysTick用于时间测量206

10.3.4 将SysTick用作单发定时器206

10.4 进程栈和 PSP207

10.5 SVCall异常211

10.6 PendSV212

10.7 高级话题:在编程中使用SVC和PendSV213

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 设置MPU250

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 Discovery277

14.3.3 STMicroelectronics STM32F0 Discovery278

14.3.4 NXP LPC1114FN28278

14.4 μVision IDE入门279

14.4.1 如何开始279

14.4.2 启动Keil MDK279

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 什么是mbed377

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 利用脉宽调试控制LED383

17.6 支持的常用外设对象384

17.7 使用printf385

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中的UART397

18.1.4 配置STM32L0 Discovery板中的UART399

18.1.5 配置STM32F0 Discovery板上的UART400

18.1.6 配置LPC1114FN28上的UART401

18.2 实现printf404

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与WFI423

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和100kHz451

19.8.4 其他改进452

19.8.5 利用LPC1114的深度休眠453

第20章 嵌入式OS编程460

20.1 介绍460

20.1.1 背景460

20.1.2 嵌入式OS和RTOS460

20.1.3 为什么要使用嵌入式OS461

20.1.4 CMSIS-RTOS的作用461

20.1.5 关于Keil RTX Kernel462

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 在应用中使用RTX495

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.c500

20.6.2 线程优先级501

20.6.3 缩短等待时间501

20.6.4 其他信息501

第21章 混合语言工程502

21.1 汇编在工程开发中的应用502

21.2 汇编编程实践和AAPCS503

21.3 汇编函数概述504

21.3.1 ARM工具链504

21.3.2 GCC工具链505

21.3.3 IAR Embedded Workbench for ARM506

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 World513

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-CORE522

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 在错误的优先级上执行SVC595

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/O598

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

热门推荐