嵌入式系統原理及應用——基於ARM Cortex-M3內核的STM32F103系列微控制
內容描述
本書通過與常見的桌面通用系統比較,引入嵌入式系統的基本概念,主要介紹目前**的ARM CortexM3內核以及意法半導體公司推出的基於ARM CortexM3內核的STM32F103微控制器。
全書共分3篇 第1篇(第1、2章)為系統篇,介紹嵌入式系統及其開發的基本概念;第2篇(第3、4章)為內核篇,分析ARM CortexM3內核以及基於ARM CortexM3內核的STM32F103微控制器的體系結構、工作原理、編程模型和開發方法等;第3篇(第5~12章)為片內外設篇,基於STM32F103微控制器講述常用的片上外設∕接口,包括GPIO、定時器、EXTI、DMA、ADC、USART、SPI和I2C等,並分別給出在KEIL MDK下採用庫函數方式使用這些片上外設∕接口進行應用開發的典型案例。
本書適合作為高等院校電腦、自動化、電子信息等電氣信息類專業高年級本科生、研究生嵌入式相關課程的教材,同時可供從事嵌入式開發的技術和研究人員參考。
目錄大綱
目錄Contents
第1篇系統篇
第1章嵌入式系統概述3
1.1嵌入式系統的定義和特點3
1.1.1嵌入式系統的定義3
1.1.2嵌入式系統和通用電腦比較4
1.1.3嵌入式系統的特點5
1.2嵌入式系統的硬件6
1.2.1嵌入式處理器7
1.2.2嵌入式存儲器15
1.2.3嵌入式I/O設備18
1.2.4嵌入式I/O接口18
1.3嵌入式系統的軟件21
1.3.1無操作系統的嵌入式軟件22
1.3.2帶操作系統的嵌入式軟件24
1.4嵌入式系統的分類27
1.4.1按硬件(嵌入式處理器)劃分27
1.4.2按軟件復雜度劃分27
1.4.3按實時性劃分28
1.4.4按使用對象劃分28
1.5嵌入式系統的應用28
1.5.1國防軍事28
1.5.2工業控制29
1.5.3消費電子30
1.5.4辦公自動化產品30
1.5.5網絡和通信設備30
1.5.6汽車電子31◆嵌入式系統原理及應用目錄1.5.7金融商業31
1.5.8生物醫學32
1.5.9信息家電32
1.6本章小結34
習題134
第2章嵌入式系統開發35
2.1嵌入式系統的開發環境、開發工具和調試方式35
2.1.1嵌入式系統的開發環境35
2.1.2嵌入式系統的開發工具37
2.1.3嵌入式系統的調試方式43
2.2嵌入式系統的開發語言50
2.2.1嵌入式硬件開發語言50
2.2.2嵌入式軟件開發語言51
2.3嵌入式系統的開發過程53
2.3.1需求分析54
2.3.2系統設計55
2.3.3系統實現61
2.3.4系統測試70
2.3.5系統發布73
2.4嵌入式開發工程師之路74
2.4.1嵌入式行業和人才的現狀分析74
2.4.2嵌入式開發工程師的能力要求74
2.4.3嵌入式開發工程師的進階之路75
2.5本章小結77
習題278
第2篇內核篇
第3章ARM CortexM3處理器81
3.1ARM CortexM3組成結構81
3.1.1CortexM3內核82
3.1.2調試系統84
3.2ARM CortexM3總線接口86
3.2.1CortexM3總線接口類型87
3.2.2CortexM3總線連接方案88
3.3ARM CortexM3編程模型89
3.3.1工作狀態89
3.3.2數據類型89
3.3.3寄存器89
3.3.4指令系統93
3.3.5操作模式和特權分級96
3.3.6異常和中斷98
3.3.7雙堆棧機制105
3.4ARM CortexM3存儲器系統107
3.4.1存儲器映射107
3.4.2位帶操作110
3.4.3存儲格式112
3.5ARM CortexM3的低功耗模式113
3.6本章小結114
習題3115
第4章基於ARM CortexM3的STM32微控制器117
4.1從CortexM3到基於CortexM3的MCU117
4.2基於CortexM3的STM32系列微控制器概述118
4.2.1產品線118
4.2.2命名規則124
4.2.3生態系統125
4.2.4開發方法131
4.2.5學習之路134
4.3STM32F103微控制器基礎136
4.3.1概述136
4.3.2主系統結構137
4.3.3功能模塊139
4.3.4引腳定義140
4.3.5存儲器組織141
4.4STM32F103微控制器的最小系統145
4.4.1電源電路145
4.4.2時鐘電路148
4.4.3復位電路149
4.4.4調試和下載電路150
4.4.5其他151
4.5STM32F103微控制器的時鐘系統153
4.5.1輸入時鐘153
4.5.2系統時鐘155
4.5.3由系統時鐘分頻得到的其他時鐘155
4.5.4STM32F10x時鐘系統相關庫函數157
4.6STM32F103微控制器的低功耗模式162
4.6.1睡眠模式163
4.6.2停機模式163
4.6.3待機模式164
4.7STM32F103微控制器的安全特性165
4.7.1看門狗165
4.7.2電源檢測166
4.7.3時鐘安全系統166
4.8STM32F103微控制器的啟動過程167
4.8.1啟動過程和啟動代碼概述167
4.8.2ARM啟動代碼所需匯編語言基礎167
4.8.3STM32F103的啟動代碼分析171
4.8.4STM32F103的啟動過程分析182
4.9建立第一個STM32F103應用工程185
4.9.1STM32F10x標準外設庫的下載和認知185
4.9.2嵌入式開發工具的下載和安裝198
4.9.3配置STM32F103工程198
4.9.4編寫用戶程序源代碼206
4.9.5編譯和鏈接STM32F103工程207
4.9.6調試STM32F103工程208
4.9.7將可執行程序下載到STM32F103運行215
4.10本章小結217
習題4217
第3篇片內外設篇
第5章GPIO221
5.1GPIO概述221
5.2STM32F103的GPIO工作原理221
5.2.1內部結構222
5.2.2工作模式224
5.2.3輸出速度224
5.2.4復用功能重映射225
5.2.5外部中斷映射和事件輸出228
5.2.6主要特性228
5.3STM32F10x的GPIO相關庫函數228
5.3.1GPIO_DeInit229
5.3.2GPIO_Init229
5.3.3GPIO_SetBits231
5.3.4GPIO_ResetBits231
5.3.5GPIO_Write232
5.3.6GPIO_ReadOutputDataBit232
5.3.7GPIO_ReadOutputData232
5.3.8GPIO_ReadInputDataBit233
5.3.9GPIO_ReadInputData233
5.3.10GPIO_EXTILineConfig233
5.3.11GPIO_PinRemapConfig234
5.4STM32F103的GPIO開發實例——LED閃爍235
5.4.1功能要求235
5.4.2硬件設計235
5.4.3軟件流程設計236
5.4.4軟件代碼實現236
5.4.5軟件模擬模擬238
5.4.6下載到硬件運行241
5.4.7開發經驗小結——STM32微控制器開發的一般步驟241
5.5STM32F103的GPIO開發實例——按鍵控制LED亮滅241
5.5.1功能要求241
5.5.2硬件設計241
5.5.3軟件流程設計242
5.5.4軟件代碼實現243
5.5.5軟件模擬模擬244
5.5.6下載到硬件運行246
5.5.7開發經驗小結——使用庫函數開發STM32F103的GPIO246
5.6本章小結247
習題5248
第6章定時器249
6.1定時器概述249
6.1.1延時的實現249
6.1.2可編程定時/計數器功能概述251
6.2STM32F103的定時器概述252
6.3STM32F103的基本定時器TIM6和TIM7252
6.3.1內部結構253
6.3.2時鐘源253
6.3.3計數模式254
6.3.4主要特性254
6.4STM32F103的通用定時器TIM2—TIM5254
6.4.1內部結構254
6.4.2時鐘源256
6.4.3計數模式257
6.4.4輸出比較模式259
6.4.5PWM輸出模式259
6.4.6輸入捕獲模式262
6.4.7PWM輸入模式262
6.4.8單脈沖模式263
6.4.9編碼器接口263
6.4.10主要特性263
6.5STM32F103的高級定時器TIM1和TIM8264
6.5.1內部結構264
6.5.2時鐘源264
6.5.3功能描述266
6.5.4主要特性266
6.6STM32F10x定時器相關庫函數266
6.6.1TIM_DeInit267
6.6.2TIM_TimeBaseInit268
6.6.3TIM_OC1Init269
6.6.4TIM_OC2Init270
6.6.5TIM_OC3Init271
6.6.6TIM_OC4Init271
6.6.7TIM_OC1PreloadConfig272
6.6.8TIM_OC2PreloadConfig272
6.6.9TIM_OC3PreloadConfig272
6.6.10TIM_OC4PreloadConfig273
6.6.11TIM_ARRPreloadConfig273
6.6.12TIM_CtrlPWMOutputs274
6.6.13TIM_Cmd274
6.6.14TIM_GetFlagStatus275
6.6.15TIM_ClearFlag275
6.6.16TIM_ITConfig276
6.6.17TIM_GetITStatus276
6.6.18TIM_ClearITPendingBit277
6.7STM32F103定時器開發實例——精確定時的LED閃爍277
6.7.1功能要求277
6.7.2硬件設計277
6.7.3軟件流程設計278
6.7.4軟件代碼實現279
6.7.5軟件模擬模擬281
6.7.6下載到硬件運行283
6.7.7開發經驗小結——使用printf在調試窗口輸出284
6.8STM32F103定時器開發實例——PWM輸出285
6.8.1功能要求285
6.8.2硬件設計286
6.8.3軟件流程設計286
6.8.4軟件代碼實現288
6.8.5軟件模擬模擬289
6.8.6下載到硬件運行291
6.8.7開發經驗小結——基於無限循環的嵌入式軟件架構291
6.9本章小結292
習題6292
第7章中斷293
7.1中斷的基本概念293
7.1.1中斷源294
7.1.2中斷屏蔽294
7.1.3中斷處理過程294
7.1.4中斷優先級296
7.1.5中斷嵌套297
7.1.6中斷的利與弊298
7.2STM32F103中斷系統298
7.2.1嵌套向量中斷控制器NVIC298
7.2.2STM32F103中斷優先級299
7.2.3STM32F103中斷向量表300
7.2.4STM32F103中斷服務函數303
7.2.5STM32F103中斷設置過程304
7.3STM32F103外部中斷/事件控制器EXTI306
7.3.1內部結構307
7.3.2工作原理308
7.3.3主要特性309
7.4STM32F10x的NVIC相關庫函數309
7.4.1NVIC_PriorityGroupConfig310
7.4.2NVIC_Init310
7.4.3NVIC_DeInit313
7.5STM32F10x的EXTI相關庫函數314
7.5.1EXTI_DeInit314
7.5.2EXTI_Init314
7.5.3EXTI_GetFlagStatus316
7.5.4EXTI_ClearFlag316
7.5.5EXTI_GetITStatus317
7.5.6EXTI_ClearITPendingBit317
7.6STM32F103的中斷開發實例——按鍵控制LED亮滅318
7.6.1功能要求318
7.6.2硬件設計318
7.6.3軟件流程設計319
7.6.4軟件代碼實現320
7.6.5下載到硬件運行323
7.6.6開發經驗小結——前/後台嵌入式軟件架構323
7.7STM32F103的中斷開發實例——精確延時的LED閃爍325
7.7.1功能要求325
7.7.2硬件設計325
7.7.3軟件流程設計326
7.7.4軟件代碼實現328
7.7.5軟件代碼分析——volatile331
7.7.6軟件模擬模擬332
7.7.7下載到硬件運行334
7.7.8開發經驗小結——改進的前/後台嵌入式軟件架構334
7.8本章小結336
習題7336
第8章DMA337
8.1DMA的基本概念337
8.1.1DMA的引入337
8.1.2DMA的定義338
8.1.3DMA傳輸要素338
8.1.4DMA傳輸過程338
8.1.5DMA的特點與應用339
8.2STM32F103的DMA工作原理339
8.2.1功能框圖340
8.2.2觸發通道341
8.2.3優先級344
8.2.4傳輸模式344
8.2.5主要特性344
8.3STM32F10x的DMA相關庫函數345
8.3.1DMA_DeInit346
8.3.2DMA_Init346
8.3.3DMA_GetCurrDataCounter348
8.3.4DMA_Cmd348
8.3.5DMA_GetFlagStatus349
8.3.6DMA_ClearFlag350
8.3.7DMA_ITConfig351
8.3.8DMA_GetITStatus351
8.3.9DMA_ClearITPendingBit353
8.4STM32F103的DMA開發實例——存儲器間的數據傳輸353
8.4.1功能要求353
8.4.2硬件設計353
8.4.3軟件流程設計354
8.4.4軟件代碼實現355
8.4.5軟件代碼分析——const358
8.4.6下載硬件調試358
8.4.7開發經驗小結——使用DMA365
8.5本章小結366
習題8366
第9章ADC367
9.1ADC概述367
9.1.1ADC的由來367
9.1.2ADC的基本原理368
9.1.3ADC的性能參數370
9.1.4ADC的主要類型371
9.2STM32F103的ADC工作原理372
9.2.1主要特性373
9.2.2內部結構373
9.2.3ADC通道及分組375
9.2.4ADC觸發轉換376
9.2.5ADC時鐘和轉換時間377
9.2.6ADC工作過程378
9.2.7ADC中斷和DMA請求378
9.2.8獨立模式和雙ADC模式380
9.2.9單次和連續轉換模式380
9.2.10掃描模式381
9.2.11間斷模式383
9.2.12校準384
9.3STM32F10x的ADC相關庫函數384
9.3.1ADC_DeInit386
9.3.2ADC_Init386
9.3.3ADC_RegularChannelConfig388
9.3.4ADC_InjectedChannelConfig390
9.3.5ADC_InjectedSequencerLengthConfig390
9.3.6ADC_SetInjectedOffset391
9.3.7ADC_TampSensorVrefintCmd391
9.3.8ADC_Cmd392
9.3.9ADC_ResetCalibration392
9.3.10ADC_GetResetCalibrationStatus392
9.3.11ADC_StartCalibration393
9.3.12ADC_GetCalibrationStatus393
9.3.13ADC_SoftwareStartConvCmd394
9.3.14ADC_ExternalTrigConvCmd394
9.3.15ADC_SoftwareStartInjectedConvCmd395
9.3.16ADC_ExternalTrigInjectedConvCmd395
9.3.17ADC_ExternalTrigInjectedConvConfig396
9.3.18ADC_AutoInjectedConvCmd397
9.3.19ADC_DiscModeCmd397
9.3.20ADC_DiscModeChannelCountConfig398
9.3.21ADC_InjectedDiscModeCmd398
9.3.22ADC_GetConversionValue398
9.3.23ADC_GetInjectedConversionValue399
9.3.24ADC_GetFlagStatus399
9.3.25ADC_ClearFlag400
9.3.26ADC_ITConfig400
9.3.27ADC_GetITStatus401
9.3.28ADC_ClearITPendingBit401
9.3.29ADC_DMACmd402
9.4STM32F103的ADC開發實例——讀取GPIO引腳電壓402
9.4.1功能要求402
9.4.2硬件設計402
9.4.3軟件流程設計403
9.4.4軟件代碼實現406
9.4.5軟件模擬模擬409
9.4.6下載到硬件調試413
9.4.7開發經驗小結——使用軟件濾波降低噪聲414
9.5STM32F103的ADC開發實例——讀取芯片溫度414
9.5.1功能要求414
9.5.2硬件設計414
9.5.3軟件流程設計415
9.5.4軟件代碼實現418
9.5.5下載到硬件調試421
9.5.6開發經驗小結——輪詢、中斷和DMA422
9.6本章小結423
習題9423
第10章UART425
10.1數據通信的基本概念426
10.1.1並行和串行426
10.1.2單工、半雙工和全雙工426
10.1.3同步和異步426
10.2UART通信原理427
10.2.1UART的物理層427
10.2.2UART的協議層430
10.3STM32F103的USART工作原理432
10.3.1主要特性432
10.3.2內部結構432
10.3.3USART中斷435
10.3.4使用DMA進行USART通信436
10.4STM32F10x的USART相關庫函數437
10.4.1USART_DeInit438
10.4.2USART_Init438
10.4.3USART_Cmd439
10.4.4USART_SendData440
10.4.5USART_ReceiveData440
10.4.6USART_GetFlagStatus441
10.4.7USART_ClearFlag441
10.4.8USART_ITConfig442
10.4.9USART_GetITStatus443
10.4.10USART_ClearITPendingBit444
10.4.11USART_DMACmd444
10.5STM32F103的USART開發實例——重定向printf445
10.5.1功能要求445
10.5.2硬件設計445
10.5.3軟件流程設計446
10.5.4軟件代碼實現447
10.5.5下載到硬件運行449
10.5.6開發經驗小結——使用printf重定向到USART1451
10.6STM32F103的USART開發實例——PC串口通信452
10.6.1功能要求452
10.6.2硬件設計452
10.6.3軟件流程設計452
10.6.4軟件代碼實現452
10.6.5下載到硬件運行454
10.6.6開發經驗小結——庫函數開發STM32F103外設的一般原理455
10.7本章小結459
習題10459
第11章SPI461
11.1SPI通信原理461
11.1.1SPI的物理層462
11.1.2SPI的協議層464
11.2STM32F103的SPI工作原理469
11.2.1主要特性469
11.2.2內部結構470
11.2.3SPI主模式471
11.2.4SPI從模式472
11.2.5SPI狀態標志和中斷473
11.2.6SPI發送數據和接收數據474
11.2.7使用DMA進行SPI通信475
11.3STM32F10x的SPI相關庫函數476
11.3.1SPI_I2S_DeInit477
11.3.2SPI_Init477
11.3.3SPI_Cmd479
11.3.4SPI_I2S_SendData479
11.3.5SPI_I2S_ReceiveData480
11.3.6SPI_I2S_GetFlagStatus480
11.3.7SPI_I2S_ClearFlag481
11.3.8SPI_I2S_ITConfig481
11.3.9SPI_I2S_GetITStatus482
11.3.10SPI_I2S_ClearITPendingBit483
11.3.11SPI_I2S_DMACmd483
11.4STM32F103的SPI開發實例——讀寫SPI_FLASH484
11.4.1功能要求484
11.4.2硬件設計484
11.4.3軟件架構設計485
11.4.4軟件模塊分析486
11.4.5軟件代碼實現507
11.4.6下載硬件調試517
11.4.7下載到硬件運行522
11.4.8開發經驗小結——模塊化開發的嵌入式軟件設計523
11.5本章小結524
習題11524
第12章I2C526
12.1I2C通信原理526
12.1.1I2C的物理層527
12.1.2I2C的協議層529
12.2STM32F103的I2C工作原理533
12.2.1主要特性534
12.2.2內部結構534
12.2.3I2C從模式535
12.2.4I2C主模式537
12.2.5I2C中斷540
12.2.6使用DMA進行I2C通信540
12.3STM32F10x的I2C相關庫函數542
12.3.1I2C_DeInit543
12.3.2I2C_Init543
12.3.3I2C_Cmd545
12.3.4I2C_GenerateSTART545
12.3.5I2C_ReadRegister545
12.3.6I2C_Send7bitAddress546
12.3.7I2C_SendData546
12.3.8I2C_ReceiveData547
12.3.9I2C_CheckEvent547
12.3.10I2C_AcknowledgeConfig548
12.3.11I2C_GenerateSTOP548
12.3.12I2C_GetFlagStatus549
12.3.13I2C_ClearFlag550
12.3.14I2C_ITConfig551
12.3.15I2C_GetITStatus551
12.3.16I2C_ClearITPendingBit552
12.3.17I2C_DMACmd552
12.4STM32F103的I2C開發實例——讀寫I2C_EEPROM553
12.4.1功能要求553
12.4.2硬件設計553
12.4.3軟件架構設計554
12.4.4軟件模塊分析555
12.4.5軟件代碼實現566
12.4.6下載到硬件調試574
12.4.7下載到硬件運行577
12.4.8開發經驗小結——嵌入式驅動程序開發原理578
12.5本章小結579
習題12580
附錄AASCII碼表581
附錄BSTM32F103微控制器大容量產品系列引腳定義表583
附錄CSTM32F103微控制器中等容量產品系列引腳定義表589
附錄DSTM32F103微控制器小容量產品系列引腳定義表594