本书通过与常见的桌面通用系统比较,引入嵌入式系统的基本概念,主要介绍目前的ARM CortexM3内核以及意法半导体公司推出的基于ARM CortexM3内核的STM32F103微控制器。 全书共分3篇 第1篇(第1、2章)为系统篇,介绍嵌入式系统及其开发的基本概念;第2篇(第3、4章)为内核篇,分析ARM CortexM3内核以及基于ARM CortexM3内核的STM32F103微控制器的体系结构、工作原理、编程模型和开发方法等;第3篇(第5~12章)为片内外设篇,基于STM32F103微控制器讲述常用的片上外设?M接口,包括GPIO、定时器、EXTI、DMA、ADC、USART、SPI和I2C等,并分别给出在KEIL MDK下采用库函数方式使用这些片上外设?M接口进行应用开发的典型案例。 本书适合作为高等院校计算机、自动化、电子信息等电气信息类专业高年级本科生、研究生嵌入式相关课程的教材,同时可供从事嵌入式开发的技术和研究人员参考。
本书首先通过与个人计算机(PC)的比较,引出嵌入式系统的基本概念,从零开始、由浅入深引导读者进入嵌入式系统的世界,讲解嵌入式系统的开发过程,然后以目前的ARM Cortex-M3内核以及意法半导体公司推出的基于ARM Cortex-M3内核的STM32F103微控制器为目标硬件平台,按照基本原理、内部结构、工作机制和相关库函数的顺序循序渐进、逐步展开,详细介绍STM32F103微控制器各个常用片上外设∕接口(包括GPIO、定时器、EXTI、DMA、ADC、USART、SPI和I2C等),并给出在嵌入式软件开发工具KEIL MDK下使用C语言采用库函数方式开发STM32F103微控制器的典型案例。 为了降低读者的学习成本和学习难度,本书不仅提供了书中所有程序的源码,而且在STM32F103微控制器典型开发案例中回顾了嵌入式相关的硬件基础知识、C语言编程技巧和方法。针对目前身边暂时没有STM32F103微控制器硬件的读者,本书还介绍嵌入式系统的软件仿真调试方法,指导读者在嵌入式软件开发工具KEIL MDK下调试自己编写的基于STM32F103微控制器的应用程序,使读者无需购买嵌入式硬件开发板也可以完成对自己编写的嵌入式程序的调试和验证。 本书适合作为高等院校计算机、自动化、电子信息等电气信息类专业高年级本科生、研究生“嵌入式”相关课程的教材,同时可供从事嵌入式开发的技术和研究人员参考。尤其面向嵌入式初学者,本书在调研和分析当前嵌入式开发工程师的人才需求和能力要求的基础上,提出了从嵌入式“菜鸟”到嵌入式工程师的进阶之路。
第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<