从零开始学ARM

从零开始学ARM
分享
扫描下方二维码分享到微信
打开微信,点击右上角”+“,
使用”扫一扫“即可将网页分享到朋友圈。
2023-05
版次: 1
ISBN: 9787115606884
定价: 99.80
装帧: 平装
页数: 330页
字数: 503千字
  • 本书主要介绍ARM开发的相关知识,详细讲解常用的ARM指令及如何基于ARM架构的外设编写驱动程序,并分析了开源软件U-Boot的启动源代码和网络协议栈。
      本书第1~4章为基础篇,主要介绍CPU与ARM、搭建环境、ARM编程、异常等;第5~13章为编程篇,主要介绍基于Exynos 4412的常用外设的工作原理及驱动程序编写等;第14~17章为应用篇,主要介绍开源软件U-Boot的使用及启动程序,并分析网卡DM9000AE的驱动和网络协议栈;以及关于汇编的两点补充。
       本书适合从事嵌入式开发的工程师和有一定计算机基础和C语言编程经验的初学者学习参考。 彭丹,硕士,“一口Linux”公众号创始人,南京六九零二科技有限公司高级嵌入式驱动工程师。从事嵌入式软件开发工作16年。精通计算机网络、ARM、基于Linux的驱动开发。获得多项科技发明授权、多篇软件文章等。 

    周海涛,硕士,长期从事网络安全和信息化建设相关工作,著有多篇论文,江苏省第六期333高层次人才培养工程培养对象。 第 1章  ARM与CPU1

    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 SCP15

    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  Jzelle38

    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  安装Keil46

    2.1.4  创建第 一个工程49

    2.1.5  编译代码52

    2.1.6  如何debug代码?53

    2.2  GNU编译环境搭建56

    2.2.1  安装VMware Workstation57

    2.2.2  安装ubuntu62

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

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

    3.13.5 编译举例127

    3.14 ATPCS和AAPCS132

    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及LED152

    5.1 GPIO153

    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章 PWM162

    6.1PWM基础知识162

    6.2 Exynos 4412 PWM164

    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章 中断、key173

    7.1 GIC173

    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章 UART192

    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 RTC210

    9.1.1 Exynos 4412 RTC特性210

    9.1.2 RTC Block210

    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章 ADC227

    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章 I2C241

    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 MPU6050255

    12.3.2 参考电路258

    12.3.3 MPU6050内部寄存器259

    12.3.4 代码实例:260

    第 13章 SPI264

    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 MCP2515283

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

    14.1 Bootloader304

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

    14.5.4 网络烧写U-Boot336

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

    15.1 内核启动流程概述337

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

    15.1.2 Exynos 4412内存布局339

    15.1.3 Booting Sequence340

    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章 网卡DM9000x365

    16.1 网卡概述365

    16.2 DM9000AE366

    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_BC1378

    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 pool424

    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
  • 内容简介:
    本书主要介绍ARM开发的相关知识,详细讲解常用的ARM指令及如何基于ARM架构的外设编写驱动程序,并分析了开源软件U-Boot的启动源代码和网络协议栈。
      本书第1~4章为基础篇,主要介绍CPU与ARM、搭建环境、ARM编程、异常等;第5~13章为编程篇,主要介绍基于Exynos 4412的常用外设的工作原理及驱动程序编写等;第14~17章为应用篇,主要介绍开源软件U-Boot的使用及启动程序,并分析网卡DM9000AE的驱动和网络协议栈;以及关于汇编的两点补充。
       本书适合从事嵌入式开发的工程师和有一定计算机基础和C语言编程经验的初学者学习参考。
  • 作者简介:
    彭丹,硕士,“一口Linux”公众号创始人,南京六九零二科技有限公司高级嵌入式驱动工程师。从事嵌入式软件开发工作16年。精通计算机网络、ARM、基于Linux的驱动开发。获得多项科技发明授权、多篇软件文章等。 

    周海涛,硕士,长期从事网络安全和信息化建设相关工作,著有多篇论文,江苏省第六期333高层次人才培养工程培养对象。
  • 目录:
    第 1章  ARM与CPU1

    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 SCP15

    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  Jzelle38

    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  安装Keil46

    2.1.4  创建第 一个工程49

    2.1.5  编译代码52

    2.1.6  如何debug代码?53

    2.2  GNU编译环境搭建56

    2.2.1  安装VMware Workstation57

    2.2.2  安装ubuntu62

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

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

    3.13.5 编译举例127

    3.14 ATPCS和AAPCS132

    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及LED152

    5.1 GPIO153

    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章 PWM162

    6.1PWM基础知识162

    6.2 Exynos 4412 PWM164

    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章 中断、key173

    7.1 GIC173

    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章 UART192

    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 RTC210

    9.1.1 Exynos 4412 RTC特性210

    9.1.2 RTC Block210

    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章 ADC227

    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章 I2C241

    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 MPU6050255

    12.3.2 参考电路258

    12.3.3 MPU6050内部寄存器259

    12.3.4 代码实例:260

    第 13章 SPI264

    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 MCP2515283

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

    14.1 Bootloader304

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

    14.5.4 网络烧写U-Boot336

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

    15.1 内核启动流程概述337

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

    15.1.2 Exynos 4412内存布局339

    15.1.3 Booting Sequence340

    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章 网卡DM9000x365

    16.1 网卡概述365

    16.2 DM9000AE366

    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_BC1378

    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 pool424

    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
查看详情