從零開始學 ARM
彭丹 周海濤
買這商品的人也買了...
-
$512嵌入式 Linux 應用開發完全手冊
-
$690$538 -
$680$537 -
$683嵌入式 Linux 基礎教程, 2/e (Embedded Linux Primer: A Practical Real-World Approach, 2/e)
-
$336嵌入式 Linux 與物聯網軟件開發 : C語言內核深度解析
-
$414$393 -
$954$906 -
$600$468 -
$620$490 -
$414$393 -
$534$507 -
$750$593 -
$659$626 -
$449零基礎學 FPGA 設計 — 理解硬件編程思想
-
$750$562 -
$450$297 -
$1,280$1,011 -
$720$562 -
$680$537 -
$980$686 -
$534$507 -
$607SoC 設計指南:基於 Arm Cortex-M
-
$352二進制安全基礎
-
$600$474 -
$490$387
商品描述
本書主要介紹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與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