这书采用的STM32集成ic根据ARM Cortex-M3系统架构,依据根据MCU的嵌入式技术具体运用要求,有效地挑选了多种多样常见的关键外接设备插口,如USART、SPI、I2C、FSCM、SDIO系统总线、以太网接口等,融合丰富多彩的案例及工程项目源码,循序渐进、系统软件全方位地详细介绍嵌入式系统的最底层原理。再此全过程中,根据交叉好几个综合性实例的解读,如命令行机壳程序流程Shell、eFat系统文件、Telnet远程操作、?C/OS-III实时操作系统的移殖全过程,不论是内嵌式的新手,還是有必须开发设计工作经验的技术工程师都能从这当中获利,使用户即能系统软件全方位地把握嵌入式开发需要的硬件软件专业知识,又能锻练她们的综合性开发设计工作能力,为未来从业嵌入式开发层面的工作中确立牢靠的基本。
目录
- 第1章 开发利器:STM32库和MDK Keil 1
- 1.1 学习启航:闪烁的跑马灯 1
- 1.1.1 实验结果呈现 1
- 1.1.2 实验分析 2
- 1.1.3 配置GPIO引脚 5
- 1.1.4 实验控制逻辑 6
- 1.2 STM32库结构和CMSIS标准 8
- 1.2.1 STM32库层次结构 9
- 1.2.2 CMSIS层次结构 9
- 1.2.3 STM32库结构中的文件关系 10
- 1.2.4 STM32库函数命名规则 13
- 1.2.5 STM32库常见的几个状态类型 13
- 1.3 工程开发环境设置 14
- 1.3.1 有关MDK 14
- 1.3.2 使用MDK建立工程的步骤 15
- 第2章 STM32体系结构 25
- 2.1 总线与通信接口 25
- 2.1.1 总线组成 25
- 2.1.2 重要的总线术语 26
- 2.2 STM32功能框架 27
- 2.2.1 系统组成 27
- 2.2.2 总线单元及挂接设备 28
- 2.3 STM32存储器映射 29
- 2.3.1 独立编址 30
- 2.3.2 统一编址(存储器映像编址) 31
- 2.3.3 CM3外设地址空间映射 32
- 2.3.4 地址空间映射详解 34
- 2.4 STM32时钟结构 39
- 2.4.1 STM32F103ZET6的时钟树 39
- 2.4.2 时钟树二级框架 40
- 2.4.3 时钟启用过程 41
- 2.5 系统时钟树与地址空间映射的关系 43
- 第3章 STM32系统启动过程分析 44
- 3.1 CM3的复位序列 44
- 3.1.1 堆栈 45
- 3.1.2 向量表 47
- 3.2 STM32启动代码分析 49
- 3.3 STM32系统时钟初始化 52
- 3.3.1 时钟源的选择 52
- 3.3.2 系统时钟设置 56
- 3.4 程序运行环境初始化函数__main() 60
- 3.4.1 回顾编译和链接过程 60
- 3.4.2 映像文件的组成 61
- 3.4.3 映像的加载过程 63
- 3.4.4 由MDK集成环境自动生成的分散加载文件 65
- 3.4.5 _main()函数的作用 66
- 第4章 通用GPIO操作 68
- 4.1 实验结果预览:LED跑马灯 68
- 4.2 GPIO基本知识 68
- 4.2.1 GPIO分组管理及其引脚 69
- 4.2.2 GPIO工作模式及其配置 69
- 4.2.3 GPIO引脚的写入和读出 71
- 4.3 实验代码解析 74
- 4.3.1 实验现象原理分析 74
- 4.3.2 源代码分析 78
- 4.4 创建工程 81
- 4.4.1 建立工程目录结构 81
- 4.4.2 导入源代码文件 81
- 4.4.3 编译执行 82
- 4.5 编译调试 82
- 4.5.1 调试方法 82
- 4.5.2 栈和变量观察窗口 83
- 4.5.3 运行程序并调试:一个函数一个断点 84
- 4.5.4 运行程序并调试:多个函数多个断点 86
- 第5章 外部中断EXTI操作 90
- 5.1 实验结果预览:LED跑马灯_中断控制 90
- 5.2 异常与中断 91
- 5.2.1 Cortex-M3的异常向量 91
- 5.2.2 异常向量表 92
- 5.3 NVIC与中断控制 93
- 5.3.1 NVIC简述 93
- 5.3.2 NVIC与外部中断 93
- 5.3.3 NVIC中断的优先级 94
- 5.3.4 NVIC初始化 95
- 5.4 EXTI基本知识 97
- 5.4.1 EXTI简介 97
- 5.4.2 EXTI控制器组成结构 97
- 5.4.3 GPIO引脚到EXTI_Line的映射 100
- 5.4.4 EXTI_Line到NVIC的映射 102
- 5.5 实验代码解析 103
- 5.5.1 工程源码的逻辑结构 103
- 5.5.2 实验代码软硬件原理 104
- 5.5.3 实验代码分析 107
- 5.6 创建工程 109
- 5.6.1 建立工程目录结构 109
- 5.6.2 导入源代码文件 109
- 5.6.3 编译执行 110
- 5.7 编译调试 111
- 5.7.1 打开内存窗口 111
- 5.7.2 设置断点 111
- 5.7.3 运行程序并调试 112
- 第6章 USART接口 115
- 6.1 实验结果预览 115
- 6.1.1 实验准备工作 115
- 6.1.2 实验现象描述 116
- 6.2 USART基本知识 117
- 6.2.1 串行异步通信协议 117
- 6.2.2 USART与接口标准RS-232 118
- 6.3 STM32 USART结构 119
- 6.3.1 USART工作模式 119
- 6.3.2 精简的USART结构 119
- 6.3.3 USART单字节收发过程 120
- 6.4 USART寄存器位功能定义 121
- 6.4.1 状态寄存器(USART_SR) 121
- 6.4.2 数据寄存器(USART_DR) 122
- 6.4.3 控制寄存器1(USART_CR1) 122
- 6.4.4 控制寄存器2(USART_CR2) 123
- 6.4.5 控制寄存器3(USART_CR3) 123
- 6.4.6 分数波特率寄存器USART_BRR 124
- 6.4.7 USART模块寄存器组 125
- 6.4.8 USART模块初始化函数 126
- 6.4.9 USART常用函数功能说明 127
- 6.5 USART实验代码分析 128
- 6.5.1 实验电路(硬件连接关系) 128
- 6.5.2 工程源代码文件层次结构 130
- 6.5.3 应用层(主程序控制逻辑) 131
- 6.5.4 用户驱动层 133
- 6.5.5 函数printf()重定向 135
- 6.6 创建工程 135
- 6.6.1 建立工程目录结构 135
- 6.6.2 创建文件组和导入源文件 136
- 6.6.3 编译执行 137
- 第7章 USART综合应用:命令行外壳程序Shell 138
- 7.1 实验结果预览 138
- 7.2 基于USART的I/O函数 139
- 7.2.1 字符及字符串获取函数:xgetc()和xgets() 139
- 7.2.2 字符及字符串打印函数:xputc()和xputs() 141
- 7.3 可变参数输出函数xprintf() 142
- 7.3.1 可变参数 142
- 7.3.2 可变参数宏的使用与作用 143
- 7.3.3 用可变参数宏实现自己的格式化输出函数xprintf() 144
- 7.4 Shell外壳 145
- 7.4.1 Shell命令管理结构 146
- 7.4.2 Shell命令解析过程 147
- 7.4.3 命令函数之参数解析 150
- 7.5 建立工程,编译和运行 151
- 7.5.1 创建和配置工程 151
- 7.5.2 编译执行 153
- 第8章 I2C接口 154
- 8.1 实验结果预览:轮询写入/读出EEPROM数据 154
- 8.2 I2C总线协议 155
- 8.2.1 总线特点 155
- 8.2.2 I2C应用结构 155
- 8.2.3 总线信号时序分析 156
- 8.3 STM32 I2C模块 158
- 8.3.1 I2C组成框图 158
- 8.3.2 I2C主模式工作流程 159
- 8.3.3 I2C中断及DMA请求 161
- 8.4 I2C EEPROM读写示例及分析 162
- 8.4.1 示例电路连接 162
- 8.4.2 app.c文件中的main()函数 163
- 8.4.3 eeprom.h文件 166
- 8.4.4 eeprom.c文件 167
- 8.4.5 shell.c文件 174
- 8.5 建立工程,编译及运行 175
- 8.5.1 创建和配置工程 175
- 8.5.2 编译执行 176
- 第9章 DMA接口 177
- 9.1 实验结果预览 177
- 9.2 通用DMA的作用及特征 178
- 9.3 STM32 DMA基本知识 178
- 9.3.1 DMA与系统其他模块关系图 178
- 9.3.2 STM32 DMA组成 179
- 9.4 实验示例分析 183
- 9.4.1 main.c文件中的main()函数 184
- 9.4.2 USART1的初始化 184
- 9.4.3 DMA通道中断处理函数 189
- 9.4.4 sysTick中断处理函数 190
- 9.4.5 DMA通道配置的其他寄存器 191
- 9.4.6 DMA用户测试命令及其执行函数 192
- 9.5 建立工程,编译和执行 193
- 9.5.1 建立以下工程文件夹 194
- 9.5.2 创建文件组和导入源文件 194
- 9.5.3 编译运行 194
- 第10章 实时时钟RTC 195
- 10.1 实验结果预览 195
- 10.2 STM32 RTC模块 196
- 10.2.1 STM32后备供电区域 196
- 10.2.2 RTC组成 199
- 10.3 RTC实验设计与源码分析 204
- 10.3.1 硬件连接和GPIO资源 204
- 10.3.2 实验源代码逻辑结构 204
- 10.3.3 源代码分析 205
- 10.4 建立工程,编译和执行 212
- 10.4.1 建立以下工程文件夹 212
- 10.4.2 创建文件组和导入源文件 212
- 10.4.3 编译执行 213
- 第11章 系统定时器SysTick 214
- 11.1 SysTick简述 214
- 11.2 SysTick工作过程 214
- 11.3 SysTick寄存器位功能定义 215
- 11.3.1 控制和状态寄存器:STK_CTRL 215
- 11.3.2 重载寄存器:STK_LOAD 216
- 11.3.3 当前计数值寄存器:STK_VAL 217
- 11.3.4 校正寄存器:STK_CALIB 217
- 11.3.5 SysTick模块寄存器组 217
- 11.3.6 配置SysTick定时器 218
- 11.4 基于SysTick的延时函数代码分析 220
- 11.4.1 实现原理 220
- 11.4.2 实现代码分析 220
- 11.4.3 基于SysTick延时的LED闪烁命令 223
- 11.5 建立工程,编译和执行 224
- 11.5.1 建立以下工程文件夹 224
- 11.5.2 创建文件组和导入源文件 224
- 11.5.3 编译运行 226
- 第12章 SPI接口 227
- 12.1 实验现象预览:轮询写入/读出SPI Flash数据 227
- 12.2 SPI总线协议 228
- 12.2.1 总线信号及其应用结构 228
- 12.2.2 SPI内部结构与工作原理 229
- 12.3 STM32 SPI模块 231
- 12.3.1 SPI组成框图 231
- 12.3.2 STM32 SPI主模式数据收发过程 232
- 12.3.3 SPI中断及DMA请求 234
- 12.4 W25Q128FV规格说明 234
- 12.4.1 W25Q128FV状态和控制管理 235
- 12.4.2 W25Q128FV常用指令 236
- 12.5 程序入口与SPI初始化代码 237
- 12.5.1 实验硬件资源 237
- 12.5.2 工程入口文件main.c 238
- 12.5.3 spiflash.c文件中的spiFlash_Init()函数 239
- 12.6 SPI Flash测试代码分析 243
- 12.6.1 spiflash.c文件中的SPI Flash测试函数spiTest() 244
- 12.6.2 SPI Flash ID读取函数sFLASH_readID() 245
- 12.6.3 扇区擦除函数sFLASH_eraseSector() 246
- 12.6.4 Flash页写函数sFLASH_writePage() 246
- 12.6.5 Flash读函数sFLASH_readBuffer() 247
- 12.6.6 Flash字节发送函数sFLASH_SendByte() 248
- 12.7 向Shell添加SPI测试指令spitest 249
- 12.8 建立工程,编译和执行 250
- 12.8.1 建立以下工程文件夹 250
- 12.8.2 创建文件组和导入源文件 250
- 12.8.3 编译运行 252
- 第13章 网络接口:以太网 253
- 13.1 网络体系结构简介 253
- 13.1.1 三种网络模型 253
- 13.1.2 以太网标准(Ethernet) 256
- 13.2 ENC28J60知识 257
- 13.2.1 ENC28J60概述 257
- 13.2.2 控制寄存器 259
- 13.2.3 以太网缓冲器 260
- 13.2.4 PHY寄存器 261
- 13.2.5 ENC28J60 SPI指令集 261
- 13.2.6 ENC28J60初始化 263
- 13.2.7 使用ENC28J60收发数据 268
- 13.2.8 ENC28J60驱动代码总结 272
- 13.3 uIP协议栈简介 274
- 13.3.1 uIP特性 274
- 13.3.2 uIP应用接口 275
- 13.3.3 uIP的初始化及配置函数 277
- 13.3.4 uIP的主程序循环 277
- 13.4 uIP移植分析 279
- 13.4.1 下载uIP1.0版源码文件 279