logo资料库

【野火】零死角玩转STM32—F429挑战者V2.pdf

第1页 / 共1048页
第2页 / 共1048页
第3页 / 共1048页
第4页 / 共1048页
第5页 / 共1048页
第6页 / 共1048页
第7页 / 共1048页
第8页 / 共1048页
资料共1048页,剩余部分请下载后查看
第1章 如何使用本书
1.1 本书的参考资料
1.2 本书的编写风格
1.3 本书的配套硬件
1.4 本书的技术论坛
第2章 如何安装KEIL5
2.1 温馨提示
2.2 获取KEIL5安装包
2.3 开始安装KEIL5
2.4 安装STM32芯片包
第3章 如何用DAP仿真器下载程序
3.1 仿真器简介
3.2 硬件连接
3.3 仿真器配置
1. Debug选项配置
2. Utilities选项配置
3. Debug Settings 选项配置
3.4 选择目标板
3.5 下载程序
第4章 初识STM32
4.1 什么是STM32
4.1.1 STM32诞生的背景
4.2 STM32能做什么
4.2.1 智能手环
4.2.2 微型四轴飞行器
4.2.3 淘宝众筹
4.3 STM32怎么选型
4.3.1 STM32分类
4.3.2 STM32 命名方法
4.3.3 选择合适的MCU
1. 如何分配原理图IO
2. 如何寻找IO的功能说明
3. 开始分配原理图IO
4.3.4 PCB哪里打样
第5章 什么是寄存器
5.1 什么是寄存器
5.2 STM32长啥样
5.3 芯片里面有什么
5.4 存储器映射
5.4.1 存储器映射
1. 存储器区域功能划分
存储器Block0内部区域功能划分
储存器Block1内部区域功能划分
储存器Block2内部区域功能划分
5.5 寄存器映射
5.5.1 STM32的外设地址映射
1. 总线基地址
2. 外设基地址
3. 外设寄存器
5.5.2 C语言对寄存器的封装
1. 封装总线和外设基地址
2. 封装寄存器列表
5.5.3 修改寄存器的位操作方法
1. 把变量的某位清零
2. 把变量的某几个连续位清零
3. 对变量的某几位进行赋值。
4. 对变量的某位取反
第6章 新建工程—寄存器版
6.1 新建工程
6.1.1 新建本地工程文件夹
6.1.2 新建工程
1. 选择CPU型号
2. 在线添加库文件
3. 添加文件
startup_stm32f429_439xx.s
stm32f4xx.h
main.c
4. 配置魔术棒选项卡
5. 下载器配置
Debug选项配置
Utilities选项配置
Debug Settings 选项配置
6.1 下载程序
第7章 使用寄存器点亮LED灯
7.1 GPIO简介
7.2 GPIO框图剖析
7.2.1 基本结构分析
1. 保护二极管及上、下拉电阻
2. P-MOS管和N-MOS管
3. 输出数据寄存器
4. 复用功能输出
5. 输入数据寄存器
6. 复用功能输入
7. 模拟输入输出
7.2.2 GPIO工作模式
1. 输入模式(上拉/下拉/浮空)
2. 输出模式(推挽/开漏,上拉/下拉)
3. 复用功能(推挽/开漏,上拉/下拉)
4. 模拟输入输出
7.3 实验:使用寄存器点亮LED灯
7.3.1 硬件连接
7.3.2 启动文件
7.3.3 stm32f4xx.h文件
7.3.4 main文件
1. GPIO模式
2. 输出类型
3. 输出速度
4. 上/下拉模式
5. 控制引脚输出电平
6. 开启外设时钟
7. 水到渠成
7.3.5 下载验证
第8章 自己写库—构建库函数雏形
8.1 什么是STM32函数库
8.2 为什么采用库来开发及学习?
8.3 实验:构建库函数雏形
8.3.1 修改寄存器地址封装
8.3.2 定义访问外设的结构体指针
8.3.3 定义初始化结构体GPIO_InitTypeDef
8.3.4 定义引脚模式的枚举类型
8.3.5 定义GPIO初始化函数
8.3.6 全新面貌,使用函数点亮LED灯
8.3.7 下载验证
8.3.8 总结
第9章 初识STM32固件库
9.1 CMSIS标准及库层次关系
9.1.1 库目录、文件简介
1. Include文件夹
2. Device文件夹
3. STM32F10x_StdPeriph_Driver文件夹
4. stm32f4xx_it.c、 stm32f4xx_conf.h文件
9.1.2 库各文件间的关系
9.2 使帮助文档
9.2.1 常用官方资料
9.2.2 初识库函数
第10章 新建工程—库函数版
10.1 新建工程
10.1.1 新建本地工程文件夹
10.1.2 新建工程
1. 选择CPU型号
2. 在线添加库文件
3. 添加组文件夹
4. 添加文件
5. 设置文件是否加入编译
6. 配置魔术棒选项卡
7. 下载器配置
8. 选择CPU型号
第11章 GPIO输出—使用固件库点亮LED
11.1 硬件设计
11.2 软件设计
11.2.1 编程要点
11.2.2 代码分析
1. LED灯引脚宏定义
2. 控制LED灯亮灭状态的宏定义
3. LED GPIO初始化函数
4. 主函数
11.2.3 下载验证
11.3 STM32标准库补充知识
1. SystemInit函数去哪了?
2. 断言
3. Doxygen注释规范
4. 防止头文件重复包含
第12章 GPIO输入—按键检测
12.1 硬件设计
12.2 软件设计
12.2.1 编程要点
12.2.2 代码分析
1. 按键引脚宏定义
2. 按键 GPIO初始化函数
3. 检测按键的状态
4. 主函数
12.2.3 下载验证
第13章 GPIO—位带操作
13.1 位带简介
13.1.1 外设位带区
13.1.2 SRAM位带区
13.1.3 位带区和位带别名区地址转换
1. 外设位带别名区地址
2. SRAM位带别名区地址
3. 统一公式
13.2 GPIO位带操作
1. GPIO 寄存器映射
2. GPIO位操作
3. 主函数
第14章 启动文件详解
14.1 启动文件简介
14.2 查找ARM汇编指令
14.3 启动文件代码讲解
1. Stack—栈
2. Heap堆
3. 向量表
4. 复位程序
5. 中断服务程序
6. 用户堆栈初始化
14.4 系统启动流程
第15章 RCC—使用HSE/HSI配置时钟
15.1 RCC主要作用—时钟部分
15.2 RCC框图剖析—时钟树
15.2.1 系统时钟
1. ①HSE高速外部时钟信号
2. ②锁相环PLL
3. ③系统时钟SYSCLK
4. ④AHB总线时钟HCLK
5. ⑤APB2总线时钟HCLK2
6. ⑥APB1总线时钟HCLK1
7. 设置系统时钟库函数
15.2.2 其他时钟
1. A、RTC时钟
2. B、独立看门狗时钟
3. C、I2S时钟
4. D、PHY以太网时钟
5. E、USB PHY 时钟
6. F、MCO时钟输出
15.3 配置系统时钟实验
15.3.1 使用HSE
15.3.2 使用HSI
15.3.3 硬件设计
15.3.4 软件设计
1. 编程要点
2. 代码分析
使用HSE配置系统时钟
使用HSI配置系统时钟
软件延时
MCO输出
主函数
15.3.5 下载验证
第16章 STM32中断应用概览
16.1 异常类型
16.2 NVIC简介
16.2.1 NVIC寄存器简介
16.2.2 NVIC 中断配置固件库
16.3 优先级的定义
16.3.1 优先级定义
16.3.2 优先级分组
16.4 中断编程
第17章 EXTI—外部中断/事件控制器
17.1 EXTI简介
17.2 EXTI功能框图
17.3 中断/事件线
17.4 EXTI初始化结构体详解
17.5 外部中断控制实验
17.5.1 硬件设计
17.5.2 软件设计
1. 编程要点
2. 软件分析
按键和EXTI宏定义
嵌套向量中断控制器NVIC配置
EXTI中断配置
EXTI中断服务函数
主函数
17.5.3 下载验证
第18章 SysTick—系统定时器
18.1 SysTick简介
18.2 SysTick寄存器介绍
18.3 SysTick定时实验
18.3.1 硬件设计
18.3.2 软件设计
1. 编程要点
2. 代码分析
SysTick配置库函数
SysTick初始化函数
SysTick中断时间的计算
SysTick定时时间的计算
SysTick定时函数
SysTick中断服务函数
主函数
第19章 通讯的基本概念
19.1 串行通讯与并行通讯
19.2 全双工、半双工及单工通讯
19.3 同步通讯与异步通讯
19.4 通讯速率
第20章 USART—串口通讯
20.1 串口通讯协议简介
20.1.1 物理层
1. 电平标准
2. RS-232信号线
20.1.2 协议层
1. 波特率
2. 通讯的起始和停止信号
3. 有效数据
4. 数据校验
20.2 STM32的USART简介
20.3 USART功能框图
1. ①功能引脚
2. ②数据寄存器
3. ③控制器
发送器
接收器
4. ④小数波特率生成
5. 校验控制
6. 中断控制
20.4 USART初始化结构体详解
USART初始化结构体
USART时钟初始化结构体
20.5 USART1接发通信实验
20.5.1 硬件设计
20.5.2 软件设计
1. 编程要点
2. 代码分析
GPIO和USART宏定义
嵌套向量中断控制器NVIC配置
USART初始化配置
字符发送
USART中断服务函数
主函数
20.5.3 下载验证
20.6 USART1指令控制RGB彩灯实验
20.6.1 硬件设计
20.6.2 软件设计
1. 编程要点
2. 代码分析
GPIO和USART宏定义
USART初始化配置
重定向prinft和scanf函数
输出提示信息
主函数
20.6.3 下载验证
第21章 DMA—直接存储区访问
21.1 DMA简介
21.2 DMA功能框图
1. ①外设通道选择
2. ②仲裁器
3. ③FIFO
4. ④存储器端口、⑤外设端口
5. ⑥编程端口
21.3 DMA数据配置
1. DMA传输模式
2. 源地址和目标地址
3. 流控制器
4. 循环模式
5. 传输类型
6. 直接模式
7. 双缓冲模式
8. DMA中断
21.4 DMA初始化结构体详解
DMA_ InitTypeDef初始化结构体
21.5 DMA存储器到存储器模式实验
21.5.1 硬件设计
21.5.2 软件设计
1. 编程要点
2. 代码分析
DMA宏定义及相关变量定义
DMA数据流配置
存储器数据对比
主函数
21.5.3 下载验证
21.6 DMA存储器到外设模式实验
21.6.1 硬件设计
21.6.2 软件设计
1. 编程要点
2. 代码分析
USART和DMA宏定义
串口DMA传输配置
主函数
21.6.3 下载验证
第22章 常用存储器介绍
22.1 存储器种类
22.2 RAM存储器
22.2.1 DRAM
1. SDRAM
2. DDR SDRAM
22.2.2 SRAM
22.2.3 DRAM与SRAM的应用场合
22.3 非易失性存储器
22.3.1 ROM存储器
1. MASK ROM
2. OTPROM
3. EPROM
4. EEPROM
22.3.2 FLASH存储器
第23章 I2C—读写EEPROM
23.1 I2C协议简介
23.1.1 I2C物理层
23.1.2 协议层
1. I2C基本读写过程
2. 通讯的起始和停止信号
3. 数据有效性
4. 地址及数据方向
5. 响应
23.2 STM32的I2C特性及架构
23.2.1 STM32的I2C外设简介
23.2.2 STM32的I2C架构剖析
1. 通讯引脚
2. 时钟控制逻辑
3. 数据控制逻辑
4. 整体控制逻辑
23.2.3 通讯过程
1. 主发送器
2. 主接收器
23.3 I2C初始化结构体详解
23.4 I2C—读写EEPROM实验
23.4.1 硬件设计
23.4.2 软件设计
1. 编程要点
2. 代码分析
I2C硬件相关宏定义
初始化I2C的 GPIO
配置I2C的模式
向EEPROM写入一个字节的数据
多字节写入及状态等待
EEPROM的页写入
快速写入多字节
从EEPROM读取数据
3. main文件
EEPROM读写测试函数
main函数
23.4.3 下载验证
第24章 SPI—读写串行FLASH
24.1 SPI协议简介
24.1.1 SPI物理层
24.1.2 协议层
1. SPI基本通讯过程
2. 通讯的起始和停止信号
3. 数据有效性
4. CPOL/CPHA及通讯模式
24.2 STM32的SPI特性及架构
24.2.1 STM32的SPI外设简介
24.2.2 STM32的SPI架构剖析
1. 通讯引脚
2. 时钟控制逻辑
3. 数据控制逻辑
4. 整体控制逻辑
24.2.3 通讯过程
24.3 SPI初始化结构体详解
24.4 SPI—读写串行FLASH实验
24.4.1 硬件设计
24.4.2 软件设计
1. 编程要点
2. 代码分析
SPI硬件相关宏定义
初始化SPI的 GPIO
配置SPI的模式
使用SPI发送和接收一个字节的数据
控制FLASH的指令
定义FLASH指令编码表
读取FLASH芯片ID
FLASH写使能以及读取当前状态
FLASH扇区擦除
FLASH的页写入
不定量数据写入
从FLASH读取数据
3. main函数
24.4.3 下载验证
第25章 串行FLASH文件系统FatFs
25.1 文件系统
25.2 FatFs文件系统简介
25.2.1 FatFs的目录结构
25.2.2 FatFs帮助文档
25.2.3 FATFS源码
25.3 FatFs文件系统移植实验
25.3.1 FatFs程序结构图
25.3.2 硬件设计
25.3.3 FatFs移植步骤
25.3.4 FatFs底层设备驱动函数
宏定义
设备状态获取
设备初始化
读取扇区
扇区写入
其他控制
时间戳获取
25.3.5 FatFs功能配置
25.3.6 FatFs功能测试
变量定义
主函数
25.3.7 下载验证
25.4 FatFs功能使用实验
25.4.1 硬件设计
25.4.2 软件设计
FatFs多项功能测试
文件信息获取
路径扫描
主函数
25.4.3 下载验证
第26章 FMC—扩展外部SDRAM
26.1 SDRAM控制原理
26.1.1 SDRAM信号线
26.1.2 控制逻辑
26.1.3 地址控制
26.1.4 SDRAM的存储阵列
26.1.5 数据输入输出
26.1.6 SDRAM的命令
1. 命令禁止
2. 空操作
3. 行有效
4. 列读写
5. 预充电
6. 刷新
7. 加载模式寄存器
Burst Length
BT
CASLatency
Op Mode
WB
Reserved
26.1.7 SDRAM的初始化流程
26.1.8 SDRAM的读写流程
26.2 FMC简介
26.3 FMC框图剖析
1. 通讯引脚
2. 存储器控制器
3. 时钟控制逻辑
26.4 FMC的地址映射
1. SDRAM的存储区域
2. External RAM 与External device的区别
26.5 SDRAM时序结构体
26.6 SDRAM初始化结构体
26.7 SDRAM命令结构体
26.8 FMC—扩展外部SDRAM实验
26.8.1 硬件设计
26.8.2 软件设计
1. 编程要点
2. 代码分析
FMC硬件相关宏定义
初始化FMC的 GPIO
配置FMC的模式
实现SDRAM的初始化时序
设置自动刷新周期
使用指针的方式访问SDRAM存储器
直接指定变量存储到SDRAM空间
3. main函数
下载验证
第27章 LTDC/DMA2D—液晶显示
27.1 显示器简介
27.1.1 液晶显示器
27.1.2 LED和OLED显示器
27.1.3 显示器的基本参数
27.2 液晶控制原理
27.2.1 液晶面板的控制信号
27.2.2 液晶数据传输时序
27.2.3 显存
27.3 LTDC液晶控制器简介
27.3.1 图像数据混合
27.3.2 LTDC结构框图剖析
1. LTDC信号线
2. 图像处理单元
3. 配置和状态寄存器
4. 时钟信号
27.4 DMA2D图形加速器简介
27.4.1 DMA2D结构框图剖析
1. FG FIFO与BG FIFO
2. FG PFC与BG PFC
3. 混合器
4. OUT PFC
27.5 LTDC初始化结构体
27.6 LTDC层级初始化结构体
27.7 DMA2D初始化结构体
27.8 LTDC/DMA2D—液晶显示实验
27.8.1 硬件设计
27.8.2 软件设计
1. 编程要点
2. 代码分析
LTDC硬件相关宏定义
初始化LTDC的 GPIO
配置LTDC的模式
配置LTDC的层级初始化
绘制像素点
使用DMA2D绘制直线和矩形
使用DMA2D绘制矩形
3. main函数
下载验证
第28章 LTDC—液晶显示中英文
28.1 字符编码
28.1.1 ASCII编码
28.1.2 中文编码
1. GB2312标准
区位码
2. GBK编码
3. GB18030
4. Big5编码
28.1.3 Unicode字符集和编码
28.1.4 UTF-32
28.1.5 UTF-16
28.1.6 UTF-8
28.1.7 BOM
28.2 什么是字模?
28.2.1 字模的构成
28.2.2 字模显示原理
28.2.3 如何制作字模
28.2.4 字模寻址公式
28.2.5 存储字模文件
28.3 LTDC—各种模式的液晶显示字符实验
28.3.1 硬件设计
28.3.2 显示ASCII编码的字符
1. 编程要点
2. 代码分析
ASCII字模数据
管理英文字模的结构体
切换字体
ASCII字符显示函数
直接使用ASCII码显示字符
显示字符串
显示ASCII码示例
28.3.3 显示GB2312编码的字符
1. 编程要点
2. 代码分析
显示汉字字符
显示中英文字符串
获取SPI-FLASH中的字模数据
获取SD卡中的字模数据
显示GB2312字符示例
28.3.4 显示任意大小的字符
1. 编程要点
2. 代码分析
缩放字模数据
利用缩放的字模数据显示字符
利用缩放的字模显示字符串
利用缩放的字模显示示例
下载验证
第29章 电容触摸屏—触摸画板
29.1 触摸屏简介
29.1.1 电阻式触摸屏检测原理
29.1.2 电容式触摸屏检测原理
29.2 电容触摸屏控制芯片
29.2.1 GT9157芯片的引脚
29.2.2 上电时序与I2C设备地址
29.2.3 寄存器配置
29.2.4 读取坐标信息
坐标寄存器
读坐标流程
29.3 电容触摸屏—触摸画板实验
29.3.1 硬件设计
29.3.2 软件设计
1. 编程要点
2. 代码分析
触摸屏硬件相关宏定义
初始化触摸屏控制引脚
配置I2C的模式
使用上电时序设置触摸屏的I2C地址
初始化封装
I2C基本读写函数
Linux的I2C驱动接口
I2C复合读写函数
读取触控芯片的产品ID及版本号
向触控芯片写入配置参数
INT中断服务函数
读取坐标数据
触点释放和触点按下的坐标接口
3. main函数
下载验证
第30章 ADC—电压采集
30.1 ADC简介
30.2 ADC功能框图剖析
1. ①电压输入范围
2. ②输入通道
规则通道
注入通道
3. ③转换顺序
规则序列
注入序列
4. ④触发源
5. ⑤转换时间
ADC时钟
采样时间
6. ⑥数据寄存器
规则数据寄存器ADC_DR
注入数据寄存器ADC_JDRx
通用规则数据寄存器ADC_CDR
7. ⑦中断
转换结束中断
模拟看门狗中断
溢出中断
DMA请求
8. ⑧电压转换
30.3 ADC初始化结构体详解
ADC_InitTypeDef结构体
ADC_CommonInitTypeDef结构体
30.4 独立模式单通道采集实验
30.4.1 硬件设计
30.4.2 软件设计
1. 编程要点
2. 代码分析
ADC宏定义
ADC GPIO初始化函数
配置ADC工作模式
ADC中断配置
ADC中断服务函数
主函数
30.4.3 下载验证
30.5 独立模式多通道采集实验
30.5.1 硬件设计
30.5.2 软件设计
1. 编程要点
2. 代码分析
ADC宏定义
ADC GPIO初始化函数
配置ADC工作模式
主函数
30.5.3 下载验证
30.6 三重ADC交替模式采集实验
30.6.1 硬件设计
30.6.2 软件设计
1. 编程要点
2. 代码分析
ADC宏定义
ADC GPIO初始化函数
配置三重ADC交替模式
主函数
30.6.3 下载验证
第31章 TIM—基本定时器
31.1 TIM简介
31.2 基本定时器
31.3 基本定时器功能框图
1. ①时钟源
2. ②控制器
3. ③计数器
4. 定时器周期计算
31.4 定时器初始化结构体详解
31.5 基本定时器定时实验
31.5.1 硬件设计
31.5.2 软件设计
1. 编程要点
2. 软件分析
宏定义
NCIV配置
基本定时器模式配置
定时器中断服务函数
主函数
31.5.3 下载验证
第32章 TIM—高级定时器
32.1 高级控制定时器
32.2 高级控制定时器功能框图
1. ①时钟源
内部时钟源(CK_INT)
外部时钟模式1
外部时钟模式2
内部触发输入
2. ②控制器
3. ③时基单元
预分频器PSC
计数器CNT
自动重载寄存器ARR
重复计数器RCR
4. ④输入捕获
①输入通道
②输入滤波器和边沿检测器
③捕获通道
④的预分频器
⑤捕获寄存器
5. ⑤输出比较
①比较寄存器
②死区发生器
③输出控制
④输出引脚
6. ⑥断路功能
32.3 输入捕获应用
32.3.1 测量脉宽或者频率
1. 测量频率
2. 测量脉宽
32.3.2 PWM输入模式
32.4 输出比较应用
32.4.1 PWM输出模式
1. PWM边沿对齐模式
2. PWM中心对齐模式
32.5 定时器初始化结构体详解
1. TIM_TimeBaseInitTypeDef
2. TIM_OCInitTypeDef
3. TIM_ICInitTypeDef
4. TIM_BDTRInitTypeDef
32.6 PWM互补输出实验
32.6.1 硬件设计
32.6.2 软件设计
1. 编程要点
2. 软件分析
宏定义
定时器复用功能引脚初始化
定时器模式配置
主函数
32.6.3 下载验证
32.7 PWM输入捕获实验
32.7.1 硬件设计
32.7.2 软件设计
1. 编程要点
2. 软件分析
宏定义
定时器复用功能引脚初始化
嵌套向量中断控制器组配置
通用定时器PWM输出
高级控制定时PWM输入模式
高级控制定时器中断服务函数
主函数
32.7.3 下载验证
第33章 TIM—电容按键检测
33.1 电容按键原理
33.2 电容按键检测实验
33.2.1 硬件设计
33.2.2 软件设计
1. 编程要点
2. 软件分析
宏定义
定时器初始化配置
电容按键复位
获取输入捕获值
获取最大输入捕获值
电容按键捕获初始化
电容按键状态扫描
主函数
33.2.3 下载验证
第34章 IWDG—独立看门狗
34.1 IWDG简介
34.2 IWDG功能框图剖析
1. ①独立看门狗时钟
2. ②计数器时钟
3. ③计数器
4. ④重装载寄存器
5. ⑤键寄存器
6. ⑥状态寄存器
34.3 怎么用IWDG
34.4 IWDG超时实验
34.4.1 硬件设计
34.4.2 软件设计
1. 代码分析
IWDG配置函数
喂狗函数
主函数
34.4.3 下载验证
第35章 WWDG—窗口看门狗
35.1 WWDG简介
35.2 WWDG功能框图剖析
1. ①窗口看门狗时钟
2. ②计数器时钟
3. ③计数器
4. ④窗口值
5. ⑤计算看门狗超时时间
35.3 怎么用WWDG
35.4 WWDG喂狗实验
35.4.1 硬件设计
35.4.2 软件设计
1. 代码分析
WWDG配置函数
WWDG中断优先级函数
提前唤醒中断复位程序
喂狗函数
主函数
35.4.3 下载验证
第36章 SDIO—SD卡读写测试
36.1 SDIO简介
36.2 SD卡物理结构
36.3 SDIO总线
36.3.1 总线拓扑
36.3.2 总线协议
36.3.3 命令
1. 命令格式
2. 命令类型
3. 命令描述
36.3.4 响应
36.4 SD卡的操作模式及切换
36.4.1 SD卡的操作模式
36.4.2 卡识别模式
36.4.3 数据传输模式
36.5 STM32的SDIO功能框图
1. 控制单元
2. 命令路径
3. 数据路径
4. 数据FIFO
5. 适配器寄存器
36.6 SDIO初始化结构体
36.7 SDIO命令初始化结构体
36.8 SDIO数据初始化结构体
36.9 SD卡读写测试实验
36.9.1 硬件设计
36.9.2 软件设计
1. GPIO初始化和DMA配置
DMA及相关配置宏定义
GPIO初始化
DMA传输配置
2. 相关类型定义
3. SD卡初始化
SD卡初始化函数
SD_POWERON函数
SD_InitializeCards函数
4. SD卡数据操作
擦除函数
数据写入操作
写入操作等待函数
数据读取操作
读取操作等待函数
5. SDIO中断服务函数
6. 测试函数
SD卡测试函数
SD卡擦除测试
单块读写测试
主函数
36.9.3 下载验证
第37章 基于SD卡的FatFs文件系统
37.1 FatFs移植步骤
37.2 FatFs接口函数
宏定义和存储设备状态获取函数
存储设备初始化函数
存储设备数据读取函数
存储设备数据写入函数
其他控制函数
37.3 FatFs功能测试
变量定义
主函数
下载验证
第38章 DAC—输出正弦波
38.1 DAC简介
38.2 DAC功能框图剖析
1. 参考电压
2. 数模转换及输出通道
3. 触发源及DHRx寄存器
38.3 DAC初始化结构体详解
38.4 DAC输出正弦波实验
38.4.1 硬件设计
38.4.2 软件设计
1. 编程要点
2. 代码分析
生成正弦波数据表
DAC宏定义
DAC GPIO和模式配置
定时器配置及计算正弦波的频率
DMA配置
主函数
38.4.3 下载验证
第39章 全彩LED灯实验
39.1 全彩LED灯简介
39.2 全彩LED灯控制原理
39.3 硬件设计
39.4 软件设计
39.4.1 编程要点
39.4.2 代码分析
1. LED灯硬件相关宏定义
2. 初始化GPIO
3. 定时器PWM配置
4. 颜色混合
5. 主函数
39.4.3 下载验证
第40章 呼吸灯与SPWM波
40.1 呼吸灯简介
40.2 呼吸灯与PWM控制原理
40.3 硬件设计
40.4 单色呼吸灯实验
40.4.1 编程要点
40.4.2 代码分析
1. LED灯硬件相关宏定义
2. 初始化GPIO
3. 定义PWM表
4. 定时器PWM配置
5. 定时器中断服务函数
6. 计算拟合波形的周期
7. 主函数
40.4.3 下载验证
40.5 全彩呼吸灯及输出SPWM波实验
40.5.1 编程要点
40.5.2 代码分析
1. LED灯硬件相关宏定义
2. 初始化GPIO
3. 定义PWM表
4. 定时器PWM配置
5. 定时器中断服务函数
6. 计算拟合波形的周期
7. 主函数
40.5.3 下载验证
第41章 I2S—音频播放与录音输入
41.1 I2S简介
41.1.1 数字音频技术
41.1.2 I2S总线接口
41.1.3 音频数据传输协议标准
1. I2S Philips标准
2. 左对齐标准
3. 右对齐标准
4. PCM标准
41.2 I2S功能框图
1. 功能引脚
2. 数据寄存器
3. 逻辑控制
4. 时钟发生器
41.3 WM8978音频编译码器
1. 输入部分
2. 输出部分
3. ADC和DAC
4. 通信接口
5. 其他部分
41.4 WAV格式文件
41.4.1 RIFF文件规范
41.4.2 WAVE文件
41.4.3 WAVE文件实例分析
41.5 I2S初始化结构体详解
41.6 录音与回放实验
41.6.1 硬件设计
41.6.2 软件设计
1. I2C控制接口
输入输出选择枚举
宏定义
WM8978寄存器写入
WM8978寄存器读取
输出音量修改与读取
输入增益调整
音频接口标准选择
输入输出通道设置
软件复位
2. I2S控制接口
I2S工作模式配置
I2S数据发送(DMA传输)
DMA数据发送传输完成中断服务函数
启动和停止播放控制
I2S扩展功能模式配置
I2S扩展数据接收(DMA传输)
DMA数据接收传输完成中断服务函数
启动和停止录音
3. 录音和回放功能
枚举和结构体类型定义
启动播放WAV格式音频文件
启动录音功能
录音和回放功能选择
DMA传输完成中断回调函数
主函数
41.6.3 下载验证
41.7 MP3播放器
41.7.1 MP3文件结构
1. ID3V2
2. ID3V1
3. MP3数据帧
41.7.2 MP3解码库
41.7.3 Helix解码库移植
41.7.4 MP3播放器功能实现
MP3播放器实现
DMA发送完成中断回调函数
主函数
41.7.5 下载验证
第42章 ETH—Lwip以太网通信
42.1 互联网模型
42.2 以太网
42.2.1 PHY层
1. 传输介质
2. 编码
3. CSMA/CD冲突检测
42.2.2 MAC子层
1. MAC的功能
2. MAC数据包
42.3 TCP/IP协议栈
42.3.1 为什么需要协议栈
42.3.2 各网络层的功能
42.4 以太网外设(ETH)
42.4.1 SMI接口
1. SMI帧格式
2. SMI读写操作
42.4.2 MII和RMII接口
42.4.3 MAC数据包发送和接收
1. MAC数据包发送
2. MAC数据包接收
42.4.4 MAC过滤
42.5 PHY:LAN8720A
42.6 LwIP:轻型TCP/IP协议栈
42.7 ETH初始化结构体详解
42.8 以太网通信实验:无操作系统LwIP移植
42.8.1 硬件设计
42.8.2 移植步骤
第一步:相关文件拷贝
第二部:为工程添加文件
第三步:文件修改
下载验证
42.9 基于uCOS-III移植LwIP实验
第一步:文件拷贝
第二步:为工程添加文件
第三步:文件修改
下载验证
第43章 CAN—通讯实验
43.1 CAN协议简介
43.1.1 CAN物理层
1. 闭环总线网络
2. 开环总线网络
3. 通讯节点
4. 差分信号
5. CAN协议中的差分信号
43.1.2 协议层
1. CAN的波特率及位同步
位时序分解
通讯的波特率
同步过程分析
2. CAN的报文种类及结构
报文的种类
数据帧的结构
其它报文的结构
43.2 STM32的CAN外设简介
43.2.1 STM32的CAN架构剖析
1. CAN控制内核
主控制寄存器CAN_MCR
位时序寄存器(CAN_BTR)及波特率
2. CAN发送邮箱
3. CAN接收FIFO
4. 验收筛选器
5. 整体控制逻辑
43.3 CAN初始化结构体
43.4 CAN发送及接收结构体
43.5 CAN筛选器结构体
43.6 CAN—双机通讯实验
43.6.1 硬件设计
43.6.2 软件设计
1. 编程要点
2. 代码分析
CAN硬件相关宏定义
初始化CAN的 GPIO
配置CAN的工作模式
配置筛选器
配置接收中断
设置发送报文
接收报文
3. main函数
43.6.3 下载验证
第44章 RS-485通讯实验
44.1 RS-485通讯协议简介
44.1.1 RS-485的物理层
44.2 RS-485—双机通讯实验
44.2.1 硬件设计
44.2.2 软件设计
1. 编程要点
2. 代码分析
485硬件相关宏定义
初始化485的USART配置
使用中断接收数据
切换收发状态
发送数据
3. main函数
44.2.3 下载验证
第45章 电源管理—实现低功耗
45.1 STM32的电源管理简介
45.1.1 电源监控器
1. 上电复位与掉电复位(POR与PDR)
2. 欠压复位(BOR)
3. 可编程电压检测器PVD
45.1.2 STM32的电源系统
45.1.3 STM32的功耗模式
1. 睡眠模式
2. 停止模式
3. 待机模式
45.2 电源管理相关的库函数及命令
45.2.1 配置PVD监控功能
45.2.2 WFI与WFE命令
45.2.3 进入停止模式
45.2.4 进入待机模式
45.3 PWR—睡眠模式实验
45.3.1 硬件设计
45.3.2 软件设计
1. 程序设计要点
2. 代码分析
main函数
中断服务函数
45.3.3 下载验证
45.4 PWR—停止模式实验
45.4.1 硬件设计
45.4.2 软件设计
1. 程序设计要点
2. 代码分析
重启HSE时钟
main函数
45.4.3 下载验证
45.5 PWR—待机模式实验
45.5.1 硬件设计
45.5.2 软件设计
1. 程序设计要点
2. 代码分析
main函数
45.5.3 下载验证
45.6 PWR—PVD电源监控实验
45.6.1 硬件设计
45.6.2 软件设计
1. 程序设计要点
2. 代码分析
初始化PVD
PVD中断服务函数
main函数
45.6.3 下载验证
第46章 RTC—实时时钟
46.1 RTC简介
46.2 RTC功能框图解析
1. 时钟源
2. 预分频器
3. 实时时钟和日历
4. 闹钟
5. 时间戳
6. 入侵检测
46.3 RTC初始化结构体讲解
46.4 RTC时间结构体讲解
46.5 RTC日期结构体讲解
46.6 RTC闹钟结构体讲解
46.7 RTC—日历实验
46.7.1 硬件设计
46.7.2 软件设计
1. 编程要点
2. 代码分析
宏定义
RTC时钟配置函数
RTC时间初始化函数
RTC时间显示函数
主函数
3. 下载验证
46.8 RTC—闹钟实验
46.8.1 硬件设计
46.8.2 软件设计
闹钟相关宏定义
1. 编程要点
2. 代码分析
闹钟设置函数
闹钟中断服务函数
main函数
3. 下载验证
第47章 MPU6050传感器—姿态检测
47.1 姿态检测
1. 基本认识
2. 坐标系
47.1.2 利用陀螺仪检测角度
陀螺仪检测的缺陷
47.1.3 利用加速度计检测角度
加速度传感器检测的缺陷
47.1.4 利用磁场检测角度
磁场检测器的缺陷
47.1.5 利用GPS检测角度
47.1.6 姿态融合与四元数
47.2 传感器
1. 传感器工作原理
2. 传感器参数
3. 物理量的表示方法
47.3 MPU6050简介
47.4 MPU6050的特性参数
47.5 MPU6050—获取原始数据实验
47.5.1 硬件设计
47.5.2 软件设计
1. 程序设计要点
2. 代码分析
I2C的硬件定义
初始化I2C
对读写函数的封装
MPU6050的寄存器定义
初始化MPU6050
读传感器ID
读取原始数据
main函数
47.5.3 下载验证
47.6 MPU6050—利用DMP进行姿态解算
47.6.1 硬件设计
47.6.2 软件设计
1. 程序设计要点
2. 代码分析
I2C读写接口
提供定时服务
提供串口调试接口
MPU6050的中断接口
main函数执行流程
数据输出接口
47.6.3 下载验证
1. Python上位机源代码及说明
2. 安装Python环境
3. Python上位机的使用步骤
47.7 MPU6050—使用第三方上位机
47.7.1 硬件设计
47.7.2 软件设计
1. 程序设计要点
2. 代码分析
通讯协议
发送数据包
发送数据
47.7.3 下载验证
第48章 DCMI—OV2640摄像头
48.1 摄像头简介
48.1.1 数字摄像头跟模拟摄像头区别
48.1.2 CCD与CMOS的区别
48.2 OV2640摄像头
48.2.1 OV2640传感器简介
48.2.2 OV2640引脚及功能框图
48.2.3 SCCB时序
SCCB的起始、停止信号及数据有效性
SCCB数据读写过程
48.2.4 OV2640的寄存器
48.2.5 像素数据输出时序
48.3 STM32的DCMI接口简介
48.3.1 DCMI整体框图
外部接口及时序
内部信号及PIXCLK的时钟频率
48.3.2 DCMI接口内部结构
48.3.3 同步方式
48.3.4 捕获模式及捕获率
48.4 DCMI初始化结构体
48.5 DCMI—OV2640摄像头实验
48.5.1 硬件设计
摄像头原理图
摄像头与实验板的连接
48.5.2 软件设计
1. 编程要点
2. 代码分析
摄像头硬件相关宏定义
初始化DCMI的 GPIO及I2C
配置DCMI的模式
配置DMA数据传输
DMA传输完成中断及帧中断
使能DCMI采集
读取OV2640芯片ID
向OV2640写入寄存器配置
main函数
3. 下载验证
第49章 DCMI—OV5640摄像头
49.1 摄像头简介
49.1.1 数字摄像头跟模拟摄像头区别
49.1.2 CCD与CMOS的区别
49.2 OV5640摄像头
49.2.1 OV5640传感器简介
49.2.2 OV5640引脚及功能框图
49.2.3 SCCB时序
SCCB的起始、停止信号及数据有效性
SCCB数据读写过程
49.2.4 OV5640的寄存器
49.2.5 像素数据输出时序
49.3 STM32的DCMI接口简介
49.3.1 DCMI整体框图
外部接口及时序
内部信号及PIXCLK的时钟频率
49.3.2 DCMI接口内部结构
49.3.3 同步方式
49.3.4 捕获模式及捕获率
49.4 DCMI初始化结构体
49.5 DCMI—OV5640摄像头实验
49.5.1 硬件设计
摄像头原理图
摄像头与实验板的连接
49.5.2 软件设计
1. 编程要点
2. 代码分析
摄像头硬件相关宏定义
初始化DCMI的 GPIO及I2C
配置DCMI的模式
配置DMA数据传输
DMA传输完成中断及帧中断
使能DCMI采集
读取OV5640芯片ID
向OV5640写入寄存器配置
初始化OV5640自动对焦功能
main函数
3. 下载验证
第50章 QR-Decoder-OV5640二维码识别
50.1 二维码简介
50.2 二维条形码类型
50.2.1 矩阵式二维条码
50.2.2 行排列式二维条码
50.3 二维条形码的优点
50.4 QR二维码的编码及识别
50.4.1 QR码基本结构
50.4.2 QR码编码过程
50.4.3 QR码识别过程
50.5 QR-Decoder-OV564摄像头实验
50.5.1 QR-Code解码库特点
50.5.2 软件设计
1. 编程要点
2. 代码分析
QR-Code解码库相关宏定义
图像采集
液晶驱动
图像处理
数据解码
串口发送结果
使用TIM2定时器延时
main函数
3. 下载验证
第51章 MDK的编译过程及文件类型全解
51.1 编译过程
51.1.1 编译过程简介
51.1.2 具体工程中的编译过程
51.2 程序的组成、存储与运行
51.2.1 CODE、RO、RW、ZI Data域及堆栈空间
51.2.2 程序的存储与运行
51.3 编译工具链
51.3.1 设置环境变量
1. 添加路径到PATH环境变量
51.3.2 armcc、armasm及armlink
1. armcc
2. armasm
3. armlink
51.3.3 armar、fromelf及用户指令
51.4 MDK工程的文件类型
51.4.1 uvprojx、uvoptx、uvguix及ini工程文件
1. uvprojx文件
2. uvoptx文件
3. uvguix文件
51.4.2 源文件
51.4.3 Output目录下生成的文件
1. lib库文件
2. dep、d依赖文件
3. crf交叉引用文件
4. o、axf及elf文件
ELF文件说明
o文件与axf文件的关系
ELF文件头
程序头
节区头
节区主体及反汇编代码
分散加载代码
5. hex文件及bin文件
生成hex文件
生成bin文件
hex文件格式
hex、bin及axf文件的区别与联系
6. htm静态调用图文件
51.4.4 Listing目录下的文件
1. map文件说明
节区的跨文件引用
删除无用节区
符号映像表
存储器映像索引
映像组件大小
51.4.5 sct分散加载文件的格式与应用
1. sct分散加载文件简介
2. 分散加载文件的格式
加载域
执行域
输入节区描述
3. 通过MDK配置选项来修改sct文件
选择sct文件的产生方式
通过Target对话框控制存储器分配
控制文件分配到指定的存储空间
51.5 实验:自动分配变量到外部SDRAM空间
51.5.1 硬件设计
51.5.2 软件设计
1. 编程要点
2. 代码分析
在__main之前初始化SDRAM
sct文件初步应用
变量分配测试及结果
51.6 实验:优先使用内部SRAM并把堆区分配到SDRAM空间
51.6.1 硬件设计
51.6.2 软件设计
1. 编程要点
2. 代码分析
在__main之前初始化SDRAM
sct文件配置
指定变量分配到节区
变量分配测试及结果
使用malloc和free管理SDRAM的空间
把堆区分配到内部SRAM空间。
屏蔽链接过程的warning
注意SDRAM用于显存的改变
如何把栈空间也分配到SDRAM
第52章 在SRAM中调试代码
52.1 在RAM中调试代码
52.2 STM32的启动方式
52.3 内部FLASH的启动过程
52.4 实验:在内部SRAM中调试代码
52.4.1 硬件设计
52.4.2 软件设计
1. 主要步骤
2. 创建工程的调试版本
3. 配置分散加载文件
4. 配置中断向量表
5. 修改FLASH下载配置
6. 仿真器的配置
7. 不需要修改BOOT引脚的仿真配置
第53章 读写内部FLASH
53.1 STM32的内部FLASH简介
1. 内部FLASH的构成
53.2 对内部FLASH的写入过程
1. 解锁
2. 数据操作位数
3. 擦除扇区
4. 写入数据
53.3 查看工程的空间分布
1. 程序ROM的加载与执行空间
2. ROM空间分布表
53.4 操作内部FLASH的库函数
1. FLASH解锁、上锁函数
2. 设置操作位数及擦除扇区
3. 写入数据
53.5 实验:读写内部FLASH
53.5.1 硬件设计
53.5.2 软件设计
1. 程序设计要点
2. 代码分析
硬件定义
根据扇区地址计算SNB寄存器的值
读写内部FLASH
main函数
53.5.3 下载验证
第54章 设置FLASH的读写保护及解除
54.1 选项字节与读写保护
54.1.1 选项字节的内容
54.1.2 RDP读保护级别
54.1.3 PCROP代码读出保护
54.2 修改选项字节的过程
54.3 操作选项字节的库函数
1. 选项字节解锁、上锁函数
2. 设置读保护级别
3. 写入选项字节
54.4 实验:设置读写保护及解除
54.4.1 硬件设计
54.4.2 软件设计
1. 主要实验
2. 代码分析
配置扇区写保护
配置PCROP保护
恢复选项字节为默认值
main函数
3. 下载测试
第55章 DWT—内核定时器
55.1 DWT简介
55.2 DWT相关寄存器
1. DEMCR
2. DWT_CYCCNT
3. CYCCNTENA
55.3 相关实现函数
55.4 实验:DWT控制流水灯
55.4.1 硬件设计
55.4.2 软件设计
主函数
联系我们
零死角玩转 STM32 —基于野火 F429[挑战者_V2]开发板 第1章 如何使用本书 1.1 本书的参考资料 本书参考资料为:《STM32F4xx 中文参考手册》和《Cortex®-M4 内核编程手册》, 这两本是 ST 官方的手册,属于精华版,面面俱到,无所不包。限于篇幅问题,本书不可 能面面具到,着重框图分析和代码讲解,有关寄存器的详细描述则略过,在学习本书的时 候,涉及到寄存器描述部分还请参考这两本手册,这样学习效果会更佳。 1.2 本书的编写风格 本书着重讲解 F429 的外设以及外设的应用,力争全面分析每个外设的功能框图和外设 的使用方法,让读者可以零死角的玩转 STM32—F429。基本每个章节对应一个外设,每章 的主要内容大概分为三个部分,第一部分为简介,第二部分为外设功能框图分析,第三部 分为代码讲解。 外设简介则是用自己的话把外设概括性的介绍一遍,力图语句简短,通俗易懂,并不 会完全照抄数据手册的介绍。 外设功能框图分析则是章节的重点,该部分会详细讲解功能框图的每个部分的作用, 这是学习 F429 的精髓所在,掌握了整个外设的框图则可以熟练的使用该外设,熟练的编程, 日后学习其他型号的单片机,也将会得心应手。因为即使单片机的型号不同,外设的框图 还是基本一样的。这一步的学习比较枯燥,但是必须死磕,方能达成所愿。 代码分析则是讲解使用该外设的实验讲解,主要分析代码流程,和一些编程的注意事 项。在掌握了框图之后,代码部分则是手到擒来而已。 1.3 本书的配套硬件 本书配套的硬件平台为:野火 STM32-F429 挑战者开发板,学习的时候如果配套该硬 件平台做实验,学习必会达到事半功倍的效果,可以省去中间移植时遇到的各种问题。 第 1 页 共 1048
零死角玩转 STM32 —基于野火 F429[挑战者_V2]开发板 图 1-1 野火 STM32—F429 挑战者_V2 硬件资源 1.4 本书的技术论坛 如果在学习过程中遇到问题,可以到论坛:www.firebbs.cn 发帖交流 ,开源共享,共 同进步。 鉴于水平有限,本书难免有纰漏,热心的读者也可把勘误发到论坛好让我们改进做得 更好,祝您学习愉快,M4 的世界,野火与您同行。 第 2 页 共 1048
零死角玩转 STM32 —基于野火 F429[挑战者_V2]开发板 第2章 如何安装 KEIL5 本章内容所涉及的软件只供教学使用,不得用于商业用途。个人或公司因商业用途导 致的法律责任,后果自负。 2.1 温馨提示 1、安装路径不能带中文,必须是英文路径 2、安装目录不能跟 51 的 KEIL 或者 KEIL4 冲突,三者目录必须分开 3、KEIL5 的安装比起 KEIL4 多了一个步骤,必须添加 MCU 库,不然没法使用。 4、如果使用的时候出现莫名其妙的错误,先百度查找解决方法,莫乱阵脚。 2.2 获取 KEIL5 安装包 要想获得 KEIL5 的安装包,在百度里面搜索“KEIL5 下载”即可找到很多网友提供的 下载文件,或者到 KEIL 的官网下载:https://www.keil.com/download/product/,一大堆注册 非常麻烦。我们这里面 KEIL5 的版本是 MDK5.15,以后有新版本大家可使用更高版本。 2.3 开始安装 KEIL5 双击 KEIL5 安装包,开始安装,next。 第 3 页 共 1048
零死角玩转 STM32 —基于野火 F429[挑战者_V2]开发板 Agree,Nest 选择安装 路径,路径不能带中文,next 第 4 页 共 1048
零死角玩转 STM32 —基于野火 F429[挑战者_V2]开发板 填写用户信息,全部填空格(键盘的 space 键)即可,next Finish,安装完毕 第 5 页 共 1048
零死角玩转 STM32 —基于野火 F429[挑战者_V2]开发板 2.4 安装 STM32 芯片包 KEIL5 不像 KEIL4 那样自带了很多厂商的 MCU 型号,KEIL5 需要自己安装。 把下面弹出的界面关掉,我们直接去 keil 的官网下载:http://www.keil.com/dd2/pack/,或者 直接用我们下载好的包。 在官网中找到 STM32F1、STM32F4、STM32F7 这 3 个系列的包下载到本地电脑,具 体下载哪个系列的根据你使用的型号下载即可,这里我只下载我自己需要使用的 F1/4/7 这 三个系列的包,F1 代表 M3,F4 代表 M4,F7 代表 M7。 第 6 页 共 1048
零死角玩转 STM32 —基于野火 F429[挑战者_V2]开发板 把下载好的包双击安装即可,安装路径选择跟 KEIL5 一样的安装路径,安装成功之后, 在 KEIL5 的 Pack Installer 中就可以看到我们安装的包,以后我们新建工程的时候,就有单 片机的型号可选。 第 7 页 共 1048
零死角玩转 STM32 —基于野火 F429[挑战者_V2]开发板 第3章 如何用 DAP 仿真器下载程序 3.1 仿真器简介 本书配套的仿真器为 Fire-Debugger,遵循 ARM 公司的 CMSIS-DAP 标准,支持所有 基于 Cortex 内核的单片机,常见的 M3、M4 和 M7 都可以完美支持,其外观见图 3-1。 Fire-Debugger 支持下载和在线仿真程序,支持 XP/WIN7/WIN8/WIN10 这四个操作系 统,免驱,不需要安装驱动即可使用,支持 KEIL 和 IAR 直接下载,非常方便。 3.2 硬件连接 图 3-1 DAP 下载器外观 把仿真器用 USB 线连接电脑,如果仿真器的灯亮则表示正常,可以使用。然后把仿真 器的另外一端连接到开发板,给开发板上电,然后就可以通过软件 KEIL 或者 IAR 给开发 板下载程序。 图 3-2 仿真器与电脑和开发板连接方式 第 8 页 共 1048
分享到:
收藏