| 作者 |
| 刘火良 杨森 |
| 丛书名 |
| 电子与嵌入式系统设计丛书 |
| 出版社 |
| 机械工业出版社 |
| ISBN |
| 9781909181419 |
| 简要 |
| 简介 |
| 内容简介书籍计算机书籍 ---------------------------LwIP应用开发实战指南:基于STM32--------------------------- 本书以LwIP源码为核心,讲解TCP/IP协议栈的实现,讲解常见的网络协议,讲解LwIP各层之间的数据传递,最终辅以实战案例,教你如何连接各大云平台,配套野火STM32 M4/M7系列开发板,提供完整源代码,极具操作性。 ---------------------------STM32库开发实战指南:基于STM32F4--------------------------- 本书的主要内容将着重介绍STM32的库函数,以及如何使用库的方式进行开发。使初学者能够快速入门能够在此基础上迅速入门,掌握STM32的开发方法。本书内容基于ARM-CortexM3内核的STM32F429芯片,紧紧围绕“库”展开,系统地讲述了STM32固件库的原理、使用方法。 |
| 目录 |
---------------------------LwIP应用开发实战指南:基于STM32--------------------------- 前 言 第1章 网络协议概述 1 1.1 常用网络协议 1 1.2 网络协议的分层模型 2 1.3 协议层报文间的封装与拆封 3 第2章 LwIP概述 5 2.1 LwIP的优缺点 5 2.2 LwIP的文件说明 6 2.2.1 获取LwIP源码文件 6 2.2.2 LwIP文件说明 8 2.3 LwIP的说明文档 11 2.4 使用vs code查看源码 14 2.4.1 查看文件中的符号列表和函数列表 14 2.4.2 函数定义跳转 15 2.5 LwIP源码里的示例 16 2.6 LwIP的3种编程接口 17 2.6.1 RAW/Callback API 17 2.6.2 Netconn API 18 2.6.3 Socket API 19 第3章 开发平台 20 3.1 以太网概述 20 3.1.1 PHY层 20 3.1.2 MAC子层 21 3.2 STM32的ETH外设 23 3.3 MII和RMII接口 24 3.4 PHY:LAN8720A 25 3.5 硬件设计 27 3.6 软件设计 29 3.6.1 获取STM32的裸机工程模板 29 3.6.2 添加bsp_eth.c与bsp_eth.h 29 3.6.3 修改stm32f4xx_hal_conf.h文件 35 第4章 LwIP的网络接口管理 37 4.1 netif结构体 37 4.2 netif的使用 41 4.3 与netif相关的底层函数 45 4.4 ethernetif.c文件内容 46 4.4.1 ethernetif数据结构 46 4.4.2 ethernetif_init() 47 4.4.3 low_level_init() 48 第5章 LwIP的内存管理 50 5.1 几种内存分配策略 50 5.1.1 固定大小的内存块 50 5.1.2 可变长度分配 51 5.2 动态内存池 52 5.2.1 内存池的预处理 52 5.2.2 内存池的初始化 57 5.2.3 内存分配 58 5.2.4 内存释放 59 5.3 动态内存堆 61 5.3.1 内存堆的组织结构 61 5.3.2 内存堆初始化 62 5.3.3 内存分配 64 5.3.4 内存释放 67 5.4 使用C库的malloc和free函数来管理内存 71 5.5 LwIP中的配置 72 第6章 网络数据包 74 6.1 TCP/IP的分层思想 74 6.2 LwIP的线程模型 75 6.3 pbuf结构体说明 76 6.4 pbuf的类型 77 6.4.1 PBUF_RAM类型的pbuf 78 6.4.2 PBUF_POOL类型的pbuf 78 6.4.3 PBUF_ROM和PBUF_REF类型的pbuf 80 6.5 pbuf_alloc() 81 6.6 pbuf_free() 84 6.7 其他pbuf操作函数 88 6.7.1 pbuf_realloc() 88 6.7.2 pbuf_header() 88 6.7.3 pbuf_take()、pbuf_copy()、pbuf_chain()和pbuf_ref() 88 6.8 网卡中使用的pbuf 88 6.8.1 low_level_output() 88 6.8.2 low_level_input() 91 6.8.3 ethernetif_input() 93 第7章 无操作系统移植LwIP 94 7.1 将LwIP添加到裸机工程 94 7.2 移植头文件 97 7.3 移植网卡驱动 103 7.4 LwIP时基 111 7.5 协议栈初始化 112 7.6 获取数据包 114 7.6.1 查询方式 114 7.6.2 ping命令详解 115 7.6.3 中断方式 116 第8章 有操作系统移植LwIP 119 8.1 向LwIP中添加操作系统 119 8.1.1 复制FreeRTOS源码到工程文件夹 119 8.1.2 添加FreeRTOS源码到工程组文件夹 120 8.1.3 指定FreeRTOS头文件的路径 120 8.1.4 修改stm32f10x_it.c 121 8.2 lwipopts.h文件需要加入的配置 122 8.3 sys_arch.c/h文件的编写 126 8.4 网卡底层的编写 136 8.5 协议栈初始化 138 8.6 移植后使用ping命令测试基本响应 141 第9章 LwIP一探究竟 142 9.1 网卡数据传入LwIP内核的流程 142 9.2 内核超时处理 142 9.2.1 sys_timeo结构体与超时链表 144 9.2.2 注册超时事件 144 9.2.3 超时检查 147 9.3 tcpip_thread线程 149 9.4 LwIP中的消息 151 9.4.1 消息结构 151 9.4.2 数据包消息 153 9.4.3 API消息 154 9.5 揭开LwIP的神秘面纱 158 第10章 ARP 159 10.1 数据链路层概述 159 10.2 MAC地址的基本概念 159 10.3 初识ARP 160 10.4 以太网帧结构 160 10.5 IP地址映射为物理地址 161 10.6 ARP缓存表 162 10.7 ARP缓存表的超时处理 165 10.8 ARP报文 167 10.9 发送ARP请求包 170 10.10 数据包接收流程 172 10.10.1 以太网中数据包的接收 172 10.10.2 ARP数据包处理 176 10.10.3 更新ARP缓存表 178 10.11 数据包发送流程 182 10.11.1 etharp_output() 182 10.11.2 etharp_output_to_arp_index() 185 10.11.3 etharp_query() 186 第11章 IP 193 11.1 IP地址 193 11.1.1 概述 193 11.1.2 IP地址编址 193 11.1.3 特殊IP地址 195 11.2 局域网和广域网的概念 196 11.2.1 局域网 196 11.2.2 广域网 196 11.3 网络地址转换 197 11.4 IP数据报 198 11.5 IP数据报的数据结构 202 11.6 IP数据报分片 204 11.7 IP数据报发送 208 11.8 IP数据报接收 214 第12章 ICMP 222 12.1 ICMP功能简介 222 12.2 ICMP报文结构 223 12.3 ICMP报文类型 224 12.3.1 ICMP差错报告报文 224 12.3.2 ICMP查询报文 226 12.4 LwIP中的ICMP实现 227 12.4.1 ICMP报文数据结构 227 12.4.2 发送ICMP差错报文 229 12.4.3 处理ICMP报文 231 第13章 TCP 235 13.1 TCP服务概述 235 13.2 TCP的特性 235 13.2.1 连接机制 235 13.2.2 确认与重传 235 13.2.3 缓冲机制 236 13.2.4 全双工通信 236 13.2.5 流量控制 236 13.2.6 差错控制 237 13.2.7 拥塞控制 237 13.3 端口号的概念 237 13.4 TCP报文段结构 239 13.4.1 TCP报文段的封装 239 13.4.2 TCP报文段格式 239 13.5 TCP连接 243 13.5.1 “三次握手”建立连接 243 13.5.2 “四次挥手”终止连接 246 13.6 TCP状态 247 13.6.1 LwIP中定义的TCP状态 247 13.6.2 TCP状态转移 248 13.7 TCP中的数据结构 250 13.8 窗口的概念 253 13.8.1 接收窗口 254 13.8.2 发送窗口 254 13.9 TCP报文段处理 255 13.9.1 报文段缓冲队列 255 13.9.2 TCP报文段发送 256 13.9.3 TCP报文段接收 260 第14章 UDP 265 14.1 UDP概述 265 14.2 UDP常用端口号 266 14.3 UDP报文 266 14.4 UDP报文的数据结构 267 14.4.1 UDP报文首部结构体 267 14.4.2 UDP控制块 267 14.5 UDP报文发送 270 14.6 UDP报文接收 272 第15章 使用Netconn接口编程 277 15.1 netbuf结构体 277 15.2 netbuf相关函数说明 279 15.2.1 netbuf_new() 279 15.2.2 netbuf_delete() 279 15.2.3 netbuf_alloc() 280 15.2.4 netbuf_free() 280 15.2.5 netbuf_ref() 281 15.2.6 netbuf_chain() 282 15.2.7 netbuf_data() 282 15.2.8 netbuf_next()与netbuf_first() 282 15.2.9 netbuf_copy() 283 15.2.10 netbuf_take() 284 15.2.11 其他操作netbuf的宏定义 285 15.3 netconn结构体 285 15.4 netconn函数接口说明 287 15.4.1 netconn_new() 287 15.4.2 netconn_delete() 288 15.4.3 netconn_getaddr() 290 15.4.4 netconn_bind() 290 15.4.5 netconn_connect() 291 15.4.6 netconn_disconnect() 292 15.4.7 netconn_listen() 293 15.4.8 netconn_accept() 293 15.4.9 netconn_recv() 295 15.4.10 netconn_send() 296 15.4.11 netconn_sendto() 297 15.4.12 netconn_write() 298 15.4.13 netconn_close() 301 15.5 实验 302 15.5.1 TCP Client实验 302 15.5.2 TCP Client实验现象 307 15.5.3 TCP Server实验 308 15.5.4 TCP Server实验现象 314 15.5.5 UDP实验 315 15.5.6 UDP实验现象 319 第16章 使用Socket接口编程 321 16.1 什么是Socket 321 16.2 LwIP中的Socket 321 16.3 Socket API 322 16.3.1 socket() 322 16.3.2 bind() 323 16.3.3 connect() 324 16.3.4 listen() 325 16.3.5 accept() 325 16.3.6 read()、recv()、recvfrom() 325 16.3.7 sendto() 326 16.3.8 send() 327 16.3.9 write() 327 16.3.10 close() 327 16.3.11 ioctl()、ioctlsocket() 327 16.3.12 setsockopt() 328 16.3.13 getsockopt() 329 16.4 实验 329 16.4.1 TCP Client实验 329 16.4.2 TCP Server实验 331 16.4.3 UDP实验 333 第17章 使用RAW API接口编程 335 17.1 RAW API的UDP编程 335 17.1.1 新建控制块:udp_new() 335 17.1.2 绑定控制块:udp_bind() 336 17.1.3 建立会话:udp_connect() 337 17.1.4 断开会话:udp_disconnect() 338 17.1.5 接收数据:udp_recv() 339 17.1.6 发送数据:udp_send()与udp_sendto() 339 17.1.7 删除UDP控制块:udp_remove() 341 17.2 RAW API的TCP编程 341 17.2.1 新建控制块:tcp_new() 341 17.2.2 绑定控制块:tcp_bind() 342 17.2.3 控制块监听:tcp_listen() 343 17.2.4 处理连接:tcp_accept() 345 17.2.5 建立连接:tcp_connect() 346 17.2.6 终止连接:tcp_close() 348 17.2.7 接收数据:tcp_recv() 350 17.2.8 发送数据:tcp_sent() 350 17.2.9 异常处理:tcp_err() 351 17.2.10 周期性回调:tcp_poll() 351 17.2.11 构建报文段:tcp_write() 352 17.2.12 更新接收窗口:tcp_recved() 352 17.3 实验 353 17.3.1 TCP Client实验 353 17.3.2 TCP Server实验 358 17.3.3 UDP实验 360 第18章 使用JPerf工具测试网速 362 18.1 iPerf与JPerf 362 18.2 测试网络速度 362 18.2.1 获取JPerf网络测速工具 362 18.2.2 测试开发板接收速度(Netconn API) 363 18.2.3 测试开发板接收速度(Socket API) 366 18.2.4 测试开发板发送速度(Netconn API) 369 18.2.5 测试开发板发送速度(Socket API) 372 18.3 提高LwIP网络传输的速度 375 第19章 HTTP 377 19.1 什么是HTTP 377 19.2 URL与资源 378 19.3 HTTP报文 379 19.4 使用Postman获取论坛数据 380 19.5 使用开发板获取论坛数据 382 第20章 HTTP服务器 386 20.1 Hello World网页demo 386 20.2 提供网页控制LED开关的功能 389 第21章 MQTT协议 394 21.1 MQTT协议概述 394 21.2 MQTT通信模型 394 21.3 消息主题与服务质量 395 21.4 MQTT控制报文 396 21.4.1 固定报头 396 21.4.2 可变报头 397 21.4.3 有效载荷 400 21.5 移植MQTT协议 401 21.6 cJSON移植 407 第22章 连接到百度天工物接入 411 22.1 物接入概述 411 22.2 使用IoT Hub 411 22.2.1 创建计费套餐 411 22.2.2 创建项目 411 22.2.3 创建策略 413 22.2.4 创建身份与创建用户 413 22.2.5 MQTT软件测试连接 415 22.3 开发板连接IoT Hub 417 22.4 IoT Hub的规则引擎 422 22.4.1 什么是规则引擎 422 22.4.2 使用规则引擎 422 22.5 数据可视化 424 22.5.1 IoT Hub的时序数据库 424 22.5.2 IoT Hub的物可视 426 第23章 连接到阿里云物联 429 23.1 使用阿里云物联 429 23.2 MQTT软件测试连接 431 23.3 开发板连接阿里云物联 434 23.4 阿里云物联的规则引擎 435 第24章 连接到OneNET 437 24.1 使用OneNET 437 24.2 测试连接 438 24.3 开发板连接OneNET 439 24.4 添加数据流 441 24.5 系统主题的发布格式 442 24.6 使用开发板发布数据点 443 24.7 数据可视化 446 ---------------------------STM32库开发实战指南:基于STM32F4--------------------------- 前言 第1章 如何安装KEIL5 1 1.1 温馨提示 1 1.2 获取KEIL5安装包 1 1.3 开始安装KEIL5 1 1.4 安装STM32芯片包 3 第2章 如何用DAP仿真器下载程序 6 2.1 仿真器简介 6 2.2 硬件连接 6 2.3 仿真器配置 6 2.4 选择目标板 9 2.5 下载程序 9 第3章 初识STM32 10 3.1 什么是STM32 10 3.2 STM32能做什么 10 3.2.1 智能手环 11 3.2.2 微型四轴飞行器 12 3.2.3 淘宝众筹 12 3.3 STM32选型 13 3.3.1 STM32分类 13 3.3.2 STM32命名方法 14 3.3.3 选择合适的MCU 14 第4章 寄存器 17 4.1 寄存器简介 17 4.2 STM32的外观 17 4.3 芯片里面有什么 18 4.4 存储器映射 21 4.5 寄存器映射 23 4.5.1 STM32的外设地址映射 23 4.5.2 C语言对寄存器的封装 26 第5章 新建工程——寄存器版 31 5.1 新建本地工程文件夹工程 31 5.1.1 新建本地工程文件夹 31 5.1.2 新建工程 32 5.2 下载程序 38 第6章 使用寄存器点亮LED 39 6.1 GPIO简介 39 6.2 GPIO框图剖析 39 6.2.1 基本结构分析 39 6.2.2 GPIO工作模式 42 6.3 实验:使用寄存器点亮LED 43 6.3.1 硬件连接 44 6.3.2 启动文件 44 6.3.3 stm32f4xx.h文件 46 6.3.4 main文件 47 6.3.5 下载验证 51 第7章 自己写库——构建库函数雏形 52 7.1 STM32函数库简介 52 7.2 采用库来开发及学习的原因 53 7.3 实验:构建库函数雏形 53 7.3.1 修改寄存器地址封装 54 7.3.2 定义访问外设的结构体指针 55 7.3.3 定义初始化结构体 59 7.3.4 定义引脚模式的枚举类型 60 7.3.5 定义GPIO初始化函数 62 7.3.6 使用函数点亮LED 64 7.3.7 下载验证 66 7.3.8 总结 66 第8章 初识STM32标准库 67 8.1 CMSIS标准及库层次关系 67 8.1.1 库、文件简介 68 8.1.2 各库文件间的关系 74 8.2 使用帮助文档 75 8.2.1 常用官方资料 75 8.2.2 初识库函数 76 第9章 新建工程——库函数版 78 9.1 新建本地工程文件夹 78 9.2 新建工程 79 9.3 配置魔术棒选项卡 82 9.4 下载器配置 85 9.5 选择Flash大小 86 第10章 GPIO输出——使用固件库点亮LED 88 10.1 硬件设计 88 10.2 软件设计 88 10.2.1 编程要点 89 10.2.2 代码分析 89 10.2.3 下载验证 94 10.3 STM32标准库补充知识 94 第11章 GPIO输入——按键检测 98 11.1 硬件设计 98 11.2 软件设计 99 11.2.1 编程要点 99 11.2.2 代码分析 99 11.2.3 下载验证 102 第12章 GPIO——位带操作 103 12.1 位带简介 103 12.1.1 外设位带区 103 12.1.2 SRAM位带区 104 12.1.3 位带区和位带别名区地址转换 104 12.2 GPIO位带操作 105 第13章 启动文件 108 13.1 启动文件简介 108 13.2 查找ARM汇编指令 108 13.3 启动文件代码讲解 109 第14章 RCC——使用HSE/HSI配置时钟 116 14.1 RCC主要作用——时钟部分 116 14.2 RCC框图剖析——时钟树 116 14.2.1 系统时钟 116 14.2.2 其他时钟 121 14.3 配置系统时钟实验 122 14.3.1 使用HSE 122 14.3.2 使用HSI 122 14.3.3 硬件设计 123 14.3.4 软件设计 123 14.3.5 下载验证 129 第15章 STM32中断应用概览 130 15.1 异常类型 130 15.2 NVIC简介 131 15.2.1 NVIC寄存器简介 131 15.2.2 NVIC中断配置固件库 132 15.3 优先级的定义 132 15.3.1 优先级定义 132 15.3.2 优先级分组 133 15.4 中断编程 134 第16章 EXTI——外部中断/事件控制器 136 16.1 EXTI简介 136 16.2 EXTI功能框图 136 16.3 中断/事件线 138 16.4 EXTI初始化结构体详解 139 16.5 外部中断控制实验 139 16.5.1 硬件设计 140 16.5.2 软件设计 140 16.5.3 下载验证 144 第17章 SysTick——系统定时器 145 17.1 SysTick简介 145 17.2 SysTick寄存器介绍 145 17.3 SysTick定时实验 146 17.3.1 硬件设计 146 17.3.2 软件设计 146 第18章 通信的基本概念 152 18.1 串行通信与并行通信 152 18.2 全双工、半双工及单工通信 153 18.3 同步通信与异步通信 153 18.4 通信速率 154 第19章 USART——串口通信 155 19.1 串口通信协议简介 155 19.1.1 物理层 155 19.1.2 协议层 158 19.2 STM32的USART简介 159 19.3 USART功能框图 160 19.4 USART初始化结构体详解 166 19.5 USART1接发通信实验 167 19.5.1 硬件设计 168 19.5.2 软件设计 168 19.5.3 下载验证 173 19.6 USART1指令控制RGB彩灯实验 174 19.6.1 硬件设计 174 19.6.2 软件设计 174 19.6.3 下载验证 179 第20章 DMA 180 20.1 DMA简介 180 20.2 DMA功能框图 180 20.3 DMA数据配置 184 20.4 DMA初始化结构体详解 188 20.5 DMA存储器到存储器模式实验 190 20.5.1 硬件设计 190 20.5.2 软件设计 190 20.5.3 下载验证 195 20.6 DMA存储器到外设模式实验 195 20.6.1 硬件设计 195 20.6.2 软件设计 195 20.6.3 下载验证 199 第21章 常用存储器介绍 200 21.1 存储器种类 200 21.2 RAM存储器 200 21.2.1 DRAM 201 21.2.2 SRAM 202 21.2.3 DRAM与SRAM的应用场合 202 21.3 非易失性存储器 202 21.3.1 ROM存储器 202 21.3.2 Flash存储器 203 第22章 I2C——读写EEPROM 205 22.1 I2C协议简介 205 22.1.1 I2C物理层 205 22.1.2 协议层 206 22.2 STM32的I2C特性及架构 209 22.2.1 STM32的I2C外设简介 209 22.2.2 STM32的I2C架构剖析 210 22.2.3 通信过程 212 22.3 I2C初始化结构体详解 213 22.4 I2C——读写EEPROM实验 215 22.4.1 硬件设计 215 22.4.2 软件设计 216 22.4.3 下载验证 234 第23章 SPI——读写串行Flash 235 23.1 SPI协议简介 235 23.1.1 SPI物理层 235 23.1.2 协议层 236 23.2 STM32的SPI特性及架构 238 23.2.1 STM32的SPI外设简介 238 23.2.2 STM32的SPI架构剖析 239 23.2.3 通信过程 241 23.3 SPI初始化结构体详解 242 23.4 SPI——读写串行Flash实验 243 23.4.1 硬件设计 243 23.4.2 软件设计 244 23.4.3 下载验证 264 第24章 串行Flash文件系统FatFs 265 24.1 文件系统 265 24.2 FatFs文件系统简介 266 24.2.1 FatFs的结构 266 24.2.2 FatFs帮助文档 266 24.2.3 FatFs源码 267 24.3 FatFs文件系统移植实验 268 24.3.1 FatFs程序结构图 268 24.3.2 硬件设计 269 24.3.3 FatFs移植步骤 269 24.3.4 FatFs底层设备驱动函数 271 24.3.5 FatFs功能配置 276 24.3.6 FatFs功能测试 277 24.3.7 下载验证 280 24.4 FatFs功能使用实验 281 24.4.1 硬件设计 281 24.4.2 软件设计 281 24.4.3 下载验证 286 第25章 FMC——扩展外部SDRAM 287 25.1 SDRAM控制原理 287 25.1.1 SDRAM信号线 288 25.1.2 控制逻辑 289 25.1.3 地址控制 289 25.1.4 SDRAM的存储阵列 289 25.1.5 数据输入输出 289 25.1.6 SDRAM的命令 290 25.1.7 SDRAM的初始化流程 295 25.1.8 SDRAM的读写流程 296 25.2 FMC简介 297 25.3 FMC框图剖析 298 25.4 FMC的地址映射 300 25.5 SDRAM时序结构体 302 25.6 SDRAM初始化结构体 303 25.7 SDRAM命令结构体 304 25.8 FMC——扩展外部SDRAM实验 305 25.8.1 硬件设计 305 25.8.2 软件设计 305 25.8.3 下载验证 316 第26章 LTDC/DMA2D——液晶显示 317 26.1 显示器简介 317 26.1.1 液晶显示器 317 26.1.2 LED和OLED显示器 318 26.1.3 显示器的基本参数 319 26.2 液晶屏控制原理 319 26.2.1 液晶面板的控制信号 320 26.2.2 液晶数据传输时序 321 26.2.3 显存 323 26.3 LTDC液晶控制器简介 323 26.3.1 图像数据混合 323 26.3.2 LTDC结构框图剖析 324 26.4 DMA2D图形加速器简介 327 26.5 LTDC初始化结构体 329 26.6 LTDC层级初始化结构体 331 26.7 DMA2D初始化结构体 334 26.8 LTDC/DMA2D——液晶显示实验 336 26.8.1 硬件设计 336 26.8.2 软件设计 338 26.8.3 下载验证 358 第27章 LTDC——液晶显示中英文 359 27.1 字符编码 359 27.1.1 ASCII编码 359 27.1.2 中文编码 362 27.1.3 Unicode字符集和编码 365 27.1.4 UTF-32 365 27.1.5 UTF-16 365 27.1.6 UTF-8 366 27.1.7 BOM 367 27.2 字模简介 367 27.2.1 字模的构成 368 27.2.2 字模显示原理 368 27.2.3 如何制作字模 370 27.2.4 字模寻址公式 371 27.2.5 存储字模文件 372 27.3 LTDC——各种模式的液晶显示字符实验 372 27.3.1 硬件设计 373 27.3.2 显示ASCII编码的字符 373 27.3.3 显示GB2312编码的字符 382 27.3.4 显示任意大小的字符 391 27.3.5 下载验证 398 第28章 电容触摸屏——触摸画板 399 28.1 触摸屏简介 399 28.1.1 电阻触摸屏检测原理 399 28.1.2 电容触摸屏检测原理 401 28.2 电容触摸屏控制芯片 402 28.2.1 GT9157芯片的引脚 403 28.2.2 上电时序与I2C设备地址 404 28.2.3 寄存器配置 404 28.2.4 读取坐标信息 406 28.3 电容触摸屏——触摸画板实验 408 28.3.1 硬件设计 408 28.3.2 软件设计 409 28.3.3 下载验证 430 第29章 ADC——电压采集 431 29.1 ADC简介 431 29.2 ADC功能框图剖析 431 29.2.1 ADC功能 431 29.2.2 电压转换 437 29.3 ADC初始化结构体详解 437 29.4 独立模式单通道采集实验 438 29.4.1 硬件设计 439 29.4.2 软件设计 439 29.4.3 下载验证 443 29.5 独立模式多通道采集实验 443 29.5.1 硬件设计 443 29.5.2 软件设计 443 29.5.3 下载验证 449 29.6 三重ADC交替模式采集实验 449 29.6.1 硬件设计 449 29.6.2 软件设计 450 29.6.3 下载验证 455 第30章 TIM——基本定时器 456 30.1 TIM简介 456 30.2 基本定时器 456 30.3 基本定时器功能框图 458 30.4 定时器初始化结构体详解 460 30.5 基本定时器定时实验 461 30.5.1 硬件设计 461 30.5.2 软件设计 461 30.5.3 下载验证 464 第31章 TIM——高级定时器 465 31.1 高级控制定时器 465 31.2 高级控制定时器功能框图 466 31.3 输入捕获应用 476 31.3.1 测量脉宽或者频率 476 31.3.2 PWM输入模式 477 31.4 输出比较应用 478 31.5 定时器初始化结构体详解 480 31.6 PWM互补输出实验 483 31.6.1 硬件设计 484 31.6.2 软件设计 484 31.6.3 下载验证 488 31.7 PWM输入捕获实验 489 31.7.1 硬件设计 489 31.7.2 软件设计 489 31.7.3 下载验证 494 第32章 TIM——电容按键检测 495 32.1 电容按键原理 495 32.2 电容按键检测实验 496 32.2.1 硬件设计 497 32.2.2 软件设计 497 32.2.3 下载验证 504 第33章 SDIO——SD卡读写测试 505 33.1 SDIO简介 505 33.2 SD卡物理结构 506 33.3 SDIO总线 507 33.3.1 总线拓扑 507 33.3.2 总线协议 508 33.3.3 命令 510 33.3.4 响应 512 33.4 SD卡的操作模式及切换 514 33.4.1 SD卡的操作模式 514 33.4.2 卡识别模式 514 33.4.3 数据传输模式 516 33.5 STM32的SDIO功能框图 516 33.6 SDIO初始化结构体 521 33.7 SDIO命令初始化结构体 522 33.8 SDIO数据初始化结构体 523 33.9 SD卡读写测试实验 523 33.9.1 硬件设计 524 33.9.2 软件设计 524 33.9.3 下载验证 549 第34章 基于SD卡的FatFs文件系统 550 34.1 FatFs移植步骤 550 34.2 FatFs接口函数 552 34.3 FatFs功能测试 557 第35章 I2S——音频播放与录音输入 561 35.1 I2S简介 561 35.1.1 数字音频技术 561 35.1.2 I2S总线接口 562 35.1.3 音频数据传输协议标准 562 35.2 I2S功能框图 565 35.3 WM8978音频编译码器 567 35.4 WAV格式文件 569 35.4.1 RIFF文件规范 570 35.4.2 WAV文件 570 35.4.3 WAV文件实例分析 571 35.5 I2S初始化结构体详解 571 35.6 录音与回放实验 572 35.6.1 硬件设计 573 35.6.2 软件设计 573 35.6.3 下载验证 601 35.7 MP3播放器 601 35.7.1 MP3文件结构 602 35.7.2 MP3解码库 605 35.7.3 Helix解码库移植 606 35.7.4 MP3播放器功能实现 606 35.7.5 下载验证 614 第36章 ETH——LwIP以太网通信 615 36.1 互联网模型 615 36.2 以太网 616 36.2.1 PHY层 616 36.2.2 MAC子层 617 36.3 TCP/IP协议栈 618 36.3.1 需要协议栈的原因 619 36.3.2 各网络层的功能 619 36.4 以太网外设 620 36.4.1 SMI接口 621 36.4.2 MII和RMII接口 623 36.4.3 MAC数据包发送和接收 624 36.4.4 MAC过滤 626 36.5 PHY:LAN8720A 626 36.6 LwIP:轻型TCP/IP协议栈 629 36.7 ETH初始化结构体详解 629 36.8 以太网通信实验:无操作系统LwIP移植 635 36.8.1 硬件设计 635 36.8.2 移植步骤 635 36.8.3 下载验证 661 36.9 基于μCOS-III移植LwIP实验 663 第37章 CAN——通信实验 680 37.1 CAN协议简介 680 37.1.1 CAN物理层 680 37.1.2 协议层 684 37.2 STM32的CAN外设简介 690 37.3 CAN初始化结构体 698 37.4 CAN发送及接收结构体 700 37.5 CAN筛选器结构体 701 37.6 CAN——双机通信实验 703 37.6.1 硬件设计 703 37.6.2 软件设计 704 37.6.3 下载验证 713 第38章 RS-485通信实验 714 38.1 RS-485通信协议简介 714 38.2 RS-485——双机通信实验 715 38.2.1 硬件设计 715 38.2.2 软件设计 716 38.2.3 下载验证 723 第39章 电源管理——实现低功耗 724 39.1 STM32的电源管理简介 724 39.1.1 电源监控器 724 39.1.2 STM32的电源系统 726 39.1.3 STM32的功耗模式 727 39.2 电源管理相关的库函数及命令 729 39.2.1 配置PVD监控功能 729 39.2.2 WFI与WFE命令 729 39.2.3 进入停止模式 730 39.2.4 进入待机模式 731 39.3 PWR——睡眠模式实验 732 39.3.1 硬件设计 732 39.3.2 软件设计 732 39.3.3 下载验证 735 39.4 PWR——停止模式实验 735 39.4.1 硬件设计 735 39.4.2 软件设计 735 39.4.3 下载验证 739 39.5 PWR——待机模式实验 739 39.5.1 硬件设计 740 39.5.2 软件设计 740 39.5.3 下载验证 743 39.6 PWR——PVD电源监控实验 743 39.6.1 硬件设计 743 39.6.2 软件设计 745 39.6.3 下载验证 747 第40章 RTC——实时时钟 748 40.1 RTC简介 748 40.2 RTC功能框图解析 748 40.3 RTC初始化结构体讲解 751 40.4 RTC时间结构体讲解 752 40.5 RTC日期结构体讲解 753 40.6 RTC闹钟结构体讲解 753 40.7 RTC—日历实验 754 40.7.1 硬件设计 754 40.7.2 软件设计 754 40.7.3 下载验证 760 40.8 RTC—闹钟实验 760 40.8.1 硬件设计 760 40.8.2 软件设计 760 40.8.3 下载验证 765 第41章 DCMI——OV5640摄像头 766 41.1 摄像头简介 766 41.1.1 数字摄像头与模拟摄像头的区别 766 41.1.2 CCD与CMOS的区别 767 41.2 OV5640摄像头 767 41.2.1 OV5640传感器简介 769 41.2.2 OV5640引脚及功能框图 769 41.2.3 SCCB时序 771 41.2.4 OV5640的寄存器 772 41.2.5 像素数据输出时序 773 41.3 STM32的DCMI接口简介 773 41.3.1 DCMI整体框图 774 41.3.2 DCMI接口内部结构 775 41.3.3 同步方式 775 41.3.4 捕获模式及捕获率 776 41.4 DCMI初始化结构体 776 41.5 DCMI——OV5640摄像头实验 777 41.5.1 硬件设计 777 41.5.2 软件设计 779 41.5.3 下载验证 797 第42章 MDK的编译过程及文件类型全解 798 42.1 编译过程 798 42.1.1 编译过程简介 798 42.1.2 具体工程中的编译过程 799 42.2 程序的组成、存储与运行 800 42.2.1 CODE、RO、RW、ZI Data域及堆栈空间 800 42.2.2 程序的存储与运行 801 42.3 编译工具链 802 42.3.1 设置环境变量 803 42.3.2 armcc、armasm及armlink 804 42.3.3 armar、fromelf及用户指令 807 42.4 MDK工程的文件类型 808 42.4.1 uvprojx、uvoptx、uvguix及ini工程文件 809 42.4.2 源文件 811 42.4.3 Output下生成的文件 811 42.4.4 Listing下的文件 831 42.4.5 sct分散加载文件的格式与应用 837 42.5 实验:自动分配变量到外部SDRAM空间 846 42.5.1 硬件设计 846 42.5.2 软件设计 847 42.5.3 下载验证 853 42.6 实验:优先使用内部SRAM并把堆区分配到SDRAM空间 853 42.6.1 硬件设计 854 42.6.2 软件设计 854 42.6.3 下载验证 864 第43章 在SRAM中调试代码 865 43.1 在RAM中调试代码 865 43.2 STM32的启动方式 865 43.3 内部Flash的启动过程 867 43.4 实验:在内部SRAM中调试代码 869 43.4.1 硬件设计 869 43.4.2 软件设计 870 43.4.3 下载验证 877 第44章 读写内部Flash 878 44.1 STM32的内部Flash简介 878 44.2 对内部Flash的写入过程 881 44.3 查看工程的空间分布 882 44.4 操作内部Flash的库函数 884 44.5 实验:读写内部Flash 887 44.5.1 硬件设计 887 44.5.2 软件设计 887 44.5.3 下载验证 893 第45章 设置Flash的读写保护及解除 894 45.1 选项字节与读写保护 894 45.1.1 选项字节的内容 894 45.1.2 RDP读保护级别 896 45.1.3 PCROP代码读出保护 898 45.2 修改选项字节的过程 898 45.3 操作选项字节的库函数 899 45.4 实验:设置读写保护及解除 901 45.4.1 硬件设计 902 45.4.2 软件设计 902 45.4.3 下载验证 908 |