第1篇 系统篇 3
第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
习题1 34
第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
习题2 78
第2篇 内 核篇 81
第3章 ARM Cortex-M3处理器 81
3.1 ARM Cortex-M3组成结构 81
3.1.1 Cortex-M3内核 82
3.1.2 调试系统 84
3.2 ARM Cortex-M3总线接口 86
3.2.1 Cortex-M3总线接口类型 87
3.2.2 Cortex-M3总线连接方案 88
3.3 ARM Cortex-M3编程模型 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.4 ARM Cortex-M3存储器系统 107
3.4.1 存储器映射 107
3.4.2 位带操作 110
3.4.3 存储格式 112
3.5 ARM Cortex-M3的低功耗模式 113
3.6 本章小结 114
习题3 115
第4章 基于ARM Cortex-M3的STM32微控制器 117
4.1 从Cortex-M3到基于Cortex-M3的MCU 117
4.2 基于Cortex-M3的STM32系列微控制器概述 118
4.2.1 产品线 118
4.2.2 命名规则 124
4.2.3 生态系统 125
4.2.4 开发方法 131
4.2.5 学习之路 134
4.3 STM32F103微控制器基础 136
4.3.1 概述 136
4.3.2 主系统结构 137
4.3.3 功能模块 139
4.3.4 引脚定义 140
4.3.5 存储器组织 141
4.4 STM32F103微控制器的最小系统 145
4.4.1 电源电路 145
4.4.2 时钟电路 148
4.4.3 复位电路 149
4.4.4 调试和下载电路 150
4.4.5 其他 151
4.5 STM32F103微控制器的时钟系统 153
4.5.1 输入时钟 153
4.5.2 系统时钟 155
4.5.3 由系统时钟分频得到的其他时钟 155
4.5.4 STM32F10x时钟系统相关库函数 157
4.6 STM32F103微控制器的低功耗模式 162
4.6.1 睡眠模式 163
4.6.2 停机模式 163
4.6.3 待机模式 164
4.7 STM32F103微控制器的安全特性 165
4.7.1 看门狗 165
4.7.2 电源检测 166
4.7.3 时钟安全系统 166
4.8 STM32F103微控制器的启动过程 167
4.8.1 启动过程和启动代码概述 167
4.8.2 ARM启动代码所需汇编语言基础 167
4.8.3 STM32F103的启动代码分析 171
4.8.4 STM32F103的启动过程分析 182
4.9 建立第一个STM32F103应用工程 185
4.9.1 STM32F10x标准外设库的下载和认知 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
习题4 217
第3篇 片内外设篇 221
第5章 GPIO 221
5.1 GPIO概述 221
5.2 STM32F103的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.3 STM32F10x的GPIO相关库函数 228
5.3.1 GPIO_DeInit 229
5.3.2 GPIO_Init 229
5.3.3 GPIO_SetBits 231
5.3.4 GPIO_ResetBits 231
5.3.5 GPIO_Write 232
5.3.6 GPIO_ReadOutputDataBit 232
5.3.7 GPIO_Read OutputData 232
5.3.8 GPIO_ReadInputDataBit 233
5.3.9 GPIO_ReadInputData 233
5.3.10 GPIO_EXTILineConfig 233
5.3.11 GPIO_PinRemapConfig 234
5.4 STM32F103的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.5 STM32F103的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的GPIO 246
5.6 本章小结 247
习题5 248
第6章 定时器 249
6.1 定时器概述 249
6.1.1 延时的实现 249
6.1.2 可编程定时/计数器功能概述 251
6.2 STM32F103的定时器概述 252
6.3 STM32F103的基本定时器TIM6和TIM7 252
6.3.1 内部结构 253
6.3.2 时钟源 253
6.3.3 计数模式 254
6.3.4 主要特性 254
6.4 STM32F103的通用定时器TIM2—TIM5 254
6.4.1 内部结构 254
6.4.2 时钟源 256
6.4.3 计数模式 257
6.4.4 输出比较模式 259
6.4.5 PWM输出模式 259
6.4.6 输入捕获模式 262
6.4.7 PWM输入模式 262
6.4.8 单脉冲模式 263
6.4.9 编码器接口 263
6.4.10 主要特性 263
6.5 STM32F103的高级定时器TIM1和TIM8 264
6.5.1 内部结构 264
6.5.2 时钟源 264
6.5.3 功能描述 266
6.5.4 主要特性 266
6.6 STM32F10x定时器相关库函数 266
6.6.1 TIM_DeInit 267
6.6.2 TIM_TimeBaseInit 268
6.6.3 TIM_OC1Init 269
6.6.4 TIM_OC2Init 270
6.6.5 TIM_OC3Init 271
6.6.6 TIM_OC4Init 271
6.6.7 TIM_OC1PreloadConfig 272
6.6.8 TIM_OC2PreloadConfig 272
6.6.9 TIM_OC3PreloadConfig 272
6.6.10 TIM_OC4PreloadConfig 273
6.6.11 TIM_ARRPreloadConfig 273
6.6.12 TIM_CtrlPWMOutputs 274
6.6.13 TIM_Cmd 274
6.6.14 TIM_GetFlagStatus 275
6.6.15 TIM_ClearFlag 275
6.6.16 TIM_ITConfig 276
6.6.17 TIM_GetITStatus 276
6.6.18 TIM_ClearITPendingBit 277
6.7 STM32F103定时器开发实例——精确定时的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.8 STM32F103定时器开发实例——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
习题6 292
第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.2 STM32F103中断系统 298
7.2.1 嵌套向量中断控制器NVIC 298
7.2.2 STM32F103中断优先级 299
7.2.3 STM32F103中断向量表 300
7.2.4 STM32F103中断服务函数 303
7.2.5 STM32F103中断设置过程 304
7.3 STM32F103外部中断/事件控制器EXTI 306
7.3.1 内部结构 307
7.3.2 工作原理 308
7.3.3 主要特性 309
7.4 STM32F10x的NVIC相关库函数 309
7.4.1 NVIC_PriorityGroupConfig 310
7.4.2 NVIC_Init 310
7.4.3 NVIC_DeInit 313
7.5 STM32F10x的EXTI相关库函数 314
7.5.1 EXTI_DeInit 314
7.5.2 EXTI_Init 314
7.5.3 EXTI_GetFlagStatus 316
7.5.4 EXTI_ClearFlag 316
7.5.5 EXTI_GetITStatus 317
7.5.6 EXTI_ClearITPendingBit 317
7.6 STM32F103的中断开发实例——按键控制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.7 STM32F103的中断开发实例——精确延时的LED闪烁 325
7.7.1 功能要求 325
7.7.2 硬件设计 325
7.7.3 软件流程设计 326
7.7.4 软件代码实现 328
7.7.5 软件代码分析——volatile 331
7.7.6 软件模拟仿真 332
7.7.7 下载到硬件运行 334
7.7.8 开发经验小结——改进的前/后台嵌入式软件架构 334
7.8 本章小结 336
习题7 336
第8章 DMA 337
8.1 DMA的基本概念 337
8.1.1 DMA的引入 337
8.1.2 DMA的定义 338
8.1.3 DMA传输要素 338
8.1.4 DMA传输过程 338
8.1.5 DMA的特点与应用 339
8.2 STM32F103的DMA工作原理 339
8.2.1 功能框图 340
8.2.2 触发通道 341
8.2.3 优先级 344
8.2.4 传输模式 344
8.2.5 主要特性 344
8.3 STM32F10x的DMA相关库函数 345
8.3.1 DMA_DeInit 346
8.3.2 DMA_Init 346
8.3.3 DMA_GetCurrDataCounter 348
8.3.4 DMA_Cmd 348
8.3.5 DMA_GetFlagStatus 349
8.3.6 DMA_ClearFlag 350
8.3.7 DMA_ITConfig 351
8.3.8 DMA_GetITStatus 351
8.3.9 DMA_ClearITPendingBit 353
8.4 STM32F103的DMA开发实例——存储器间的数据传输 353
8.4.1 功能要求 353
8.4.2 硬件设计 353
8.4.3 软件流程设计 354
8.4.4 软件代码实现 355
8.4.5 软件代码分析——const 358
8.4.6 下载硬件调试 358
8.4.7 开发经验小结——使用DMA 365
8.5 本章小结 366
习题8 366
第9章 ADC 367
9.1 ADC概述 367
9.1.1 ADC的由来 367
9.1.2 ADC的基本原理 368
9.1.3 ADC的性能参数 370
9.1.4 ADC的主要类型 371
9.2 STM32F103的ADC工作原理 372
9.2.1 主要特性 373
9.2.2 内部结构 373
9.2.3 ADC通道及分组 375
9.2.4 ADC触发转换 376
9.2.5 ADC时钟和转换时间 377
9.2.6 ADC工作过程 378
9.2.7 ADC中断和DMA请求 378
9.2.8 独立模式和双ADC模式 380
9.2.9 单次和连续转换模式 380
9.2.10 扫描模式 381
9.2.11 间断模式 383
9.2.12 校准 384
9.3 STM32F10x的ADC相关库函数 384
9.3.1 ADC_DeInit 386
9.3.2 ADC_Init 386
9.3.3 ADC_RegularChannelConfig 388
9.3.4 ADC_InjectedChannelConfig 390
9.3.5 ADC_InjectedSequencerLengthConfig 390
9.3.6 ADC_SetInjectedOffset 391
9.3.7 ADC_TampSensorVrefintCmd 391
9.3.8 ADC_Cmd 392
9.3.9 ADC_ResetCalibration 392
9.3.10 ADC_GetResetCalibrationStatus 392
9.3.11 ADC_StartCalibration 393
9.3.12 ADC_GetCalibrationStatus 393
9.3.13 ADC_SoftwareStartConvCmd 394
9.3.14 ADC_ExternalTrigConvCmd 394
9.3.15 ADC_SoftwareStartInjectedConvCmd 395
9.3.16 ADC_ExternalTrigInjectedConvCmd 395
9.3.17 ADC_ExternalTrigInjectedConvConfig 396
9.3.18 ADC_AutoInjectedConvCmd 397
9.3.19 ADC DiscModeCmd 397
9.3.20 ADC_DiscModeChannelCountConfig 398
9.3.21 ADC_ Inj ectedDiscModeCmd 398
9.3.22 ADC GetConversionValue 398
9.3.23 ADC_GetInjectedConversionValue 399
9.3.24 ADC_GetFlagStatus 399
9.3.25 ADC_ClearFlag 400
9.3.26 ADC_ITConfig 400
9.3.27 ADC GetITStatus 401
9.3.28 ADC_ClearITPendingBit 401
9.3.29 ADC DMACmd 402
9.4 STM32F103的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.5 STM32F103的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 开发经验小结——轮询、中断和DMA 422
9.6 本章小结 423
习题9 423
第10章 UART 425
10.1 数据通信的基本概念 426
10.1.1 并行和串行 426
10.1.2 单工、半双工和全双工 426
10.1.3 同步和异步 426
10.2 UART通信原理 427
10.2.1 UART的物理层 427
10.2.2 UART的协议层 430
10.3 STM32F103的USART工作原理 432
10.3.1 主要特性 432
10.3.2 内部结构 432
10.3.3 USART中断 435
10.3.4 使用DMA进行USART通信 436
10.4 STM32F10x的USART相关库函数 437
10.4.1 USART DeInit 438
10.4.2 USART Init 438
10.4.3 USART Cmd 439
10.4.4 USART SendData 440
10.4.5 USART ReceiveData 440
10.4.6 USART_GetFlagStatus 441
10.4.7 USART_ClearFlag 441
10.4.8 USART_ITConfig 442
10.4.9 USART GetITStatus 443
10.4.10 USART_ ClearITPendingBit 444
10.4.11 USART DMACmd 444
10.5 STM32F103的USART开发实例——重定向printf 445
10.5.1 功能要求 445
10.5.2 硬件设计 445
10.5.3 软件流程设计 446
10.5.4 软件代码实现 447
10.5.5 下载到硬件运行 449
10.5.6 开发经验小结——使用printf重定向到USART1 451
10.6 STM32F103的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
习题10 459
第11章 SPI 461
11.1 SPI通信原理 461
11.1.1 SPI的物理层 462
11.1.2 SPI的协议层 464
11.2 STM32F103的SPI工作原理 469
11.2.1 主要特性 469
11.2.2 内部结构 470
11.2.3 SPI主模式 471
11.2.4 SPI从模式 472
11.2.5 SPI状态标志和中断 473
11.2.6 SPI发送数据和接收数据 474
11.2.7 使用DMA进行SPI通信 475
11.3 STM32F10x的SPI相关库函数 476
11.3.1 SPI_ I2S_ DeInit 477
11.3.2 SPI_ Init 477
11.3.3 SPI_ Cmd 479
11.3.4 SPI_ I2S_ SendData 479
11.3.5 SPI_ I2S_ ReceiveData 480
11.3.6 SPI_I2S_GetFlagStatus 480
11.3.7 SPI_I2S_ClearFlag 481
11.3.8 SPI_I2S_ITConfig 481
11.3.9 SPI_I2S_GetITStatus 482
11.3.10 SPI_I2S_ClearITPendingBit 483
11.3.11 SPI_I2S_DMACmd 483
11.4 STM32F103的SPI开发实例——读写SPI_FLASH 484
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
习题11 524
第12章 I2C 526
12.1 I2C通信原理 526
12.1.1 I2C的物理层 527
12.1.2 I2C的协议层 529
12.2 STM32F103的I2C工作原理 533
12.2.1 主要特性 534
12.2.2 内部结构 534
12.2.3 I2C从模式 535
12.2.4 I2C主模式 537
12.2.5 I2C中断 540
12.2.6 使用DMA进行I2C通信 540
12.3 STM32F10x的I2C相关库函数 542
12.3.1 I2C_DeInit 543
12.3.2 I2C_Init 543
12.3.3 I2C_Cmd 545
12.3.4 I2C_GenerateSTART 545
12.3.5 I2C_ReadRegister 545
12.3.6 I2C_Send7bitAddress 546
12.3.7 I2C_SendData 546
12.3.8 I2C_ReceiveData 547
12.3.9 I2C_CheckEvent 547
12.3.10 I2C_AcknowledgeConfig 548
12.3.11 I2C_GenerateSTOP 548
12.3.12 I2C_GetFlagStatus 549
12.3.13 I2C_ClearFlag 550
12.3.14 I2C_ITConfig 551
12.3.15 I2C_GetITStatus 551
12.3.16 I2C_ClearITPendingBit 552
12.3.17 I2C_DMACmd 552
12.4 STM32F103的I2C开发实例——读写I2C_EEPROM 553
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
习题12 580
附录A ASCII码表 581
附录B STM32F103微控制器大容量产品系列引脚定义表 583
附录C STM32F103微控制器中等容量产品系列引脚定义表 589