從零開始學 ARM

彭丹 周海濤

  • 出版商: 人民郵電
  • 出版日期: 2023-05-01
  • 售價: $599
  • 貴賓價: 9.5$569
  • 語言: 簡體中文
  • 頁數: 330
  • ISBN: 7115606889
  • ISBN-13: 9787115606884
  • 相關分類: ARMC 程式語言嵌入式系統
  • 立即出貨 (庫存 < 3)

  • 從零開始學 ARM-preview-1
  • 從零開始學 ARM-preview-2
從零開始學 ARM-preview-1

買這商品的人也買了...

商品描述

本書主要介紹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