本書以意法半導體公司新推出的基于ArmCortex-M0+的STM32G071MCU為硬件平臺,以意法半導體公司的STM32CubeMX和Arm公司的KeilμVision(Arm版本)集成開發(fā)環(huán)境(以下簡稱Keil)為軟件平臺,以Cortex-M0+處理器結構、高級微控制總線結構、Cortex-M0+處理器指令集和應用、C語言應用開發(fā)、外設驅動與控制,以及RT-Thread操作系統(tǒng)為主線,由淺入深、由易到難地系統(tǒng)介紹了基于STM32G071MCU的32位嵌入式系統(tǒng)開發(fā)流程和實現(xiàn)方法。本書側重于對基于ArmCortex-M0+MCU的32位嵌入式系統(tǒng)設計應用的講解,通過典型設計實例說明將嵌入式系統(tǒng)設計應用于不同的應用場景的方法,使得所設計的嵌入式系統(tǒng)在滿足應用場景要求的條件下實現(xiàn)成本、功耗和性能的最佳平衡。
目 錄
第1章 軟件工具的下載、安裝和應用 1
1.1 STM32CubeMX工具的下載和安裝 1
1.1.1 STM32CubeMX工具的下載 1
1.1.2 STM32CubeMX工具的安裝 3
1.1.3 STM32G0系列MCU支持包的安裝 4
1.2 Keil ?Vision(Arm版本)工具的下載、安裝和授權 5
1.2.1 Keil ?Vision內(nèi)嵌編譯工具鏈架構 6
1.2.2 Keil ?Vision(Arm版本)工具的下載和安裝 6
1.2.3 Keil ?Vision(Arm版本)工具的授權 9
1.3 設計 11
實例:LED的驅動和控制 11
1.3.1 生成簡單的工程 11
1.3.2 添加設計代碼 14
1.3.3 編譯和下載設計 16
第2章 Cortex-M0+處理器結構 18
2.1 Cortex-M0+處理器和核心外設 18
2.1.1 Cortex-M0+處理器核 19
2.1.2 系統(tǒng)級接口 21
2.1.3 可配置的調試 21
2.1.4 核心外設 22
2.2 Cortex-M0+處理器的寄存器 22
2.2.1 通用寄存器 22
2.2.2 堆棧指針 23
2.2.3 程序計數(shù)器 23
2.2.4 鏈接寄存器 24
2.2.5 程序狀態(tài)寄存器 24
2.2.6 可中斷重啟指令 27
2.2.7 異常屏蔽寄存器 27
2.2.8 優(yōu)先級屏蔽寄存器 27
2.2.9 控制寄存器 27
2.3 Cortex-M0+處理器的存儲空間結構 28
2.3.1 存儲空間映射 28
2.3.2 代碼區(qū)域地址映射 30
2.3.3 SRAM區(qū)域地址映射 31
2.3.4 外設區(qū)域地址映射 32
2.3.5 PPB地址空間映射 34
2.3.6 SCS地址空間映射 35
2.3.7 系統(tǒng)控制和ID寄存器 36
2.4 Cortex-M0+處理器的端及分配 40
2.5 Cortex-M0+處理器的異常及處理 41
2.5.1 異常所處的狀態(tài) 41
2.5.2 異常類型 41
2.5.3 異常優(yōu)先級 42
2.5.4 向量表 43
2.5.5 異常的進入和返回 44
2.5.6 NVIC中的中斷寄存器集 46
2.5.7 電平和脈沖中斷 48
2.6 Cortex-M0+處理器的存儲器保護單元 49
2.6.1 MPU寄存器 50
2.6.2 MPU訪問權限屬性 54
2.6.3 更新MPU區(qū)域 55
2.6.4 子區(qū)域及用法 55
2.6.5 MPU設計技巧和提示 56
第3章 高級微控制器總線結構 57
3.1 Arm AMBA系統(tǒng)總線 57
3.2 AMBA APB規(guī)范 58
3.2.1 AMBA APB寫傳輸 58
3.2.2 AMBA APB讀傳輸 59
3.2.3 AMBA APB錯誤響應 60
3.2.4 AMBA APB操作流程 61
3.2.5 AMBA3 APB信號 62
3.3 AMBA AHB規(guī)范 62
3.3.1 AMBA AHB結構 62
3.3.2 AMBA AHB操作 63
3.3.3 AMBA AHB傳輸類型 66
3.3.4 AMBA AHB猝發(fā)操作 67
3.3.5 AMBA AHB傳輸控制信號 71
3.3.6 AMBA AHB地址譯碼 72
3.3.7 AMBA AHB從設備傳輸響應 72
3.3.8 AMBA AHB數(shù)據(jù)總線 75
3.3.9 AMBA AHB傳輸仲裁 77
3.3.10 AMBA AHB分割傳輸 82
3.3.11 AMBA AHB復位 84
3.3.12 AMBA AHB總線數(shù)據(jù)寬度 84
3.3.13 AMBA AHB接口設備 86
第4章 Cortex-M0+處理器指令集和應用 88
4.1 Thumb指令集 88
4.2 Keil MDK匯編語言指令格式要點 89
4.2.1 匯編語言源代碼中的文字 89
4.2.2 匯編語言源代碼行的語法 89
4.2.3 匯編語言指令后綴的含義 91
4.3 寄存器說明符的限制規(guī)則 91
4.3.1 使用0b1111作為寄存器說明符的規(guī)則 91
4.3.2 使用0b1101作為寄存器說明符的規(guī)則 92
4.4 寄存器傳輸指令 92
4.5 存儲器加載和保存指令 94
4.5.1 存儲器加載指令 94
4.5.2 存儲器保存指令 98
4.6 多數(shù)據(jù)加載和保存指令 101
4.6.1 多數(shù)據(jù)加載指令 101
4.6.2 多數(shù)據(jù)保存指令 102
4.7 堆棧訪問指令 103
4.8 算術運算指令 104
4.8.1 加法指令 104
4.8.2 減法指令 107
4.8.3 乘法指令 108
4.8.4 比較指令 109
4.9 邏輯操作指令 110
4.10 移位操作指令 112
4.10.1 右移指令 112
4.10.2 左移指令 114
4.11 反序操作指令 115
4.12 擴展操作指令 116
4.13 程序流控制指令 117
4.14 存儲器屏障指令 120
4.15 異常相關指令 121
4.16 休眠相關指令 121
4.17 其他指令 122
4.18 STM32G0的向量表格式 123
4.19 配置堆和堆棧 124
4.20 設計實例一:匯編語言程序的分析和調試 125
4.20.1 冒泡排序算法的基本思想 125
4.20.2 冒泡排序算法的設計實現(xiàn) 126
4.20.3 冒泡排序算法的調試 128
4.21 設計實例二:GPIO的驅動和控制 130
4.21.1 STM32G071的GPIO原理 130
4.21.2 所用寄存器的地址和功能 132
4.21.3 GPIO驅動和控制的實現(xiàn) 134
4.22 設計實例三:中斷的控制和實現(xiàn) 135
4.22.1 擴展中斷和事件控制器(EXTI)原理 136
4.22.2 所用寄存器的地址和功能 141
4.22.3 向量表信息 145
4.22.4 應用程序的設計 147
4.22.5 程序代碼的調試 149
第5章 Cortex-M0+ C語言應用開發(fā) 151
5.1 Arm C/C++編譯器選項 151
5.1.1 Arm編譯器的優(yōu)化級別 151
5.1.2 Arm Compiler 5的參數(shù)設置選項 155
5.1.3 Arm Compiler 6的參數(shù)設置選項 157
5.2 CMSIS軟件架構 159
5.2.1 引入CMSIS的必要性 160
5.2.2 CMSIS的架構 160
5.2.3 CMSIS的優(yōu)勢 161
5.2.4 CMSIS的編程規(guī)則 161
5.2.5 CMSIS軟件包 162
5.2.6 使用CMSIS訪問不同資源 163
5.3 C語言設計實例一:輸入/輸出重定向的實現(xiàn) 164
5.3.1 定制Microlib輸入/輸出函數(shù) 164
5.3.2 輸入/輸出函數(shù)重定向的實現(xiàn)原理 165
5.3.3 輸入/輸出函數(shù)重定向的具體實現(xiàn) 166
5.4 C語言設計實例二:1602字符型LCD的驅動 171
5.4.1 1602字符型LCD的原理 171
5.4.2 1602字符型LCD的處理流程 174
5.4.3 1602字符型LCD和開發(fā)板的硬件連接 175
5.4.4 程序代碼的設計 176
5.5 C語言設計實例三:中斷控制與1602字符型LCD的交互 178
5.5.1 程序代碼的設計 178
5.5.2 C語言中斷程序的分析 179
5.6 C語言設計實例四:軟件驅動的設計與實現(xiàn) 181
5.6.1 創(chuàng)建HAL的設計實例 181
5.6.2 創(chuàng)建LL的設計實例 183
第6章 電源、時鐘和復位的原理及應用 186
6.1 電源系統(tǒng)的原理及功能 186
6.1.1 電源系統(tǒng)框架 186
6.1.2 電源監(jiān)控 188
6.1.3 低功耗模式 190
6.2 RCC中的時鐘管理功能 194
6.2.1 RCC中的時鐘源 194
6.2.2 RCC中的時鐘樹結構 194
6.3 RCC中的復位管理功能 199
6.3.1 電源復位 199
6.3.2 系統(tǒng)復位 199
6.3.3 RTC域復位 200
6.4 低功耗設計實例一:從停止模式喚醒MCU的實現(xiàn) 201
6.4.1 設計策略和實現(xiàn)目標 201
6.4.2 程序設計和實現(xiàn) 201
6.5 低功耗設計實例二:定時器喚醒功耗分析 206
6.6 低功耗設計實例三:運行模式和低功耗模式狀態(tài)的顯示 210
6.6.1 第一種設計實現(xiàn)方法 210
6.6.2 第二種設計實現(xiàn)方法 212
第7章 看門狗的原理和應用 214
7.1 獨立看門狗的原理和功能 214
7.1.1 IWDG的結構 214
7.1.2 IWDG的工作原理 215
7.1.3 IWDG時鐘基準和超時的設置 216
7.2 系統(tǒng)窗口看門狗的原理和功能 216
7.2.1 WWDG的結構 216
7.2.2 WWDG的工作原理 217
7.2.3 WWDG時鐘基準和超時值的設置 217
7.2.4 WWDG中斷 218
7.3 獨立看門狗設計實例:實現(xiàn)與分析 218
7.3.1 生成工程框架 218
7.3.2 添加設計代碼 220
7.3.3 設計下載和分析 222
第8章 步進電機的驅動和控制 223
8.1 低功耗定時器的結構及功能 223
8.1.1 LPTIM的結構 223
8.1.2 LPTIM的功能 228
8.2 高級控制定時器的結構及功能 229
8.2.1 TIM1的結構 229
8.2.2 TIM1的功能 230
8.3 設計實例:步進電機的驅動和信號測量 265
8.3.1 步進電機的設計原理 265
8.3.2 步進電機的驅動電路 266
8.3.3 霍爾傳感器的測速原理 267
8.3.4 系統(tǒng)硬件連接 268
8.3.5 在STM32CubeMX中配置參數(shù) 268
8.3.6 在Keil ?Vision中添加設計代碼 271
8.3.7 設計處理和驗證 274
第9章 直流電機的驅動和控制 276
9.1 脈沖寬度調制的原理 276
9.2 直流風扇的驅動原理 276
9.2.1 直流風扇的規(guī)范和連線 276
9.2.2 PWM速度控制功能 277
9.2.3 脈沖傳感器(轉速輸出類型) 278
9.3 通用定時器的原理 278
9.3.1 TIM2/TIM3/TIM4的主要功能 279
9.3.2 TIM14的主要功能 280
9.3.3 TIM15的主要功能 281
9.3.4 TIM16/TIM17的主要功能 282
9.4 直流風扇驅動和測速的設計與實現(xiàn) 283
9.4.1 系統(tǒng)設計策略 283
9.4.2 系統(tǒng)硬件連接 284
9.4.3 應用程序的設計 285
9.4.4 設計處理和下載 291
第10章 紅外串口通信的設計和實現(xiàn) 292
10.1 低功耗通用異步收發(fā)器的原理 292
10.1.1 模塊結構 292
10.1.2 接口信號 294
10.1.3 數(shù)據(jù)格式 294
10.1.4 FIFO模式 296
10.1.5 單線半雙工模式 296
10.1.6 多處理器通信 296
10.1.7 發(fā)送器原理 298
10.1.8 接收器原理 298
10.1.9 波特率發(fā)生器 299
10.1.10 喚醒和中斷事件 300
10.2 通用同步異步收發(fā)器的原理 301
10.2.1 主要功能 301
10.2.2 接收器過采樣技術 302
10.2.3 同步模式 303
10.2.4 ISO/IEC 7816模式 304
10.2.5 串行紅外通信 305
10.2.6 自動波特率檢測 306
10.2.7 接收器超時 306
10.2.8 喚醒和中斷事件 306
10.3 設計實例:基于LPUART和紅外接口的串行通信的實現(xiàn) 307
10.3.1 紅外串行通信設計思路 307
10.3.2 串口的通信參數(shù)配置規(guī)則 308
10.3.3 紅外發(fā)射電路和紅外接收電路的設計 309
10.3.4 紅外接口的原理 311
10.3.5 信號的編碼與解碼 313
10.3.6 紅外通信系統(tǒng)的抗干擾設計 313
10.3.7 發(fā)送端應用程序的設計與實現(xiàn) 314
10.3.8 接收端應用程序的設計與實現(xiàn) 319
第11章 音頻設備的驅動和控制 325
11.1 外設串行接口概述 325
11.1.1 SPI模塊的主要特性 325
11.1.2 I2S模塊的主要特性 326
11.2 SPI模塊的結構和功能 326
11.2.1 SPI模塊的結構 326
11.2.2 一個主設備和一個從設備的通信 327
11.2.3 標準的多個從設備通信 329
11.2.4 多個主設備通信 330
11.2.5 從設備選擇引腳管理 330
11.2.6 通信格式 331
11.2.7 配置SPI 332
11.2.8 使能SPI的步驟 333
11.2.9 數(shù)據(jù)發(fā)送和接收過程 333
11.2.10 SPI狀態(tài)位 340
11.2.11 SPI錯誤標志 341
11.2.12 NSS脈沖模式 342
11.2.13 TI模式 342
11.2.14 CRC計算 343
11.2.15 SPI中斷 344
11.3 I2S模塊的結構和功能 345
11.3.1 I2S模塊的結構 345
11.3.2 支持的音頻標準 346
11.3.3 啟動說明 349
11.3.4 I2S時鐘生成器 350
11.3.5 I2S主模式 352
11.3.6 I2S從模式 353
11.3.7 I2S狀態(tài)位 354
11.3.8 I2S錯誤標志 355
11.3.9 DMA功能 356
11.3.10 I2S中斷 356
11.4 設計實例:I2S模塊與音頻設備的交互設計 356
11.4.1 數(shù)字音頻接口 358
11.4.2 音頻數(shù)據(jù)格式 358
11.4.3 音頻模塊硬件電路 359
11.4.4 在STM32CubeMX中配置參數(shù) 360
11.4.5 在Keil ?Vision中修改設計代碼 362
11.4.6 設計處理和驗證 365
第12章 實時時鐘的原理和電子鐘實現(xiàn) 366
12.1 實時時鐘的原理及功能 366
12.1.1 RTC的功能和結構 366
12.1.2 RTC低功耗模式 377
12.1.3 RTC中斷 377
12.2 I2C總線的原理及功能 377
12.2.1 I2C模塊的結構 378
12.2.2 I2C可編程時序 381
12.2.3 I2C主設備時鐘 382
12.2.4 從設備尋址模式 383
12.2.5 從停止模式喚醒 384
12.2.6 數(shù)據(jù)傳輸?shù)奶幚?385
12.2.7 從模式 386
12.2.8 對SMBus的支持 387
12.2.9 中斷和DMA 388
12.2.10 低功耗模式 389
12.3 OLED顯示模塊的原理 389
12.3.1 OLED的性能和參數(shù) 389
12.3.2 OLED模塊的電路 390
12.3.3 I2C總線寫數(shù)據(jù) 392
12.3.4 I2C的寫模式 392
12.3.5 I2C的數(shù)據(jù)位傳輸 393
12.3.6 圖形顯示數(shù)據(jù)RAM 394
12.3.7 存儲器尋址模式 395
12.3.8 OLED的初始化命令序列 396
12.4 電子鐘的應用設計 397
12.4.1 在STM32CubeMX中配置參數(shù) 397
12.4.2 在Keil ?Vision中添加設計代碼 401
12.4.3 設計下載和測試 414
第13章 直接存儲器訪問的原理和實現(xiàn) 416
13.1 DMA模塊的原理 416
13.1.1 STM32G071 MCU系統(tǒng)結構 416
13.1.2 DMA模塊的結構 417
13.1.3 DMA傳輸 417
13.1.4 DMA仲裁 418
13.1.5 DMA通道 418
13.1.6 DMA數(shù)據(jù)寬度、對齊和端 421
13.1.7 DMA中斷 422
13.2 DMA請求多路選擇器的原理 422
13.2.1 DMAMUX的結構 422
13.2.2 DMAMUX映射 424
13.2.3 DMAMUX通道 426
13.2.4 DMAMUX請求多路選擇器 426
13.2.5 同步模式和通道事件生成 426
13.2.6 DMAMUX請求生成器 428
13.2.7 DMAMUX中斷 429
13.3 設計實例:基于DMA的數(shù)據(jù)傳輸實現(xiàn) 429
13.3.1 在STM32CubeMX中配置參數(shù) 429
13.3.2 在Keil ?Vision中添加設計代碼 432
13.3.3 設計下載和調試 434
第14章 信號采集和處理的實現(xiàn) 435
14.1 ADC結構和功能 435
14.1.1 ADC內(nèi)部結構 435
14.1.2 低功耗模式 435
14.1.3 高性能特性 438
14.1.4 ADC轉換速度 439
14.1.5 ADC時鐘的選擇 439
14.1.6 ADC輸入與ADC的連接關系 440
14.1.7 ADC轉換模式 440
14.1.8 模擬看門狗 441
14.1.9 數(shù)據(jù)傳輸和中斷 442
14.2 溫度傳感器和內(nèi)部參考電壓 442
14.2.1 讀取溫度 443
14.2.2 使用內(nèi)部參考電壓計算實際VREF+ 444
14.3 電池電壓的監(jiān)控 444
14.4 設計實例一:模擬信號的采集與顯示 444
14.4.1 在STM32CubeMX中配置參數(shù) 444
14.4.2 在Keil ?Vision中添加設計代碼 448
14.4.3 設計下載和調試 452
14.5 DAC結構和功能 453
14.5.1 DAC內(nèi)部結構 453
14.5.2 DAC通道使能 456
14.5.3 DAC數(shù)據(jù)格式 456
14.5.4 DAC轉換 456
14.5.5 DAC電壓 457
14.5.6 DAC觸發(fā)選擇 457
14.5.7 DMA請求 457
14.5.8 噪聲生成 458
14.5.9 生成三角波 458
14.5.10 DAC通道模式 459
14.5.11 DAC通道緩沖區(qū)標定 461
14.5.12 雙DAC通道轉換模式(如果可用) 462
14.5.13 低功耗模式 466
14.6 基本定時器結構和功能 466
14.7 設計實例二:使用示波器上的X-Y模式顯示不同的圖形 467
14.7.1 設計目標和設計思路 467
14.7.2 在STM32CubeMX中配置參數(shù) 467
14.7.3 在Keil ?Vision中添加設計代碼 471
14.7.4 設計下載和測試 480
第15章 嵌入式操作系統(tǒng)原理及應用 483
15.1 操作系統(tǒng)的必要性 483
15.1.1 單任務程序 483
15.1.2 輪詢程序 483
15.2 操作系統(tǒng)基本知識 484
15.2.1 操作系統(tǒng)的作用 484
15.2.2 操作系統(tǒng)的功能 484
15.2.3 嵌入式操作系統(tǒng) 487
15.3 RT-Thread Nano架構及功能 489
15.4 RT-Thread Nano在Keil MDK的移植 490
15.4.1 安裝RT-Thread Nano 490
15.4.2 添加RT-Thread Nano 491
15.4.3 適配RT-Thread Nano 493
15.4.4 修改設計代碼 494
15.4.5 配置RT-Thread Nano 495
15.5 RT-Thread Nano內(nèi)核分析與實現(xiàn) 497
15.5.1 線程及其管理 498
15.5.2 線程的創(chuàng)建及調度的實現(xiàn) 503
15.5.3 定時器的使用 509
15.5.4 互斥量的使用 511