目录 第一篇系 统 平 台 第1章ARM CortexM4嵌入式系统 1.1嵌入式系统概述 1.1.1什么是嵌入式系统 1.1.2嵌入式系统和通用计算机比较 1.1.3嵌入式系统的特点 1.1.4嵌入式系统的应用领域 1.1.5嵌入式系统范例 1.2嵌入式系统的硬件 1.2.1嵌入式处理器的分类 1.2.2嵌入式处理器的技术指标 1.2.3嵌入式存储器 1.2.4嵌入式I/O设备 1.2.5嵌入式I/O接口 1.3ARM CortexM4 处理器 1.3.1ARM公司 1.3.2ARM处理器 1.4STM32微控制器 1.4.1从ARM CortexM内核到基于ARM CortexM的MCU 1.4.2STM32微控制器产品线 1.4.3STM32微控制器命名规则 1.5嵌入式系统的软件 1.5.1无操作系统的嵌入式软件 1.5.2带操作系统的嵌入式软件 1.5.3典型嵌入式操作系统 1.5.4软件结构选择建议 本章小结 思考拓展 第2章STM32F407与实验平台 2.1STM32F407微控制器 2.1.1STM32F407/STM32F417系列 2.1.2STM32F407功能特性 2.1.3STM32F407内部结构 2.1.4STM32F407存储器映射 2.1.5STM32F407时钟系统 2.1.6STM32F407引脚 2.2开发板总体概况 2.2.1开发板设计背景 2.2.2开发板总体介绍 2.3电源电路 2.3.1电源电路原理图 2.3.2电源电路工作原理 2.4核心板电路 2.4.1芯片电源电路 2.4.2CPU滤波电路 2.4.3外接晶振电路 2.4.4备用电源电路 2.4.5复位电路 2.4.6启动设置电路 2.5I/O模块电路 2.5.1LED模块 2.5.2按键模块 2.5.3显示模块 2.5.4蜂鸣器模块 2.6扩展模块电路 2.6.1温湿度传感器 2.6.2光照传感器 2.6.3A/D采样模块 2.6.4EEPROM 2.6.5Flash存储器 2.6.6波形发生器 2.6.7蓝牙模块 2.6.8I/O引脚外接模块 2.7CMSISDAP调试器 本章小结 思考拓展 第3章软件环境配置与使用入门 3.1STM32开发方式 3.1.1STM32Snippets库 3.1.2标准外设库 3.1.3STM32CubeMX HAL库 3.1.4STM32CubeMX LL库 3.1.5开发方式比较与选择 3.2软件资源安装与配置 3.2.1JRE安装 3.2.2STM32CubeMX安装 3.2.3HAL固件包安装 3.2.4MDKARM安装 3.2.5器件包安装 3.2.6MDKARM注册 3.2.7软件安装总结 3.3基于STM32CubeMX的HAL开发方式 3.3.1STM32CubeMX生成初始化代码 3.3.2MDKARM集成开发 3.4CMSISDAP调试器使用 3.4.1调试器连接与驱动安装 3.4.2调试选项设置与程序下载 3.5开发经验小结——编译器优化与volatile关键字 3.5.1编译器优化 3.5.2volatile关键字 本章小结 思考拓展 第二篇基 本 外 设 第4章通用输入输出端口 4.1GPIO概述及引脚命名 4.2GPIO内部结构 4.2.1输入驱动器 4.2.2输出驱动器 4.3GPIO工作模式 4.3.1输入浮空 4.3.2输入上拉 4.3.3输入下拉 4.3.4模拟输入 4.3.5开漏输出 4.3.6开漏复用输出 4.3.7推挽式输出 4.3.8推挽式复用输出 4.3.9工作模式选择 4.4GPIO输出速度 4.5I/O引脚复用及映射 4.6GPIO控制寄存器 4.7GPIO控制寄存器配置实例 4.8寄存器版LED灯闪烁工程 4.8.1创建寄存器版工程模板 4.8.2LED灯闪烁程序设计 4.9开发经验小结——MDK中的C语言数据类型 本章小结 思考拓展 第5章LED流水灯与SysTick定时器 5.1GPIO输出库函数 5.1.1GPIO外设时钟使能 5.1.2函数HAL_GPIO_Init() 5.1.3函数HAL_GPIO_DeInit() 5.1.4函数HAL_GPIO_WritePin() 5.1.5函数HAL_GPIO_TogglePin() 5.1.6输出寄存器访问 5.2LED流水灯控制 5.3SysTick定时器 5.3.1SysTick定时器概述 5.3.2SysTick定时器寄存器 5.3.3延时函数HAL_Delay() 5.3.4HAL_Delay()延时实例 5.3.5微秒级延时的实现 5.3.6综合延时程序实例 5.4开发经验小结——C语言中的位运算 5.4.1位运算符和位运算 5.4.2嵌入式系统位运算实例 本章小结 思考拓展 第6章按键输入与蜂鸣器 6.1GPIO输入库函数 6.1.1函数HAL_GPIO_ReadPin() 6.1.2输入数据寄存器访问 6.1.3函数HAL_GPIO_LockPin() 6.2独立按键控制蜂鸣器 6.2.1电路原理 6.2.2按键消抖 6.2.3项目实施 6.3矩阵键盘扫描 6.3.1矩阵键盘电路 6.3.2矩阵键盘扫描原理 6.3.3矩阵键盘实例 6.4开发经验小结——复合数据类型 6.4.1结构体数据类型 6.4.2枚举数据类型 本章小结 思考拓展 第7章FSMC总线与双显示终端 7.1FSMC总线 7.2硬件系统设计 7.2.1硬件结构框图 7.2.2FSMC与TFT LCD连接 7.2.3FSMC与数码管连接 7.3数码管接口技术 7.3.1数码管工作原理 7.3.2数码管编码方式 7.3.3数码管显示方式 7.4TFT LCD驱动 7.4.1ILI9341颜色体系 7.4.2ILI9341常用命令 7.5项目实例 7.5.1FSMC读写时序 7.5.2FSMC初始化 7.5.3数码管动态显示学号 7.5.4数码管动态显示时间 7.5.5LCD驱动程序 7.5.6LCD英文显示 7.5.7LCD中文信息显示 7.6开发经验小结——C语言指针及其类型转换 7.6.1指针基本概念 7.6.2指针类型转换 本章小结 思考拓展 第8章中断系统与基本应用 8.1中断的基本概念 8.1.1中断的定义 8.1.2中断的优点与应用 8.1.3中断源与中断屏蔽 8.1.4中断处理过程 8.1.5中断优先级与中断嵌套 8.2STM32F407中断系统 8.2.1嵌套向量中断控制器 8.2.2STM32F407中断优先级 8.2.3STM32F407中断向量表 8.2.4STM32F407中断服务函数 8.3STM32F407外部中断/事件控制器EXTI 8.3.1EXTI内部结构 8.3.2EXTI工作原理 8.3.3EXTI主要特性 8.4STM32F407外部中断HAL库函数 8.4.1STM32F407的NVIC相关库函数 8.4.2STM32F407的EXTI相关库函数 8.5EXTI项目实例 8.5.1项目分析 8.5.2项目实施 8.5.3ISR框架总结 8.6开发经验小结——前/后台嵌入式软件架构 本章小结 思考拓展 第9章基本定时器 9.1STM32F407定时器概述 9.2基本定时器 9.2.1基本定时器简介 9.2.2基本定时器的主要特性 9.2.3基本定时器的功能 9.2.4基本定时器寄存器 9.3基本定时器的HAL驱动 9.3.1基本定时器主要HAL驱动函数 9.3.2定时器通用操作宏函数 9.3.3定时器中断处理函数 9.4项目实例 9.4.1数字电子钟 9.4.2定时器刷新数码管 9.4.3定时器矩阵键盘扫描 本章小结 思考拓展 第10章通用定时器 10.1通用定时器功能概述 10.1.1通用定时器主要特性 10.1.2通用定时器功能描述 10.2通用定时器工作模式与HAL驱动 10.2.1PWM输出模式 10.2.2输出比较模式 10.2.3输入捕获模式 10.2.4PWM输入模式 10.3通用定时器寄存器 10.4通用定时器中断事件和回调函数 10.5项目实例 10.5.1PWM呼吸灯 10.5.2输出比较模式输出方波信号 10.5.3输入捕获模式测量脉冲频率 10.5.4PWM波频率和占空比测量 本章小结 思考拓展 第三篇扩 展 外 设 第11章串行通信接口USART 11.1数据通信基本概念 11.1.1并行通信与串行通信 11.1.2异步通信与同步通信 11.1.3串行通信的制式 11.1.4串行通信的校验 11.1.5串行通信的波特率 11.2USART工作原理 11.2.1USART介绍 11.2.2USART功能特性 11.2.3UART通信协议 11.2.4USART中断 11.2.5USART相关寄存器 11.3UART的HAL驱动 11.3.1UART常用功能函数 11.3.2UART常用的宏函数 11.3.3UART中断事件与回调函数 11.4串口通信项目实例 11.4.1项目分析 11.4.2微控制器端程序设计 11.4.3上位机程序设计 11.4.4串口通信调试 11.5开发经验小结——printf()重定向函数 11.5.1重写fputc()函数 11.5.2选择使用Micro LIB 11.5.3printf()串口打印信息 本章小结 思考拓展 第12章SPI与字库存储 12.1SPI通信原理 12.1.1SPI 12.1.2SPI互连 12.2STM32F407的SPI工作原理 12.2.1SPI主要特征 12.2.2SPI内部结构 12.2.3时钟信号的相位和极性 12.2.4数据帧格式 12.3Flash存储芯片W25Q128 12.3.1硬件接口和连接 12.3.2存储空间划分 12.3.3数据读写原则 12.3.4存储器操作指令 12.4SPI的HAL库驱动 12.4.1SPI寄存器操作的宏函数 12.4.2SPI初始化和阻塞式数据传输 12.4.3中断和DMA方式数据传输 12.5SPI Flash读写测试 12.5.1项目分析 12.5.2项目实施 12.6中文字库存储 12.6.1需求分析 12.6.2字库生成与合并 12.6.3字库存储 12.6.4LCD中文驱动程序 12.7基于SPI闪存的中文显示 12.8开发经验小结——条件编译 12.8.1命令形式 12.8.2应用示例 本章小结 思考拓展 第13章I2C接口与EEPROM 13.1I2C通信原理 13.1.1I2C串行总线概述 13.1.2I2C总线的数据传送 13.2STM32F407的I2C接口 13.2.1STM32F407的I2C主要特性 13.2.2STM32F407的I2C内部结构 13.2.3STM32F407的I2C工作模式 13.3I2C接口的HAL库驱动 13.3.1I2C接口的初始化 13.3.2阻塞式数据传输 13.3.3中断方式数据传输 13.3.4DMA方式数据传输 13.4EEPROM存储芯片24C02 13.4.1芯片概述与硬件连接 13.4.2接口与通信协议 13.5EEPROM存储开机密码项目 13.5.1项目分析 13.5.2项目实施 本章小结 思考拓展 第14章模/数转换与光照传感器 14.1ADC概述 14.1.1ADC基本原理 14.1.2ADC性能参数 14.1.3ADC主要类型 14.2STM32F407的ADC工作原理 14.2.1主要特征 14.2.2内部结构 14.2.3通道及分组 14.2.4时序图 14.2.5数据对齐 14.2.6校准 14.2.7转换时间 14.2.8转换模式 14.2.9外部触发转换和触发极性 14.2.10中断和DMA请求 14.2.11多重ADC模式 14.3ADC的HAL库驱动 14.3.1规则通道驱动 14.3.2注入通道驱动 14.3.3多重ADC驱动 14.4项目实例 14.4.1多通道轮询方式模拟信号采集 14.4.2光照传感器模拟与数字同步控制 本章小结 思考拓展 第15章直接存储器访问 15.1DMA的基本概念 15.1.1DMA的由来 15.1.2DMA的定义 15.1.3DMA的优点 15.2STM32F407的DMA工作原理 15.2.1DMA简介 15.2.2DMA通道选择 15.2.3DMA主要特性 15.2.4DMA传输属性 15.3DMA的HAL库驱动 15.3.1DMA的HAL函数概述 15.3.2DMA传输初始化配置 15.3.3启动DMA数据传输 15.3.4DMA中断 15.4项目实例 15.4.1USART接口DMA传输 15.4.2定时器触发DMA传输多通道模拟量采集 15.4.3三重ADC同步转换DMA传输 15.5开发经验小结——轮询、中断、DMA 15.5.1轮询 15.5.2中断 15.5.3DMA 本章小结 思考拓展 第16章数/模转换器 16.1DAC概述 16.1.1DAC基本原理 16.1.2DAC性能参数 16.2STM32F407的DAC工作原理 16.2.1DAC结构与特性 16.2.2DAC功能说明 16.3DAC的HAL库驱动 16.3.1DAC驱动宏函数 16.3.2DAC驱动功能函数 16.4项目实例 16.4.1软件触发D/A转换 16.4.2三角波输出 16.4.3使用DMA输出正弦波信号 本章小结 思考拓展 第17章位带操作与温湿度传感器 17.1STM32位带操作 17.1.1位带介绍 17.1.2位带区与位带别名区地址转换 17.1.3位带操作宏定义 17.2温湿度传感器DHT11 17.2.1DHT11功能说明 17.2.2DHT11单总线通信协议 17.3温湿度实时监测 17.3.1项目分析 17.3.2项目实施 本章小结 思考拓展 第18章RTC与蓝牙通信 18.1RTC概述 18.1.1RTC功能 18.1.2RTC工作原理 18.1.3RTC的中断和复用引脚 18.2RTC的HAL库驱动 18.2.1RTC的HAL基础驱动程序 18.2.2周期唤醒相关HAL函数 18.2.3闹钟相关HAL函数 18.3备份寄存器 18.4RTC日历和闹钟项目 18.4.1项目分析 18.4.2项目实施 18.5蓝牙模块通信 18.5.1蓝牙通信概述 18.5.2蓝牙透明传输原理 18.6无线时间同步电子万年历 18.6.1项目分析 18.6.2项目实施 本章小结 思考拓展 附录AASCII码表 附录B运算符和结合性关系表 附录CSTM32F407微控制器引脚定义表 参考文献