基本介紹
- 中文名:跟工程師學嵌入式開發 ——基於STM32和μC/OS-III
- 作者:譚貴
- 出版時間:2017年10月1日
- 出版社:電子工業出版社
- 頁數:448 頁
- ISBN:9787121327254
- 定價:88.00
- 開本:16 開
- 裝幀:平裝
內容簡介,作者簡介,目錄,
內容簡介
本書選用的STM32晶片基於ARM Cortex-M3體系結構,根據基於MCU的嵌入式技術實際套用需求,合理地選擇了多種常用的重要外設接口,如USART、SPI、I2C、FSCM、SDIO匯流排、乙太網等,結合豐富的實例及工程原始碼,由淺入深、系統全面地介紹嵌入式系統的底層工作原理。在此過程中,通過穿插多個綜合示例的講解,如命令行外殼程式Shell、eFat檔案系統、Telnet遠程控制、?C/OS-III實時作業系統的移植過程,無論是嵌入式的初學者,還是有一定開發經驗的工程師都能從中獲益,使讀者既能系統全面地掌握嵌入式開發所需的軟硬體知識,又能鍛鍊他們的綜合開發能力,為將來從事嵌入式開發方面的工作奠定堅實的基礎。
作者簡介
譚貴,男,北京大學計算機科學與技術學士畢業,現供職於富士康科技集團,熱愛嵌入式開發技術,精通C、Java語言,Tcl和bash腳本套用;熟悉從MCU裸板外設驅動開發和uCosII實時作業系統的移植,以及基於Linux系統的嵌入式套用開發。
目錄
第1章 開發利器:STM32庫和MDK Keil 1
1.1 學習啟航:閃爍的跑馬燈 1
1.1.1 實驗結果呈現 1
1.1.2 實驗分析 2
1.1.3 配置GPIO引腳 5
1.1.4 實驗控制邏輯 6
1.2 STM32庫結構和CMSIS標準 8
1.2.1 STM32庫層次結構 9
1.2.2 CMSIS層次結構 9
1.2.3 STM32庫結構中的檔案關係 10
1.2.4 STM32庫函式命名規則 13
1.2.5 STM32庫常見的幾個狀態類型 13
1.3 工程開發環境設定 14
1.3.1 有關MDK 14
1.3.2 使用MDK建立工程的步驟 15
第2章 STM32體系結構 25
2.1 匯流排與通信接口 25
2.1.1 匯流排組成 25
2.1.2 重要的匯流排術語 26
2.2 STM32功能框架 27
2.2.1 系統組成 27
2.2.2 匯流排單元及掛接設備 28
2.3 STM32存儲器映射 29
2.3.1 獨立編址 30
2.3.2 統一編址(存儲器映像編址) 31
2.3.3 CM3外設地址空間映射 32
2.3.4 地址空間映射詳解 34
2.4 STM32時鐘結構 39
2.4.1 STM32F103ZET6的時鐘樹 39
2.4.2 時鐘樹二級框架 40
2.4.3 時鐘啟用過程 41
2.5 系統時鐘樹與地址空間映射的關係 43
第3章 STM32系統啟動過程分析 44
3.1 CM3的復位序列 44
3.1.1 堆疊 45
3.1.2 向量表 47
3.2 STM32啟動代碼分析 49
3.3 STM32系統時鐘初始化 52
3.3.1 時鐘源的選擇 52
3.3.2 系統時鐘設定 56
3.4 程式運行環境初始化函式__main() 60
3.4.1 回顧編譯和連結過程 60
3.4.2 映像檔案的組成 61
3.4.3 映像的載入過程 63
3.4.4 由MDK集成環境自動生成的分散載入檔案 65
3.4.5 _main()函式的作用 66
第4章 通用GPIO操作 68
4.1 實驗結果預覽:LED跑馬燈 68
4.2 GPIO基本知識 68
4.2.1 GPIO分組管理及其引腳 69
4.2.2 GPIO工作模式及其配置 69
4.2.3 GPIO引腳的寫入和讀出 71
4.3 實驗代碼解析 74
4.3.1 實驗現象原理分析 74
4.3.2 原始碼分析 78
4.4 創建工程 81
4.4.1 建立工程目錄結構 81
4.4.2 導入原始碼檔案 81
4.4.3 編譯執行 82
4.5 編譯調試 82
4.5.1 調試方法 82
4.5.2 棧和變數觀察視窗 83
4.5.3 運行程式並調試:一個函式一個斷點 84
4.5.4 運行程式並調試:多個函式多個斷點 86
第5章 外部中斷EXTI操作 90
5.1 實驗結果預覽:LED跑馬燈_中斷控制 90
5.2 異常與中斷 91
5.2.1 Cortex-M3的異常向量 91
5.2.2 異常向量表 92
5.3 NVIC與中斷控制 93
5.3.1 NVIC簡述 93
5.3.2 NVIC與外部中斷 93
5.3.3 NVIC中斷的優先權 94
5.3.4 NVIC初始化 95
5.4 EXTI基本知識 97
5.4.1 EXTI簡介 97
5.4.2 EXTI控制器組成結構 97
5.4.3 GPIO引腳到EXTI_Line的映射 100
5.4.4 EXTI_Line到NVIC的映射 102
5.5 實驗代碼解析 103
5.5.1 工程源碼的邏輯結構 103
5.5.2 實驗代碼軟硬體原理 104
5.5.3 實驗代碼分析 107
5.6 創建工程 109
5.6.1 建立工程目錄結構 109
5.6.2 導入原始碼檔案 109
5.6.3 編譯執行 110
5.7 編譯調試 111
5.7.1 打開記憶體視窗 111
5.7.2 設定斷點 111
5.7.3 運行程式並調試 112
第6章 USART接口 115
6.1 實驗結果預覽 115
6.1.1 實驗準備工作 115
6.1.2 實驗現象描述 116
6.2 USART基本知識 117
6.2.1 串列異步通信協定 117
6.2.2 USART與接口標準RS-232 118
6.3 STM32 USART結構 119
6.3.1 USART工作模式 119
6.3.2 精簡的USART結構 119
6.3.3 USART單位元組收發過程 120
6.4 USART暫存器位功能定義 121
6.4.1 狀態暫存器(USART_SR) 121
6.4.2 數據暫存器(USART_DR) 122
6.4.3 控制暫存器1(USART_CR1) 122
6.4.4 控制暫存器2(USART_CR2) 123
6.4.5 控制暫存器3(USART_CR3) 123
6.4.6 分數波特率暫存器USART_BRR 124
6.4.7 USART模組暫存器組 125
6.4.8 USART模組初始化函式 126
6.4.9 USART常用函式功能說明 127
6.5 USART實驗代碼分析 128
6.5.1 實驗電路(硬體連線關係) 128
6.5.2 工程原始碼檔案層次結構 130
6.5.3 套用層(主程式控制邏輯) 131
6.5.4 用戶驅動層 133
6.5.5 函式printf()重定向 135
6.6 創建工程 135
6.6.1 建立工程目錄結構 135
6.6.2 創建檔案組和導入源檔案 136
6.6.3 編譯執行 137
第7章 USART綜合套用:命令行外殼程式Shell 138
7.1 實驗結果預覽 138
7.2 基於USART的I/O函式 139
7.2.1 字元及字元串獲取函式:xgetc()和xgets() 139
7.2.2 字元及字元串列印函式:xputc()和xputs() 141
7.3 可變參數輸出函式xprintf() 142
7.3.1 可變參數 142
7.3.2 可變參數宏的使用與作用 143
7.3.3 用可變參數宏實現自己的格式化輸出函式xprintf() 144
7.4 Shell外殼 145
7.4.1 Shell命令管理結構 146
7.4.2 Shell命令解析過程 147
7.4.3 命令函式之參數解析 150
7.5 建立工程,編譯和運行 151
7.5.1 創建和配置工程 151
7.5.2 編譯執行 153
第8章 I2C接口 154
8.1 實驗結果預覽:輪詢寫入/讀出EEPROM數據 154
8.2 I2C匯流排協定 155
8.2.1 匯流排特點 155
8.2.2 I2C套用結構 155
8.2.3 匯流排信號時序分析 156
8.3 STM32 I2C模組 158
8.3.1 I2C組成框圖 158
8.3.2 I2C主模式工作流程 159
8.3.3 I2C中斷及DMA請求 161
8.4 I2C EEPROM讀寫示例及分析 162
8.4.1 示例電路連線 162
8.4.2 app.c檔案中的main()函式 163
8.4.3 eeprom.h檔案 166
8.4.4 eeprom.c檔案 167
8.4.5 shell.c檔案 174
8.5 建立工程,編譯及運行 175
8.5.1 創建和配置工程 175
8.5.2 編譯執行 176
第9章 DMA接口 177
9.1 實驗結果預覽 177
9.2 通用DMA的作用及特徵 178
9.3 STM32 DMA基本知識 178
9.3.1 DMA與系統其他模組關係圖 178
9.3.2 STM32 DMA組成 179
9.4 實驗示例分析 183
9.4.1 main.c檔案中的main()函式 184
9.4.2 USART1的初始化 184
9.4.3 DMA通道中斷處理函式 189
9.4.4 sysTick中斷處理函式 190
9.4.5 DMA通道配置的其他暫存器 191
9.4.6 DMA用戶測試命令及其執行函式 192
9.5 建立工程,編譯和執行 193
9.5.1 建立以下工程資料夾 194
9.5.2 創建檔案組和導入源檔案 194
9.5.3 編譯運行 194
第10章 實時時鐘RTC 195
10.1 實驗結果預覽 195
10.2 STM32 RTC模組 196
10.2.1 STM32後備供電區域 196
10.2.2 RTC組成 199
10.3 RTC實驗設計與源碼分析 204
10.3.1 硬體連線和GPIO資源 204
10.3.2 實驗原始碼邏輯結構 204
10.3.3 原始碼分析 205
10.4 建立工程,編譯和執行 212
10.4.1 建立以下工程資料夾 212
10.4.2 創建檔案組和導入源檔案 212
10.4.3 編譯執行 213
第11章 系統定時器SysTick 214
11.1 SysTick簡述 214
11.2 SysTick工作過程 214
11.3 SysTick暫存器位功能定義 215
11.3.1 控制和狀態暫存器:STK_CTRL 215
11.3.2 重載暫存器:STK_LOAD 216
11.3.3 當前計數值暫存器:STK_VAL 217
11.3.4 校正暫存器:STK_CALIB 217
11.3.5 SysTick模組暫存器組 217
11.3.6 配置SysTick定時器 218
11.4 基於SysTick的延時函式代碼分析 220
11.4.1 實現原理 220
11.4.2 實現代碼分析 220
11.4.3 基於SysTick延時的LED閃爍命令 223
11.5 建立工程,編譯和執行 224
11.5.1 建立以下工程資料夾 224
11.5.2 創建檔案組和導入源檔案 224
11.5.3 編譯運行 226
第12章 SPI接口 227
12.1 實驗現象預覽:輪詢寫入/讀出SPI Flash數據 227
12.2 SPI匯流排協定 228
12.2.1 匯流排信號及其套用結構 228
12.2.2 SPI內部結構與工作原理 229
12.3 STM32 SPI模組 231
12.3.1 SPI組成框圖 231
12.3.2 STM32 SPI主模式數據收發過程 232
12.3.3 SPI中斷及DMA請求 234
12.4 W25Q128FV規格說明 234
12.4.1 W25Q128FV狀態和控制管理 235
12.4.2 W25Q128FV常用指令 236
12.5 程式入口與SPI初始化代碼 237
12.5.1 實驗硬體資源 237
12.5.2 工程入口檔案main.c 238
12.5.3 spiflash.c檔案中的spiFlash_Init()函式 239
12.6 SPI Flash測試代碼分析 243
12.6.1 spiflash.c檔案中的SPI Flash測試函式spiTest() 244
12.6.2 SPI Flash ID讀取函式sFLASH_readID() 245
12.6.3 扇區擦除函式sFLASH_eraseSector() 246
12.6.4 Flash頁寫函式sFLASH_writePage() 246
12.6.5 Flash讀函式sFLASH_readBuffer() 247
12.6.6 Flash位元組傳送函式sFLASH_SendByte() 248
12.7 向Shell添加SPI測試指令spitest 249
12.8 建立工程,編譯和執行 250
12.8.1 建立以下工程資料夾 250
12.8.2 創建檔案組和導入源檔案 250
12.8.3 編譯運行 252
第13章 網路接口:乙太網 253
13.1 網路體系結構簡介 253
13.1.1 三種網路模型 253
13.1.2 乙太網標準(Ethernet) 256
13.2 ENC28J60知識 257
13.2.1 ENC28J60概述 257
13.2.2 控制暫存器 259
13.2.3 乙太網緩衝器 260
13.2.4 PHY暫存器 261
13.2.5 ENC28J60 SPI指令集 261
13.2.6 ENC28J60初始化 263
13.2.7 使用ENC28J60收發數據 268
13.2.8 ENC28J60驅動代碼總結 272
13.3 uIP協定棧簡介 274
13.3.1 uIP特性 274
13.3.2 uIP套用接口 275
13.3.3 uIP的初始化及配置函式 277
13.3.4 uIP的主程式循環 277
13.4 uIP移植分析 279
13.4.1 下載uIP1.0版源碼檔案 279
13.4.2 理解兩個中間層檔案與套用層和協定層之間的關係 280
13.4.3 添加uIP協定棧後的工程檔案組 285
第14章 綜合示例:基於uIP的Telnet服務 286
14.1 實驗現象預覽 286
14.2 Telnet遠程登錄協定 287
14.2.1 Telnet概述 287
14.2.2 Telnet協定主要技術 288
14.2.3 Telnet命令 288
14.3 Telnetd服務框架及實現 290
14.3.1 本實驗Telnetd服務框架 290
14.3.2 Telnetd服務框架的實現 291
14.4 上層套用與uIP協定的接口:telnetd_appcall() 304
14.5 建立工程,編譯和運行 309
14.5.1 創建和配置工程 309
14.5.2 編譯執行 311
第15章 SDIO匯流排協定與SD卡操作 312
15.1 SD卡簡介 312
15.1.1 SD卡家族 312
15.1.2 SD卡引腳功能定義 313
15.1.3 SD卡內部組成 314
15.1.4 SD卡容量規格 315
15.1.5 SDIO接口規範和匯流排套用拓撲 315
15.2 SD協定 316
15.2.1 工作模式與狀態 316
15.2.2 命令和回響格式 316
15.2.3 卡識別模式 317
15.2.4 數據傳輸模式 320
15.3 STM32 SDIO控制器 322
15.3.1 控制器總體結構描述 322
15.3.2 SDIO適配器模組 323
15.3.3 SDIO AHB接口 325
15.4 工程入口及配置 326
15.4.1 實驗硬體資源 326
15.4.2 工程入口檔案main.c 327
15.5 SDIO初始化 328
15.5.1 SD卡上電初始化函式SD_PowerON() 330
15.5.2 SD卡規格信息獲取函式SD_InitializeCards() 336
15.6 SDIO卡測試代碼分析 339
15.6.1 塊擦除 340
15.6.2 多塊寫 342
15.6.3 多塊讀 345
15.7 建立工程,編譯和運行 348
15.7.1 建立以下工程資料夾 348
15.7.2 創建檔案組和導入源檔案 348
15.7.3 編譯執行 349
第16章 移植檔案系統FatFs 350
16.1 實驗現象預覽:基於Shell的檔案系統命令 350
16.2 FatFs檔案系統 351
16.2.1 FatFs特點 351
16.2.2 FatFs在設備系統中的層次與接口 351
16.3 移植FatFs檔案系統 352
16.3.1 FatFs原始碼結構 352
16.3.2 基於FatFs套用的常用數據類型說明 353
16.3.3 FatFs的移植 355
16.4 FatFs檔案系統套用示例分析 357
16.4.1 工程原始碼邏輯 357
16.4.2 工程原始碼分析 358
16.5 建立工程,編譯和運行 363
16.5.1 創建和配置工程 363
16.5.2 編譯執行 364
第17章 無線接入:Wi-Fi模組ESP8266套用 365
17.1 無線技術標準:IEEE 802.11 365
17.1.1 IEEE 802.11簡介 365
17.1.2 無線區域網路的組網拓撲 366
17.1.3 無線接入過程的三個階段 367
17.2 ESP-WROOM-02模組 368
17.2.1 ESP-WROOM-02性能參數 368
17.2.2 ESP-WROOM-02與主機系統的電路連線 369
17.3 ESP-WROOM-02指令集 370
17.3.1 ESP8266 AT常用指令 370
17.3.2 使用ESP-WROOM-02進行真實通信 373
17.4 封裝ESP-WROOM-02的配置函式 375
17.4.1 ESP-WROOM-02的初始化函式 375
17.4.2 ESP-WROOM-02的配置函式 377
17.4.3 最佳化USART接收快取的數據結構 379
17.4.4 ESP-WROOM-02的Shell操作命令 381
17.5 建立工程,編譯和運行 384
17.5.1 工程程式檔案 384
17.5.2 創建和配置工程 384
17.5.3 編譯執行 385
第18章 移植?C/OS-III作業系統 387
18.1 ?C/OS-III基礎 387
18.1.1 ?C/OS-III簡介 387
18.1.2 ?C/OS-III核心組成架構 388
18.2 ?C/OS-III任務基礎 390
18.2.1 任務狀態 390
18.2.2 任務控制塊和就緒任務表 391
18.2.3 創建任務 391
18.2.4 任務同步與通信 393
18.3 ?C/OS-III的信號量 393
18.3.1 信號量分類及其套用 393
18.3.2 信號量工作方式 394
18.3.3 信號量套用操作步驟 396
18.4 ?C/OS-III的訊息佇列 396
18.4.1 訊息佇列工作模型 397
18.4.2 訊息佇列套用操作步驟 397
18.5 ?C/OS-III的事件標誌組 398
18.5.1 事件標誌組工作模型 398
18.5.2 事件標誌組套用操作步驟 399
18.6 信號量、訊息佇列和事件標誌組綜合示例 399
18.6.1 綜合示例任務關係圖 400
18.6.2 任務代碼頭檔案task.h 400
18.6.3 任務代碼C檔案task.c 402
18.6.4 中斷異常處理檔案stm32f10x_it.c 409
18.7 ?C/OS-III移植 410
18.7.1 ?C/OS-III源碼組織架構 410
18.7.2 簡化?C/OS-III源碼組織架構 411
18.7.3 建立基於?C/OS-III的工程 412
18.7.4 ?C/OS-III綜合示例運行效果 414
第19章 基於?C/OS-III的信息系統 415
19.1 系統功能描述 415
19.1.1 系統任務劃分 415
19.1.2 系統實際運行效果 415
19.2 系統任務設計分析 417
19.2.1 Shell任務 417
19.2.2 LED燈閃爍任務 420
19.2.3 事件監測任務 420
19.2.4 系統統計任務 422
19.2.5 無線通信處理任務 425
19.3 工程原始碼(檔案)整合 428
19.3.1 主檔案main.c 428
19.3.2 任務頭檔案task.h 428
19.3.3 includes.h檔案 429
19.3.4 任務實現檔案task.c 430
19.4 建立工程,編譯和運行 430
19.4.1 建立工程原始碼結構 430
19.4.2 建立檔案組,導入源檔案 430
19.4.3 編譯執行 431
參考文獻 432