第1章 STM32F051xx系列芯片简介 1
1.1 STM32F051xx系列芯片功能简介 1
1.2 功能概述 3
1.2.1 内核 3
1.2.2 存储器 3
1.2.3 循环冗余校验计算单元(CRC) 3
1.2.4 直接存储器访问控制器(DMA) 3
1.2.5 向量嵌套中断控制器(NVIC) 4
1.2.6 扩展中断/事件控制器(EXTI) 4
1.2.7 时钟和启动 4
1.2.8 引导模式 4
1.2.9 电源管理 5
1.2.10 低功耗模式 5
1.2.11 实时时钟(RTC)和后备寄存器 6
1.2.12 定时器 6
1.2.13 看门狗 8
1.2.14 SysTick定时器 8
1.2.15 两线串行接口I2C 8
1.2.16 通用同步/异步收发器(USART) 9
1.2.17 高清晰度多媒体接口(HDMI)——消费电子控制(CEC) 9
1.2.18 通用输入/输出端口(GPIO) 9
1.2.19 触摸传感控制器(TSC) 9
1.2.20 模数转换器(ADC) 9
1.2.21 数模转换器(DAC) 10
1.2.22 快速比较器 10
1.2.23 两线串行调试端口(SW-DP) 10
第2章 开发板硬件结构 11
2.1 电路原理图 11
2.2 原理图说明 13
2.2.1 电源电路 13
2.2.2 系统复位电路 14
2.2.3 时钟电路 14
2.2.4 JTAG接口电路 15
2.2.5 串口电路 15
2.2.6 键盘电路 15
2.2.7 LED灯电路 16
2.2.8 I2C接口电路 17
2.2.9 ADC电路 18
2.2.10 SPI接口电路 18
2.3 开发板元器件布局图 19
第3章 编译开发环境的建立 21
3.1 下载和安装EWARM 21
3.2 IDE界面简介 23
3.3 生成一个新项目 24
3.3.1 建立项目文件目录并复制文件 24
3.3.2 生成新的工作区 25
3.3.3 生成新项目 25
3.3.4 给项目添加文件 27
3.4 配置项目选项 28
3.4.1 通用选项设置(General Options) 28
3.4.2 C/C++编译器选项设置(C/C++ Compiler) 29
3.4.3 Assembler选项设置(Assembler) 30
3.4.4 Output Converter选项设置 30
3.4.5 Debugger选项设置 31
3.5 串口调试助手介绍 31
第4章 通用和复用I/O口 33
4.1 GPIO功能描述 33
4.1.1 GPIO主要特性 33
4.1.2 GPIO主要功能 33
4.1.3 通用I/O口 34
4.1.4 I/O引脚的复用功能和重映射 34
4.1.5 I/O端口控制寄存器 35
4.1.6 I/O端口数据寄存器 35
4.1.7 I/O数据位处理 35
4.1.8 GPIO口锁定 36
4.1.9 I/O口复用功能 36
4.1.10 外部中断和唤醒 36
4.1.11 输入配置 36
4.1.12 输出配置 36
4.1.13 模拟输入配置 37
4.2 GPIO库函数 37
4.2.1 函数GPIO_eInit 38
4.2.2 函数GPIO_Init 38
4.2.3 函数GPIO_PinLockConfig 39
4.2.4 函数GPIO_ReadInputDataBit 40
4.2.5 函数GPIO_ReadInputData 40
4.2.6 函数GPIO_ReadOutputDataBit 41
4.2.7 函数GPIO_ReadOutputData 41
4.2.8 函数GPIO_SetBits 41
4.2.9 函数GPIO_ResetBits 42
4.2.10 函数GPIO_WriteBit 42
4.2.11 函数GPIO_Write 43
4.2.12 函数GPIO_PinAFConfig 43
4.3 位运算 45
4.3.1 移位运算 45
4.3.2 按位“与”运算(&) 47
4.3.3 按位“或”运算(|) 48
4.3.4 取反运算(~) 49
4.3.5 异或运算符(^) 49
4.4 I/O口输出实例1——控制LED灯 49
4.4.1 实例目的和要求 49
4.4.2 硬件基础 50
4.4.3 软件结构 50
4.4.4 实例代码 50
4.4.5 编译下载 59
4.5 I/O口输出实例2——流水灯 60
4.5.1 实例要求 60
4.5.2 硬件基础 60
4.5.3 软件结构 61
4.5.4 实例代码 61
4.5.5 编译下载 63
4.6 I/O口输入实例1——按键输入1 64
4.6.1 实例要求 64
4.6.2 硬件基础 64
4.6.3 软件结构 64
4.6.4 实例代码 65
4.6.5 编译下载和调试 67
4.7 I/O口输入实例2——按键输入2 69
4.7.1 实例要求 69
4.7.2 硬件基础 69
4.7.3 软件结构 69
4.7.4 实例代码 70
第5章 USART串口的一般应用 73
5.1 USART功能描述 73
5.1.1 USART主要功能 73
5.1.2 USART扩展功能 74
5.1.3 USART不同工作模式 74
5.1.4 发送器 75
5.1.5 接收器 76
5.1.6 分数比特率的产生 77
5.1.7 自动比特率检测 77
5.1.8 多机通信 78
5.1.9 USART同步模式 79
5.1.10 单线半双工模式 80
5.1.11 智能卡模式 81
5.1.12 IrDA SIR ENDEC功能模块 82
5.1.13 用DMA实现连续通信 84
5.1.14 USART中断 85
5.2 USART串口库函数 85
5.2.1 函数USART_Init 85
5.2.2 函数USART_Cmd 87
5.2.3 函数USART_ITConfig 88
5.2.4 函数USART_SendData 89
5.2.5 函数USART_ReceiveData 89
5.2.6 函数USART_GetFlagStatus 89
5.2.7 函数USART_ClearFlag 90
5.2.8 函数USART_GetITStatus 91
5.2.9 函数USART_ClearITPendingBit 92
5.3 USART通信实例1——串口发送数据 92
5.3.1 实例要求 92
5.3.2 硬件基础 92
5.3.3 软件结构 93
5.3.4 实例代码 95
5.3.5 编译下载和调试 97
5.4 USART通信实例2——中断接收数据 98
5.4.1 实例要求 98
5.4.2 硬件基础 98
5.4.3 软件结构 99
5.4.4 实例代码 99
5.4.5 编译下载和调试 101
5.5 使用队列收发数据实例 101
第6章 系统定时器 104
6.1 系统定时器概述 104
6.2 库函数介绍 104
6.3 系统定时器实例——节拍定时器实例 105
6.3.1 实例要求 105
6.3.2 软件结构 105
6.3.3 实例代码 105
6.3.4 编译下载和调试 106
6.4 有实际应用意义的键盘实例 106
6.4.1 实例要求 106
6.4.2 软件结构 107
6.4.3 实例代码 107
6.4.4 编译下载和调试 109
第7章 中断和事件 113
7.1 中断和事件概述 113
7.1.1 嵌套向量中断控制器(NVIC) 113
7.1.2 外部中断和事件控制器(EXTI) 114
7.2 库函数介绍 117
7.2.1 函数NVIC_Init 117
7.2.2 函数EXTI_DeInit 119
7.2.3 函数EXTI_Init 119
7.2.4 函数EXTI_GenerateSWInterrupt 121
7.2.5 函数EXTI_GetFlagStatus 121
7.2.6 函数EXTI_ClearFlag 121
7.2.7 函数EXTI_GetITStatus 122
7.3 外部中断实例 122
7.3.1 实例目的 122
7.3.2 实例要求 122
7.3.3 硬件基础 123
7.3.4 软件结构 123
7.3.5 实例代码 125
7.3.6 编译下载和调试 127
7.4 中断嵌套实例 127
7.4.1 实例目的 127
7.4.2 实例要求 127
7.4.3 硬件基础 127
7.4.4 软件结构 127
7.4.5 实例代码 127
7.4.6 编译下载和调试 130
第8章 实时时钟(RTC) 131
8.1 实时时钟简介 131
8.1.1 RTC主要特性 131
8.1.2 RTC功能模块 131
8.1.3 时钟和预分频器 132
8.1.4 实时时钟和日历 133
8.1.5 可编程报警 133
8.1.6 RTC初始化及配置 133
8.1.7 读日历寄存器 135
8.1.8 复位过程 136
8.1.9 RTC同步 136
8.1.10 RTC参考时钟检测 136
8.1.11 RTC平滑数字校准 137
8.1.12 时间戳功能 138
8.1.13 侵入检测 139
8.1.14 校准时钟输出 140
8.1.15 报警输出 141
8.1.16 RTC低功耗模式 141
8.1.17 RTC中断 141
8.2 RTC实时时钟库函数介绍 142
8.2.1 函数RTC_Init 142
8.2.2 函数RTC_SetTime 143
8.2.3 函数RTC_GetTime 144
8.2.4 函数RTC_GetSubSecond 144
8.2.5 函数RTC_SetDate 144
8.2.6 函数RTC_SetAlarm 145
8.2.7 函数RTC_ITConfig 146
8.3 实时时钟实例——万年历 147
8.3.1 实例目的 147
8.3.2 实例要求 147
8.3.3 硬件基础 147
8.3.4 软件结构 147
8.3.5 实例代码 149
8.3.6 编译下载和调试 153
第9章 通用SPI的一般应用 154
9.1 SPI简介 154
9.1.1 SPI特征 154
9.1.2 SPI引脚描述 155
9.1.3 数据传输模式 156
9.1.4 SPI从模式 157
9.1.5 SPI主模式 158
9.1.6 状态标志 158
9.1.7 利用DMA的SPI通信 159
9.1.8 SPI中断 159
9.2 SPI库函数介绍 159
9.2.1 函数SPI_Init 160
9.2.2 函数SPI_Cmd 162
9.2.3 函数SPI_I2S_ITConfig 163
9.2.4 函数SPI_I2S_DMACmd 163
9.2.5 函数SPI_SendData8 164
9.2.6 函数SPI_ReceiveData8 164
9.2.7 函数SPI_I2S_GetFlagStatus 165
9.2.8 函数SPI_I2S_ClearFlag 165
9.2.9 函数SPI_I2S_GetITStatus 166
9.3 SPI通信实例——发送数据 166
9.3.1 实例要求 166
9.3.2 硬件基础 166
9.3.3 软件结构 167
9.3.4 实例代码 168
9.3.5 编译下载和调试 172
第10章 I2C接口的一般应用 173
10.1 I2C简介 173
10.1.1 I2C主要特点 173
10.1.2 I2C功能描述 173
10.2 I2C库函数 183
10.2.1 函数I2C_DeInit 183
10.2.2 函数I2C_Init 184
10.2.3 函数I2C_Cmd 185
10.2.4 函数I2C_GenerateSTART 186
10.2.5 函数I2C_GenerateSTOP 186
10.2.6 函数I2C_AcknowledgeConfig 186
10.2.7 函数I2C_OwnAddress2Config 187
10.2.8 函数I2C_DualAddressCmd 187
10.2.9 函数I2C_GeneralCallCmd 188
10.2.10 函数I2C_ITConfig 188
10.2.11 函数I2C_SendData 189
10.2.12 函数I2C_ReceiveData 189
10.2.13 函数I2C_Send7bitAddress 190
10.2.14 函数I2C_ReadRegister 191
10.2.15 函数I2C_SoftwareResetCmd 191
10.2.16 函数I2C_TransferHandling 192
10.2.17 函数I2C_GetFlagStatus 193
10.3 I2C读写24C02实例 194
10.3.1 实例要求 194
10.3.2 硬件基础 194
10.3.3 24C02器件介绍 194
10.3.4 软件结构 196
10.3.5 实例代码 197
10.3.6 编译下载和调试 200
第11章 ADC的一般应用 201
11.1 ADC功能介绍 201
11.1.1 ADC主要特性 201
11.1.2 ADC引脚和内部信号 202
11.1.3 ADC功能描述 202
11.1.4 转换的外部触发和触发极性(EXTSEL、EXTEN) 206
11.1.5 数据对齐 208
11.1.6 低功耗特性 210
11.1.7 模拟窗口看门狗(AWDEN、AWDSGL、AWDCH、AWD_HTR/LTR、AWD) 211
11.1.8 温度传感器 212
11.1.9 电池电压监测 213
11.1.10 ADC中断 213
11.2 实现ADC最佳精度 213
11.2.1 ADC模块自身相关的误差 213
11.2.2 与环境相关的ADC误差 216
11.2.3 如何减小与外部环境相关的ADC误差 219
11.3 ADC库函数 226
11.3.1 函数ADC_DeInit 226
11.3.2 函数ADC_Init 226
11.3.3 函数ADC_Cmd 228
11.3.4 函数ADC_DMACmd 228
11.3.5 函数ADC_ITConfig 229
11.3.6 函数ADC_GetCalibrationFactor 230
11.3.7 函数ADC_StartOfConversion 230
11.3.8 函数ADC_ChannelConfig 230
11.3.9 函数ADC_StructInit 232
11.3.10 函数ADC_AnalogWatchdogCmd 232
11.3.11 函数ADC_AnalogWatchdogThresholdsConfig 233
11.3.12 函数ADC_AnalogWatchdogSingleChannelCmd 233
11.3.13 函数ADC_AnalogWatchdogSingleChannelConfig 234
11.3.14 函数ADC_TempSensorCmd 235
11.3.15 函数ADC_VrefintCmd 235
11.3.16 函数ADC_VbatCmd 236
11.3.17 函数ADC_GetConversionValue 236
11.3.18 函数ADC_DMACmd 237
11.3.19 函数ADC_DMARequestModeConfig 237
11.3.20 函数ADC_GetFlagStatus 238
11.3.21 函数ADC_GetITStatus 238
11.3.22 函数ADC_ClearITPendingBit 239
11.4 ADC数据采集实例1——单通道数据采集 239
11.4.1 实例要求 239
11.4.2 硬件基础 239
11.4.3 软件结构 240
11.4.4 实例代码 243
11.4.5 编译下载和调试 246
11.5 ADC数据采集实例2——周围温度采集 246
11.5.1 实例要求 246
11.5.2 硬件基础 247
11.5.3 软件结构 247
11.5.4 实例代码 247
11.5.5 编译下载和调试 250
第12章 嵌入式闪存的基本操作 251
12.1 嵌入式闪存介绍 251
12.1.1 闪存主要特性 251
12.1.2 闪存模块组织 251
12.1.3 读保护 252
12.1.4 FLASH写和擦除操作 253
12.1.5 存储保护 255
12.1.6 写保护 256
12.2 FLASH固件库函数 257
12.2.1 函数FLASH_SetLatency 257
12.2.2 函数FLASH_PrefetchBufferCmd 258
12.2.3 函数FLASH_Unlock 258
12.2.4 函数FLASH_Lock 259
12.2.5 函数FLASH_ErasePage 259
12.2.6 函数FLASH_EraseAllPages 259
12.2.7 函数FLASH_ProgramWord 260
12.2.8 函数FLASH_ProgramHalfWord 260
12.3 FLASH读写实例 261
12.3.1 实例要求 261
12.3.2 硬件基础 261
12.3.3 软件结构 261
12.3.4 实例代码 262
12.3.5 编译下载和调试 264
第13章 定时器的一般应用 265
13.1 定时器功能介绍 265
13.1.1 定时器主要功能 265
13.1.2 定时器功能描述 266
13.1.3 调试模式 281
13.2 定时器固件库 282
13.2.1 函数TIM_DeInit 282
13.2.2 函数TIM_TimeBaseInit 282
13.2.3 函数TIM_OC1Init 284
13.2.4 函数TIM_OC2Init 286
13.2.5 函数TIM_OC3Init 286
13.2.6 函数TIM1_OC4Init 287
13.2.7 函数TIM_ICInit function 288
13.2.8 函数TIM_BDTRConfig 289
13.2.9 函数TIM_Cmd 291
13.2.10 函数TIM_CtrlPWMOutputs 292
13.2.11 函数TIM_ITConfig 292
13.2.12 函数TIM_SelectInputTrigger 293
13.2.13 函数TIM_EncoderInterfaceConfig 293
13.2.14 函数TIM_ARRPreloadConfig 294
13.2.15 函数TIM_CCPreloadControl 295
13.2.16 函数TIM_OC1PreloadConfig 295
13.2.17 函数TIM_OC2PreloadConfig 296
13.2.18 函数TIM_OC3PreloadConfig 296
13.2.19 函数TIM_OC4PreloadConfig 297
13.2.20 函数TIM_SelectOutputTrigger 297
13.2.21 函数TIM_SelectSlaveMode 298
13.2.22 函数TIM_SelectMasterSlaveMode 298
13.2.23 函数TIM_SetCounter 299
13.2.24 函数TIM_SetAutoreload 299
13.2.25 函数TIM_GetCounter 300
13.2.26 函数TIM_GetPrescaler 300
13.2.27 函数TIM_GetFlagStatus 301
13.2.28 函数TIM_ClearFlag 302
13.2.29 函数TIM_GetITStatus 302
13.2.30 函数TIM_ClearITPendingBit 302
13.3 TIME应用实例1——简单定时器应用 303
13.3.1 实例要求 303
13.3.2 硬件基础 303
13.3.3 软件结构 303
13.3.4 实例代码 306
13.3.5 编译下载和调试 309
13.4 TIME应用实例2——使用一个定时器产生4路不同占空比PWM 309
13.4.1 实例目的 309
13.4.2 实例要求 310
13.4.3 硬件基础 310
13.4.4 软件结构 310
13.4.5 实例代码 312
13.4.6 编译下载和调试 315
13.5 TIME应用实例3——使用定时器产生4路不同占空比和频率的PWM 315
13.5.1 实例目的 315
13.5.2 实例要求 315
13.5.3 硬件基础 315
13.5.4 软件结构 315
13.5.5 实例代码 319
13.5.6 编译下载和调试 324
第14章 独立看门狗和窗口看门狗定时器 325
14.1 独立看门狗一般特性介绍 325
14.1.1 独立看门狗(IWDG)主要功能 325
14.1.2 独立看门狗(IWDG)功能描述 325
14.2 窗口看门狗一般特性介绍 326
14.2.1 窗口看门狗(WWDG)主要特性 327
14.2.2 窗口看门狗(WWDG)功能描述 327
14.2.3 如何设置看门狗超时 328
14.2.4 调试模式 329
14.3 独立看门狗库函数介绍 329
14.3.1 函数IWDG_WriteAccessCmd 329
14.3.2 函数IWDG_SetPrescaler 329
14.3.3 函数IWDG_SetReload 330
14.3.4 函数IWDG_ReloadCounter 331
14.3.5 函数IWDG_Enable 331
14.4 窗口看门狗库函数介绍 331
14.4.1 函数WWDG_DeInit 331
14.4.2 函数WWDG_SetPrescaler 332
14.4.3 函数WWDG_SetWindowValue 332
14.4.4 函数WWDG_EnableIT 333
14.4.5 函数WWDG_SetCounter 333
14.4.6 函数WWDG_Enable 334
14.4.7 函数WWDG_GetFlagStatus 334
14.4.8 函数WWDG_ClearFlag 335
14.5 独立看门狗实例 335
14.5.1 实例目的 335
14.5.2 实例要求 335
14.5.3 硬件基础 336
14.5.4 软件结构 336
14.5.5 实例代码 336
14.5.6 编译下载和调试 338
14.6 窗口看门狗实例 338
14.6.1 实例目的 338
14.6.2 实例要求 338
14.6.3 硬件基础 338
14.6.4 软件结构 339
14.6.5 实例代码 339
14.6.6 编译下载和调试 341
14.7 本章小结 342
第15章 DAC的应用 343
15.1 DAC简介 343
15.1.1 DAC主要特性 343
15.1.2 使能DAC输出缓存 344
15.1.3 DAC数据格式 344
15.1.4 DAC转换 344
15.1.5 DAC输出电压 345
15.1.6 选择DAC触发 345
15.1.7 DMA请求 345
15.2 DAC外设库函数 346
15.2.1 函数DAC_DeInit 346
15.2.2 函数DAC_Init 346
15.2.3 函数DAC_Cmd 347
15.2.4 函数DAC_SetChannel1Data 348
15.2.5 函数DAC_ITConfig 348
15.3 DAC输出电压实例 349
15.3.1 实例要求 349
15.3.2 硬件基础 349
15.3.3 软件结构 349
15.3.4 实例代码 350
15.3.5 编译下载和调试 353
第16章 DMA的一般应用 354
16.1 DMA简介 354
16.1.1 DMA主要特性 354
16.1.2 DMA功能描述 354
16.2 DMA库函数 358
16.2.1 函数DMA_DeInit 358
16.2.2 函数DMA_Init 358
16.2.3 函数DMA_Cmd 361
16.2.4 函数DMA_GetCurrDataCounter 362
16.2.5 函数DMA_ITConfig 362
16.2.6 函数DMA_GetFlagStatus 363
16.2.7 函数DMA_ClearFlag 364
16.2.8 函数DMA_GetITStatus 364
16.2.9 函数DMA_ClearITPendingBit 365
16.3 DMA应用实例1——串口发送数据 365
16.3.1 实例要求 365
16.3.2 硬件基础 365
16.3.3 软件结构 366
16.3.4 实例代码 367
16.3.5 编译下载和调试 369
16.4 DMA应用实例2——DMA中断接收数据 369
16.4.1 实例要求 369
16.4.2 硬件基础 369
16.4.3 软件结构 369
16.4.4 实例代码 369
16.4.5 编译下载和调试 371
16.5 DMA应用实例3——使用SPI产生FM0编码 372
16.5.1 实例要求 372
16.5.2 FM0编码基础 372
16.5.3 编码算法 372
16.5.4 实例代码 373
16.5.5 编译下载和调试 377
16.6 DMA应用实例4——使用DMA采集多路电压 377
16.6.1 实例要求 377
16.6.2 硬件基础 378
16.6.3 软件结构 378
16.6.4 实例代码 378
16.6.5 编译下载和调试 382
第17章 串行FLASH数据储存方案 383
17.1 串行FLASH概述 383
17.1.1 SST25VF016B概述 383
17.1.2 SST25VF016B引脚说明 384
17.1.3 SST25VF016B接口电路 384
17.2 API软件包 385
17.2.1 软件包结构 385
17.2.2 SPI初始化 385
17.2.3 读数据API 388
17.2.4 写数据API 389
17.2.5 FLASH擦除API 391
17.2.6 读ID 393
17.3 FLASH数据读写实例 393
17.3.1 实例目的 394
17.3.2 实例要求 394
17.3.3 硬件基础 394
17.3.4 实例代码 394
17.3.5 编译下载和调试 396
第18章 LCD模块应用 397
18.1 LCD模块介绍 397
18.1.1 LCD屏性能特性 397
18.1.2 ILI9163C驱动芯SPI时序 398
18.1.3 ILI9163C寄存器介绍 399
18.2 LCD模块相关API函数集 399
18.2.1 SPI接口初始化 400
18.2.2 初始化LCD屏 402
18.2.3 LCD屏API软件函数集 402
18.3 LCD屏显示实例 410
18.3.1 实例目的 410
18.3.2 实例要求 410
18.3.3 硬件基础 410
18.3.4 软件结构 410
18.3.5 实例代码 410