从零开始学ARM

从零开始学ARM
作 者: 彭丹 周海涛
出版社: 人民邮电出版社
丛编项:
版权说明: 本书为公共版权或经版权方授权,请支持正版图书
标 签: 暂缺
ISBN 出版时间 包装 开本 页数 字数
未知 暂无 暂无 未知 0 暂无

作者简介

  彭丹,硕士,“一口Linux”公众号创始人,南京六九零二科技有限公司高级嵌入式驱动工程师。从事嵌入式软件开发工作16年。精通计算机网络、ARM、基于Linux的驱动开发。获得多项科技发明授权、多篇软件文章等。 周海涛,硕士,长期从事网络安全和信息化建设相关工作,著有多篇论文,江苏省第六期333高层次人才培养工程培养对象。

内容简介

本书主要介绍ARM开发的相关知识,详细讲解常用的ARM指令及如何基于ARM架构的外设编写驱动程序,并分析了开源软件U-Boot的启动源代码和网络协议栈。本书第1~4章为基础篇,主要介绍CPU与ARM、搭建环境、ARM编程、异常等;第5~13章为编程篇,主要介绍基于Exynos 4412的常用外设的工作原理及驱动程序编写等;第14~17章为应用篇,主要介绍开源软件U-Boot的使用及启动程序,并分析网卡DM9000AE的驱动和网络协议栈;以及关于汇编的两点补充。 本书适合从事嵌入式开发的工程师和有一定计算机基础和C语言编程经验的初学者学习参考。

图书目录

第 1章 ARM与CPU 1

1.1 ARM公司 1

1.2 ARM内核与架构 4

1.2.1 ARM内核 4

1.2.2 ARM架构 5

1.2.3 指令集 7

1.2.4 ARM处理器分类 9

1.2.5 什么是SoC? 11

1.2.6 Exynos 4412 SCP 15

1.2.7 ARM授权 17

1.2.8 总结 18

1.3 计算机重要贡献者 18

1.4 CPU架构 22

1.4.1 冯诺依曼架构 22

1.4.2 哈佛架构 23

1.4.3 CPU组成 25

1.5 指令的运行 30

1.6 ARM技术特征 31

1.7 ARM工作模式 32

1.8 ARM寄存器 33

1.8.1 寄存器分类 33

1.8.2 CPSR格式详解 36

1.9 协处理器 37

1.10 Jzelle 38

1.11 指令流水线 39

1.11.1 3级流水线 39

1.11.2 指令对流水线影响 40

第 2章 搭建环境 44

2.1 KEIL安装 44

2.1.1 ARM集成开发环境 44

2.1.2 KEIL、MDK、uVision、ARM之间的关系 45

2.1.3 安装Keil 46

2.1.4 创建第 一个工程 49

2.1.5 编译代码 52

2.1.6 如何debug代码? 53

2.2 GNU编译环境搭建 56

2.2.1 安装VMware Workstation 57

2.2.2 安装ubuntu 62

2.3 交叉编译工具安装 67

第3章 ARM编程 70

3.1 ARM指令格式 71

3.2 数据处理指令 72

3.2.1 MOV指令 72

3.2.2 移位操作 75

3.2.3 CMP指令 76

3.2.4 TST指令 77

3.2.5 算数运算指令 78

3.3 跳转指令 81

3.4 程序状态寄存器访问 84

3.4.1 MRS指令 84

3.4.2 MSR指令 85

3.4.3 举例 85

3.5 LDR/STR指令 91

3.5.1 LDR指令 91

3.5.2 STR指令 92

3.5.3 LDRB指令 93

3.5.4 LDRH指令 93

3.6 ARM寻址方式 94

3.7 LDREX/STREX指令 103

3.8 MDK与GNU 106

3.9 GNU书写风格 108

3.9.1 标号symbol(或label) 108

3.9.2 常数 109

3.9.3 特殊字符和语法 109

3.9.4 语句格式 110

3.9.5 分段 110

3.9.6 定义入口点 112

3.10 伪操作 112

3.10.1 数据定义伪操作 112

3.10.2 .align .end .include .incbin伪操作 113

3.10.3 .rept伪操作 114

3.10.4 macro宏定义 114

3.10.5 .if伪操作 115

3.10.6 .global/.type/.title/.list伪操作 115

3.10.7 杂项伪操作标识符 116

3.10.8 伪指令 118

3.13 GNU代码的编译 119

3.13.1 交叉编译工具 119

3.13.2. 交叉编译工具命名规则 119

3.13.3 代码编译过程 120

3.13.3 编译选项 122

3.13.4 ELF与bin 126

3.13.5 编译举例 127

3.14 ATPCS和AAPCS 132

3.15 内联汇编 135

3.16 C语言和汇编相互调用举例 137

第4章 异常(Exception) 139

4.1 异常基础知识 139

4.2 异常处理 141

4.2.1 异常发生后硬件操作 141

4.2.2 异常向量表 142

4.2.3 保存执行现场 143

4.2.4 异常处理的返回 144

4.2.5 异常恢复 146

4.3 IRQ中断异常 146

4.3.1 中断概念 146

4.3.2 中断处理流程 147

4.4 软中断 148

4.4.1 SWI指令 148

4.4.2 BKPT指令 148

4.4.3 举例 149

4.4.4 如何同时跳转并切换模式? 151

4.4.5 如何获取中断号? 151

第5章 GPIO及LED 152

5.1 GPIO 153

5.1.1 Exynos 4412 GPIO特性 153

5.1.2 LED灯电路图 154

5.1.3 如何操作GPIO? 155

5.2 LED驱动编写 157

5.2.1 汇编代码 157

5.2.2 c语言实现 158

5.2.3 烧写代码 161

第6章 PWM 162

6.1 PWM基础知识 162

6.2 Exynos 4412 PWM 164

6.2.1 Exynos 4412 PWM特性 165

6.2.2 PWM工作步骤 166

6.3 蜂鸣器驱动编写 167

6.3.1 参考电路 167

6.3.2 寄存器 168

6.3.3 代码实现 172

第7章 中断、key 173

7.1 GIC 173

7.1.1 分发器 174

7.1.2 CPU接口 176

7.1.3 中断分类 176

7.1.4 中断处理 179

7.2 key驱动编写 180

7.2.1 电路图 180

7.2.2 配置按键为中断触发方式 181

7.2.3 寄存器 183

7.2.4 代码实现 188

7.3 轮询方式 190

第8章 UART 192

8.1 UART概述 192

8.1.1 UART通信方式 192

8.1.2 UART帧格式 195

8.2 Exynos 4412 UART控制器 196

8.2.1 UART特性 197

8.2.2 UART内部功能模块 197

8.2.3 时钟源 200

8.4 驱动编写 200

8.4.1 参考电路 200

8.4.2 UART寄存器 202

8.4.3 代码实现 206

8.5 移植printf() 209

第9章 RTC详解 209

9.1 Exynos 4412 RTC 210

9.1.1 Exynos 4412 RTC特性 210

9.1.2 RTC Block 210

9.1.3 备用电池 211

9.1.4 晶振 211

9.2 RTC寄存器 212

9.3 RTC操作 214

9.4 代码实现 219

第 10章 看门狗 222

10.1 Exynos 4412 看门狗 222

10.1.1 看门狗定时器模块图 223

10.1.2 工作原理 223

10.2 驱动编写 224

10.2.1 看门狗软件程序设计流程 224

10.2.2 看门狗寄存器 224

10.2.3 代码实现 226

第 11章 ADC 227

11.1 信号基础知识 228

11.1.1 信号分类 228

11.1.2 数字信号优点 229

11.1.4 PCM脉冲编码调制 229

11.2 Exynos 4412 ADC控制器 231

11.2.1 Exynos 4412 ADC控制器特性 231

11.2.2 寄存器 232

11.2.3 Combiner中断控制器 234

11.2.4 A/D转换的转换时间计算 236

11.3 驱动编写 236

11.3.1 参考电路 236

11.3.2 代码实例 238

第 12章 I2C 241

12.1 I2C协议 241

12.1.1 开始和停止条件 241

12.1.2 数据有效性 243

12.1.3 数据传输格式 243

12.1.4 数据传输格式 245

12.2 Exynos 4412 I2C控制器 245

12.2.1 Exynos 4412 I2C控制器综述 245

12.2.2 Exynos 4412 I2C总线接口特性 246

12.2.3 I2C数据读写格式 247

12.2.3 数据读写流程 248

12.2.4 寄存器 252

12.2.5 寄存器使用规则 255

12.3 MPU6050及驱动编写 255

12.3.1 MPU6050 255

12.3.2 参考电路 258

12.3.3 MPU6050内部寄存器 259

12.3.4 代码实例: 260

第 13章 SPI 264

13.1 SPI基础知识 264

13.1.1 SPI特点 264

13.1.2 极性和相位 268

13.1.3 采样波形 268

13.1.4 如何设置极性和相位 270

13.1.5 数据交换(Data Exchanges) 271

13.2 Exynos 4412 SPI控制器 272

13.3 SPI操作 274

13.3.1 参考电路 274

13.3.2 寄存器 275

13.3.3 SPI初始化流程 278

13.3.4 收发数据流程 282

13.4 MCP2515 283

13.4.1 MCP2515简介 283

13.4.2 MCP2515特性 283

13.4.3 结构框图 284

13.4.4 SPI 协议模块 285

13.4.5 SPI 指令集 285

13.4.6 CAN初始化 289

13.4.7 CAN缓冲区 296

13.4.8 数据发送 296

13.4.9 CAN数据的接收 298

17.6.7 MCP2515驱动实现 300

第 14章 U-Boot 304

14.1 Bootloader 304

14.1.1 概念 304

14.1.2 分类 305

14.1.3 Bootloader对不同CPU架构支持 306

14.2 U-Boot概述 307

14.2.1 U-Boot概念 307

14.2.2 U-Boot的特性 307

14.2.3 工作模式 308

14.2.4 U-Boot常用命令 309

14.2.5 配置举例 312

14.3 U-Boot移植步骤 313

14.3.1 U-Boot源码简介 313

14.3.2 U-boot源码配置 316

14.3.3 U-Boot源码编译 319

14.4 U-Boot硬件驱动移植 321

14.4.1 实现串口输出 321

14.4.2 网卡驱动移植 322

14.4.3 FLASH移植 (EMMC) 325

14.5 SD卡制作 331

14.5.1 编写脚本 331

14.5.2 sd卡制作 334

14.5.3 通过sd卡启动烧写U-Boot 334

14.5.4 网络烧写U-Boot 336

第 15章、U-Boot代码启动分析 337

15.1 内核启动流程概述 337

15.1.1 U-boot启动加载linux内核一般流程 337

15.1.2 Exynos 4412内存布局 339

15.1.3 Booting Sequence 340

15.1.4 SD卡镜像布局 342

15.1.5 lds文件 343

15.2 U-Boot启动流程代码详解 344

15.2.1 U-Boot启动代码流程 344

15.2.2 U-Boot启动详解 346

15.3 U-Boot启动的几个关键问题 364

第 16章 网卡DM9000x 365

16.1 网卡概述 365

16.2 DM9000AE 366

16.2.1 DM9000AE概述 366

16.2.2 模块图 367

16.2.3 引脚说明 368

16.2.4 DM9000AE内部寄存器 372

16.3 SROM 控制器 378

16.3.1 概念 378

16.3.2 寄存器SROM_BW、SROM_BC1 378

16.3.3 配置为SROM模式 383

16.3.4 SROM初始化 388

16.4 DM9000AE驱动分析 392

16.4.1 网卡注册 392

16.4.2 网卡注册代码分析 394

16.4.5 网卡的初始化 398

16.4.6 数据的发送 402

16.4.7 数据的接收 404

16.4.4 网卡注销 406

16.5 U-Boot中网络协议栈 407

16.5.1 网络协议栈架构 407

16.5.2 DNS协议详解 408

第 17章 关于汇编的两点补充 420

17.1 为什么使用结构体效率会高? 420

17.1.1 定义多个全局变量 420

17.1.2 使用结构体 423

17.1.3 literal pool 424

17.1.4 继续优化 425

17.2 位置无关码 426

17.2.1 为什么需要位置无关码? 426

17.2.2 如何编写位置无关码 427

17.2.3 举例 427

17.2.4 总结 431

17.2.5 思考题 432