我的新书上线了!
0赞我的新书《从零开始学ARM》
终于在各大平台(京东、当当、淘宝)上架了!!
亲笔签名购买链接,见文章底部
编写初衷
彭老师从事嵌入式开发工作已经16年,接触过非常多的嵌入式产品:
路由器、交换机、胖AP、瘦AP、手持终端、自组网设备、无线模组、物联网模组等;
接触过嵌入式操作系统:
vxworks、Linux、ThreadX等;
开发调试过的模块也遍布应用层和驱动层:
网络通信协议、Linux应用程序、驱动、web页面、数据库;
也写过多篇专利和软著,但是很长一段时间内,这些知识点始终都没能融会贯通起来:
硬件上电之后程序到底是如何运行的?
道如何关闭中断?
道c语言和汇编是如何互相调用?
那几万个内核文件为什么能有条不紊的编译到一个镜像文件?
如何用程序与外设交互?
操作系统是如何响应中断的?
为什么指针跑飞了会出现段错误?
uboot为什么可以下载镜像、设备树文件?
为什么开发板可以从usb、sdcard、eMMC、网络启动?
内核是如何启动的?
等等。
和大部分工程师一样,
每日疲于应付公司的项目,
而嵌入式底层的知识点很多、很杂,
想抽出完整的业余时间系统学习,难度很大。
机缘巧合,我系统学习了ARM汇编指令、ARM架构、GNU编译、裸机驱动、uboot、系统移植,
以及Linux系统程序开发+Linux驱动之后,
量变到质变,顿时豁然开朗,
回头再看之前开发的模块,
终于理解他们之间的关系,
不同平台的模块相似性和差异性,
众多看似独立的知识点终于融合在了一起,
对嵌入式系统的理解也提升了一个段位,
后面工作学习接触的新技术,
就像海绵吸水一样,很轻松融入到自己的知识体系中。
出版社找我约稿,
最终我选择了ARM这个主题。
将多年的开发和培训经验做了总结,
编写此书,同时录制了配套学习视频,
让想入门底层开发的朋友快速入门、少走弯路。
面向人群
本书主要面向想学习ARM开发技术、嵌入式底层开发的初学者,
大部分内容是从事单片机、Linux驱动开发工程师甚至硬件工程师必备知识。
内容的组织由浅入深,关键知识点均有源码实例,资料详尽,
配合B站视频学习效果更佳。
目录
上下滑动查看
第1章 CPU与ARM 2
1.1 CPU 2
1.1.1 CPU概述 2
1.1.2 计算机结构 4
1.1.3 CPU的组成 5
1.1.4 指令的运行 9
1.2 ARM 10
1.2.1 ARM的发展史 10
1.2.2 ARM架构 11
1.2.3 ARM处理器 13
1.3 SoC 26
第2章 搭建环境 30
2.1 KEIL软件安装 30
2.1.1 KEIL、µVision、MDK之间的关系 30
2.1.2 安装KEIL 31
2.1.3 创建工程 32
2.1.4 编译程序 34
2.1.5 如何debug程序 34
2.2 编译环境搭建 36
2.2.1 安装VMware Workstation 37
2.2.2 安装ubuntu 38
2.3 交叉编译工具安装 41
第3章 ARM编程 44
3.1 ARM指令格式 44
3.2 数据处理指令 45
3.2.1 mov指令 45
3.2.2 移位操作 47
3.2.3 cmp比较指令 49
3.2.4 tst条件指令 49
3.2.5 运算指令 50
3.3 跳转指令 52
3.4 访问程序状态寄存器指令 55
3.4.1 mrs指令 55
3.4.2 msr指令 55
3.4.3 综合实例 56
3.5 访问外部寄存器指令 60
3.5.1 ldr指令 60
3.5.2 str指令 60
3.5.3 ldrb指令 61
3.5.4 ldrh指令 62
3.6 ARM寻址方式 62
3.7 GNU书写风格 69
3.7.1 MDK书写风格与GNU书写风格 69
3.7.2 标号symbol(或label)70
3.7.3 语句格式 71
3.7.4 分段 72
3.8 伪操作 73
3.8.1 数据定义伪操作 74
3.8.2 汇编控制伪操作 75
3.8.3 .if.else.end if 75
3.8.4 杂项伪操作 76
3.9 GNU程序的编译 77
3.9.1 交叉编译工具 77
3.9.2 交叉编译工具命名规则 77
3.9.3 程序编译过程 77
3.9.4 编译选项 79
3.9.5 elf与bin文件 82
3.9.6 编译举例 83
3.10 ATPCS和AAPCS 87
3.11 内联汇编 89
3.12 C语言和汇编语言相互调用举例 91
第4章 异常 93
4.1 异常基础知识 93
4.2 异常处理 95
4.2.1 异常发生后硬件操作 95
4.2.2 异常向量表 95
4.2.3 保存执行现场 97
4.2.4 异常处理的返回 97
4.2.5 异常恢复 98
4.3 中断异常 99
4.3.1 中断概念 99
4.3.2 中断处理流程 99
4.4 软中断 100
4.4.1 swi指令 100
4.4.2 bkpt指令 101
4.4.3 举例 101
4.4.4 同时执行跳转指令并切换模式 103
4.4.5 获取中断号 103
编程篇
第5章 GPIO及LED 106
5.1 GPIO 106
5.1.1 Exynos 4412 GPIO的特性 107
5.1.2 LED电路图 108
5.1.3 如何操作GPIO 108
5.2 LED驱动程序编写 110
5.2.1 汇编程序 110
5.2.2 C语言程序实现 111
5.2.3 烧写程序 113
第6章 PWM 114
6.1 Exynos 4412 PWM 114
6.1.1 PWM基础知识 114
6.1.2 Exynos 4412 PWM的特性 115
6.1.3 PWM的工作步骤 116
6.2 蜂鸣器驱动程序编写 117
6.2.1 参考电路 117
6.2.2 寄存器 118
6.2.3 程序实现 120
第7章 中断 122
7.1 GIC 122
7.1.1 分发器 123
7.1.2 CPU接口 124
7.1.3 中断处理 125
7.2 按键驱动程序编写 125
7.2.1 电路图 125
7.2.2 配置按键为中断触发方式 126
7.2.3 寄存器 127
7.2.4 程序实现 131
7.3 轮询方式 133
第8章 UART 135
8.1 UART概述 135
8.1.1 UART通信方式 135
8.1.2 UART数据帧格式 137
8.2 Exynos 4412 UART控制器 138
8.2.1 UART的特性 138
8.2.2 UART内部功能模块 139
8.2.3 时钟源 140
8.3 UART的操作 141
8.3.1 参考电路 141
8.3.2 寄存器 142
8.3.3 程序实现 145
8.3.4 移植printf 148
第9章 RTC 149
9.1 Exynos 4412 RTC 149
9.1.1 Exynos 4412 RTC的特性 149
9.1.2 RTC模块 149
9.1.3 备用电池 150
9.1.4 晶体振荡器 150
9.2 RTC寄存器 151
9.3 RTC的操作 153
9.4 程序实现 157
第10章 看门狗 160
10.1 Exynos 4412 看门狗 160
10.1.1 看门狗模块图 160
10.1.2 工作原理 161
10.2 驱动编写 161
10.2.1 看门狗软件程序设计流程 161
10.2.2 看门狗寄存器设置 161
10.2.3 程序实现 163
第11章 ADC 165
11.1 信号基础知识 165
11.1.1 信号分类 165
11.1.2 脉冲编码调制(PCM)166
11.2 Exynos 4412 ADC控制器 166
11.2.1 Exynos 4412 ADC控制器的特性 166
11.2.2 ADC控制器寄存器 167
11.2.3 中断组合器 169
11.2.4 A/D转换时间计算 171
11.3 程序实现 171
11.3.1 参考电路 171
11.3.2 程序实现 172
第12章 I2C 175
12.1 I2C总线 175
12.1.1 开始条件和停止条件 175
12.1.2 数据有效性 176
12.1.3 数据传输格式 176
12.2 Exynos 4412 I2C控制器 177
12.2.1 Exynos 4412 I2C控制器概述 177
12.2.2 Exynos 4412 I2C总线接口的特点 178
12.2.3 数据读写格式 178
12.2.4 数据读写流程 179
12.2.5 I2C总线控制器寄存器 181
12.3 MPU6050及驱动程序编写 184
12.3.1 MPU6050 184
12.3.2 MPU6050参考电路 186
12.3.3 MPU6050内部寄存器 187
12.3.4 程序实现 188
第13章 SPI 192
13.1 SPI基础知识 192
13.1.1 SPI的特点 192
13.1.2 极性和相位 194
13.1.3 数据交换 196
13.2 Exynos 4412 SPI控制器 197
13.3 SPI的操作 198
13.3.1 参考电路 198
13.3.2 寄存器 200
13.3.3 初始化流程 202
13.3.4 收发数据流程 205
13.4 MCP2515 206
13.4.1 MCP2515简介 207
13.4.2 MCP2515的特点 207
13.4.3 结构框图 207
13.4.4 SPI 协议模块 208
13.4.5 SPI 指令集 208
13.4.6 MCP2515初始化 211
13.4.7 数据发送 217
13.4.8 数据接收 219
13.4.9 MCP2515驱动程序实现 221
应用篇
第14章 U-Boot 226
14.1 U-Boot概述 226
14.1.1 U-Boot的特性 227
14.1.2 工作模式 227
14.1.3 U-Boot常用命令228
14.1.4 配置举例 230
14.2 U-Boot源程序 231
14.2.1 U-Boot源程序简介 231
14.2.2 U-Boot源程序配置 234
14.2.3 U-Boot源程序编译 236
14.3 移植硬件驱动 238
14.3.1 实现串口输出 238
14.3.2 移植网卡驱动 239
14.3.3 移植Flash 241
14.4 制作SD卡 246
14.4.1 烧写脚本 246
14.4.2 制作SD卡的步骤 247
14.4.3 通过SD卡启动烧写U-Boot 248
14.4.4 网络烧写U-Boot 250
第15章 U-Boot程序启动分析 251
15.1 内核启动流程概述251
15.1.1 U-Boot启动Linux内核一般流程 251
15.1.2 Exynos 4412内存映射 252
15.1.3 启动顺序 252
15.1.4 SD卡镜像布局 254
15.1.5 lds文件 255
15.2 U-Boot启动流程程序详解 256
15.2.1 U-Boot启动程序流程 256
15.2.2 U-Boot启动详解 257
第16章 网卡DM9000AE 273
16.1 网卡概述 273
16.2 DM9000AE 274
16.2.1 DM9000AE概述 274
16.2.2 引脚说明 275
16.2.3 DM9000AE内部寄存器 279
16.3 SROM 控制器 284
16.3.1 SROM控制器概述 284
16.3.2 寄存器SROM_BW和SROM_BC 284
16.3.3 配置SROM功能 288
16.3.4 SROM初始化 293
16.4 DM9000AE驱动分析 297
16.4.1 网卡注册 297
16.4.2 相关结构体 298
16.4.3 网卡的初始化 301
16.4.4 数据的发送 305
16.4.5 数据的接收 306
16.4.6 网卡注销 309
16.5 U-Boot中的网络协议栈 309
第17章 关于汇编的两点补充 321
17.1 为什么使用结构体效率会高 321
17.1.1 定义多个全局变量 321
17.1.2 使用结构体 323
17.1.3 文字池 325
17.1.4 继续优化 325
17.2 位置无关码 326
17.2.1 为什么需要位置无关码 326
17.2.2 如何编写位置无关码 326
17.2.3 举例 327
资料获取
本书涉及的开发环境,和文中所有资料、源代码,均无偿提供。
公众号后台回复:arm
配套视频
为了更好的让各位读者学习本书内容,
彭老师正在录制本书配套的视频,并免费发布在B站
(全网同名:一口Linux),
https://space.bilibili.com/661326452
目前已经录制了第一期视频,
第二期视频对应ppt已经制作完毕,后续会陆续更新。
第一期视频:
第二期部分ppt(暂时320页):
购买链接
为了感谢众多粉丝多年支持,
暂定以7折的折扣,
用于回馈粉丝,
并有彭老师亲笔签名,
暂定300本,先购先得。
购买链接
#小程序://一口Linux/0AJJqRZQzyovtsl
最后
为感谢各位粉丝的支持,
后面会不定期在B站直播,
现场会送出一定数量的Linux知识图谱,
凡购买本书的读者,均可以参加该活动。
为不错过活动,
建议大家加我好友:yikoupeng
一起讨论学习嵌入式、Linux、网络、ARM、驱动!
望大家支持知识创作者,理性下单。
原文链接:https://mp.weixin.qq.com/s/hEc83TbFGDjlWad6yPJE-g
电子技术应用专栏作家 一口Linux