跟工程师学嵌入式开发 ――基于STM32和μC/OS-III

跟工程师学嵌入式开发 ――基于STM32和μC/OS-III pdf epub mobi txt 电子书 下载 2025

谭贵 著
图书标签:
  • 嵌入式开发
  • STM32
  • μC/OS-III
  • 实时操作系统
  • 嵌入式系统
  • 单片机
  • C语言
  • 工程实践
  • 硬件开发
  • 嵌入式编程
想要找书就要到 新城书站
立刻按 ctrl+D收藏本页
你会得到大惊喜!!
出版社: 电子工业出版社
ISBN:9787121327254
版次:1
商品编码:12208699
包装:平装
丛书名: 嵌入式技术与应用丛书
开本:16开
出版时间:2017-10-01
用纸:胶版纸
页数:448
字数:716000
正文语种:中文

具体描述

内容简介

本书选用的STM32芯片基于ARM Cortex-M3体系结构,根据基于MCU的嵌入式技术实际应用需求,合理地选择了多种常用的重要外设接口,如USART、SPI、I2C、FSCM、SDIO总线、以太网等,结合丰富的实例及工程源代码,由浅入深、系统全面地介绍嵌入式系统的底层工作原理。在此过程中,通过穿插多个综合示例的讲解,如命令行外壳程序Shell、eFat文件系统、Telnet远程控制、?C/OS-III实时操作系统的移植过程,无论是嵌入式的初学者,还是有一定开发经验的工程师都能从中获益,使读者既能系统全面地掌握嵌入式开发所需的软硬件知识,又能锻炼他们的综合开发能力,为将来从事嵌入式开发方面的工作奠定坚实的基础。

作者简介

谭贵,男,北京大学计算机科学与技术学士毕业,现供职于富士康科技集团,热爱嵌入式开发技术,精通C、Java语言,Tcl和bash脚本应用;熟悉从MCU裸板外设驱动开发和uCosII实时操作系统的移植,以及基于Linux系统的嵌入式应用开发。

目录

第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
13.4.2 理解两个中间层文件与应用层和协议层之间的关系 280
13.4.3 添加uIP协议栈后的工程文件组 285
第14章 综合示例:基于uIP的Telnet服务 286
14.1 实验现象预览 286
14.2 Telnet远程登录协议 287
14.2.1 Telnet概述 287
14.2.2 Telnet协议主要技术 288
14.2.3 Telnet命令 288
14.3 Telnetd服务框架及实现 290
14.3.1 本实验Telnetd服务框架 290
14.3.2 Telnetd服务框架的实现 291
14.4 上层应用与uIP协议的接口:telnetd_appcall() 304
14.5 建立工程,编译和运行 309
14.5.1 创建和配置工程 309
14.5.2 编译执行 311
第15章 SDIO总线协议与SD卡操作 312
15.1 SD卡简介 312
15.1.1 SD卡家族 312
15.1.2 SD卡引脚功能定义 313
15.1.3 SD卡内部组成 314
15.1.4 SD卡容量规格 315
15.1.5 SDIO接口规范和总线应用拓扑 315
15.2 SD协议 316
15.2.1 工作模式与状态 316
15.2.2 命令和响应格式 316
15.2.3 卡识别模式 317
15.2.4 数据传输模式 320
15.3 STM32 SDIO控制器 322
15.3.1 控制器总体结构描述 322
15.3.2 SDIO适配器模块 323
15.3.3 SDIO AHB接口 325
15.4 工程入口及配置 326
15.4.1 实验硬件资源 326
15.4.2 工程入口文件main.c 327
15.5 SDIO初始化 328
15.5.1 SD卡上电初始化函数SD_PowerON() 330
15.5.2 SD卡规格信息获取函数SD_InitializeCards() 336
15.6 SDIO卡测试代码分析 339
15.6.1 块擦除 340
15.6.2 多块写 342
15.6.3 多块读 345
15.7 建立工程,编译和运行 348
15.7.1 建立以下工程文件夹 348
15.7.2 创建文件组和导入源文件 348
15.7.3 编译执行 349
第16章 移植文件系统FatFs 350
16.1 实验现象预览:基于Shell的文件系统命令 350
16.2 FatFs文件系统 351
16.2.1 FatFs特点 351
16.2.2 FatFs在设备系统中的层次与接口 351
16.3 移植FatFs文件系统 352
16.3.1 FatFs源代码结构 352
16.3.2 基于FatFs应用的常用数据类型说明 353
16.3.3 FatFs的移植 355
16.4 FatFs文件系统应用示例分析 357
16.4.1 工程源代码逻辑 357
16.4.2 工程源代码分析 358
16.5 建立工程,编译和运行 363
16.5.1 创建和配置工程 363
16.5.2 编译执行 364
第17章 无线接入:Wi-Fi模块ESP8266应用 365
17.1 无线技术标准:IEEE 802.11 365
17.1.1 IEEE 802.11简介 365
17.1.2 无线局域网的组网拓扑 366
17.1.3 无线接入过程的三个阶段 367
17.2 ESP-WROOM-02模组 368
17.2.1 ESP-WROOM-02性能参数 368
17.2.2 ESP-WROOM-02与主机系统的电路连接 369
17.3 ESP-WROOM-02指令集 370
17.3.1 ESP8266 AT常用指令 370
17.3.2 使用ESP-WROOM-02进行真实通信 373
17.4 封装ESP-WROOM-02的配置函数 375
17.4.1 ESP-WROOM-02的初始化函数 375
17.4.2 ESP-WROOM-02的配置函数 377
17.4.3 优化USART接收缓存的数据结构 379
17.4.4 ESP-WROOM-02的Shell操作命令 381
17.5 建立工程,编译和运行 384
17.5.1 工程程序文件 384
17.5.2 创建和配置工程 384
17.5.3 编译执行 385
第18章 移植?C/OS-III操作系统 387
18.1 ?C/OS-III基础 387
18.1.1 ?C/OS-III简介 387
18.1.2 ?C/OS-III内核组成架构 388
18.2 ?C/OS-III任务基础 390
18.2.1 任务状态 390
18.2.2 任务控制块和就绪任务表 391
18.2.3 创建任务 391
18.2.4 任务同步与通信 393
18.3 ?C/OS-III的信号量 393
18.3.1 信号量分类及其应用 393
18.3.2 信号量工作方式 394
18.3.3 信号量应用操作步骤 396
18.4 ?C/OS-III的消息队列 396
18.4.1 消息队列工作模型 397
18.4.2 消息队列应用操作步骤 397
18.5 ?C/OS-III的事件标志组 398
18.5.1 事件标志组工作模型 398
18.5.2 事件标志组应用操作步骤 399
18.6 信号量、消息队列和事件标志组综合示例 399
18.6.1 综合示例任务关系图 400
18.6.2 任务代码头文件task.h 400
18.6.3 任务代码C文件task.c 402
18.6.4 中断异常处理文件stm32f10x_it.c 409
18.7 ?C/OS-III移植 410
18.7.1 ?C/OS-III源码组织架构 410
18.7.2 简化?C/OS-III源码组织架构 411
18.7.3 建立基于?C/OS-III的工程 412
18.7.4 ?C/OS-III综合示例运行效果 414
第19章 基于?C/OS-III的信息系统 415
19.1 系统功能描述 415
19.1.1 系统任务划分 415
19.1.2 系统实际运行效果 415
19.2 系统任务设计分析 417
19.2.1 Shell任务 417
19.2.2 LED灯闪烁任务 420
19.2.3 事件监测任务 420
19.2.4 系统统计任务 422
19.2.5 无线通信处理任务 425
19.3 工程源代码(文件)整合 428
19.3.1 主文件main.c 428
19.3.2 任务头文件task.h 428
19.3.3 includes.h文件 429
19.3.4 任务实现文件task.c 430
19.4 建立工程,编译和运行 430
19.4.1 建立工程源代码结构 430
19.4.2 建立文件组,导入源文件 430
19.4.3 编译执行 431
参考文献 432

前言/序言

进入21世纪以来,随着微电子技术、计算机技术及网络通信等技术的深入发展,整个社会信息化的程度越来越高,不用说智能手机,各种信息设备,如应用于医疗健康领域的智能心电仪、智能血糖仪,工业生产领域的自动测试装置、机器人手臂,安防领域的指纹识别、人脸识别技术,智能家居里的智能空调、冰箱、电表,甚至军事领域中的精确制导武器、红外热成像眼镜、自动跟踪……都无一例外地具有“智慧”的大脑,它们的应用已深入我们生活的每个角落,改变着我们的生活方式。

在上面所提及的应用中,其“智慧”的大脑,实质就是一套套嵌入式系统,它们由不同的硬件和软件组成。这里所说的“不同”,一是指构成嵌入式系统的硬件核心,可能是由基于不同厂商的SoC芯片所拓展设计的实用电路,如ST公司的STM8、STM32系列SoC、NXP公司的LPC系列SoC;二是指嵌入式系统的软件构成,除去SoC片上外设的必要驱动外,还有管理这些驱动和应用的操作系统,如Embedded Linux、μC/OS-III和文件管理系统(如FatFs)等。

目前,嵌入式应用处理器多采用ARM体系结构。ARM公司为了细分市场,将其芯片按应用领域分为Cortex-A、Cortex-R、Cortex-M三个系列。Cortex-A系列芯片带有MMU(内存管理单元)、MPU(内存保护单元)部件,主要针对复杂的嵌入式应用,如智能手机、平板电脑及高档成像设备等;Cortex-R系列面向实时应用领域,如精密机器控制、炉温监控;Cortex-M系列则面向传统的单片机市场,其子系列M0~M4涵盖了从8位到32位单片机的所有应用,与传统的C51系列单片机相比,功能更强大。因此,学习嵌入式开发技术,应本着“循序渐近,由简单到复杂”的原则,首先学习基于Cortex-M系列的单片机是最好的入门选择,在此基础上,进阶学习Cortex-A系列就显得“自然而游刃有余”。

本书就以基于CM3内核架构(Cortex-M3)的芯片STM32F103ZET6(意法半导体公司ST,基于MCU应用的32位芯片系列,简称STM32)为讲解线索,合理选择实际应用中广泛使用的USART、I2C、SPI、SDIO、以太网等接口,结合ST公司提供的库函数,通过一个个具有实际使用价值的案例代码,详细介绍每种接口的工作原理、驱动配置和综合应用。在学习本书之前,如果读者对CM3体系结构有一定的了解,当然最好;如果没有此类的背景知识,也不用担心会影响对本书的学习。笔者在讲解过程中,会在涉及需要CM3体系结构知识的地方,自然而然地引入相应知识点的介绍。

本书对章节、知识点的安排有以下三个显著特点,以便读者快速、高效地掌握基于“STM32+μC/OS-III结构”的嵌入式开发。

在章节的安排上,遵循“先总体,后细节”的原则。第1章以一个跑马灯实验作为引子,为读者介绍了嵌入式开发所涉及的基本概念和流程,如GPIO配置、事件的轮询和中断处理机制等,以及基于STM32库开发所涉及的库文件组织和CMSIS标准、开发工具。建立了嵌入式开发的基本过程等轮廓性认识之后,第2章自然地切入STM32系列芯片的框架结构,包括总线、外设地址空间映射和时钟树。只有清楚了这三者之间的关系,才有可能对后面章节所讲解的外设工作过程和相关操作有深刻的理解。在此基础上,第3章开启了嵌入式系统的启动之旅,透彻地分析了基于CM3核的芯片系统之启动过程。有了前面三章的基础,随后的章节则以“先简单,后复杂”的原则逐一介绍GPIO、外部中断线、USART、DMA、I2C、SDIO等外设的结构原理及相应的驱动代码。

其次,对每一种外设的讲解,除了遵循“先总体,后细节”的原则之外,采用“以实验现象为驱动(每章的第一节首先呈现给读者一个最终的实验结果画面)”的思路,一步步进入外设的内部世界。这样的安排有利于激起读者对未知世界的强烈兴趣,随着对外设“先总后细”的逐层深入,最终使读者彻底理解并掌握每种外设“实验现象”背后的逻辑。

最后,本书除了讲解每种外设的工作原理和驱动代码之外,还穿插了三个有实用价值的综合案例,以拓展读者对外设应用的认识和理解,以及必要的知识面。第一个综合实例是基于USART接口的Shell(俗称“外壳”,类似于Linux的bash)程序,通过它可以将“对外设的操作”封装为一个个Shell命令,以随时执行。因此,Shell程序贯穿本书的始末。第二个综合实例是Telnet远程登录服务程序,该程序底层硬件是基于SPI总线的以太网芯片ENC2860,上层使用uIP协议栈来完成常用的TCP/IP功能,如ping、ICMP、IP、TCP等。“麻雀虽小,五脏俱全”,通过实现这样的服务程序,不但可以使读者理解和掌握Telnet协议的工作原理及过程,而且有利于进一步学习理解TCP/IP协议栈代码实现。最后一个综合示例实现了使用μC/OS-III操作系统来管理前面所讲解的硬件,充分利用操作系统的任务通信、消息传递等机制来提升硬件系统的运行效能。μC/OS-III系统结构紧凑,代码量小,容易理解掌握,通过移植和应用μC/OS-III,使读者在掌握系统应用场景的同时,加深理解操作系统内部的工作机理,为后续进一步学习基于Linux的嵌入式开发打下基础。

由于社会信息化日趋明显,必定导致包括STM32在内的MCU的应用越来越多。希望本书能为渴望进入嵌入式开发领域的人员提供一个好的入门指引,为后续深入嵌入式开发的高级应用奠定基础。作为学习教材,本书每一章的实验代码都由笔者在Keil MDK开发环境中调试通过,读者可以放心学习使用。同时,由于笔者水平有限,书中难免会存在对相关知识点理解不够准确之处,敬请读者批评指正。

参与编写本书的人员还有我的同事易确,他负责本书所有的实验电路设计;熊立宇,负责完成最后三章的初稿编写及全书的校验工作。十分感谢他们的辛勤付出!

在本书的编写过程中,得到了电子工业出版社的田宏峰老师的悉心支持,在此表示衷心感谢,同时感谢他为我提供了一个这样施展自己特长机会;十分感谢我的同事彭丽兰,是她在我工作忙碌的时候,分担了我的工作,使我能够安心写作;最后想表达对我的家人,特别是朋友熊姬珠的谢意,是她们给予我精神上的鼓励,才使我得以完成这“马拉松”式的写作。

谭 贵

2017年8月于深圳



《嵌入式系统设计与实践:基于ARM Cortex-M和实时操作系统》 内容简介 本书深入探讨了嵌入式系统设计的核心理念与实践技术,以现代嵌入式开发中最具代表性的ARM Cortex-M微控制器系列和μC/OS-III实时操作系统为平台,为读者提供了一套系统、全面且实用的学习路径。从基础的硬件原理到复杂的软件架构,从底层的驱动开发到上层的应用实现,本书力求在理论深度与工程实践之间取得最佳平衡,旨在培养具备扎实基础和良好工程素养的嵌入式系统工程师。 第一部分:嵌入式系统基础与ARM Cortex-M架构精解 本部分将带领读者构建坚实的嵌入式系统理论基础。我们将从嵌入式系统的定义、特点、应用领域入手,阐述其在现代科技发展中的重要地位。随后,重点剖析ARM Cortex-M微控制器架构的精髓。这包括: Cortex-M内核工作原理:详细讲解ARMv7-M(或v6-M,根据具体系列微控制器选择)架构下的指令集、流水线、中断机制(NVIC)、内存管理单元(MPU)等核心概念。我们会深入分析不同Cortex-M系列(如M0, M3, M4, M7)在性能、功耗和外设集成方面的差异,帮助读者理解如何根据项目需求选择合适的微控制器。 微控制器核心外设:系统地介绍微控制器中最常用的外设模块,例如: GPIO(通用输入输出):讲解其配置、操作模式(推挽输出、开漏输出、上拉/下拉输入等),以及如何通过GPIO实现简单的输入检测和输出控制。 时钟系统:深入理解系统时钟的配置,包括HSE、HSI、PLL等,以及如何通过时钟配置影响系统性能和功耗。 中断系统:详细讲解中断的产生、优先级、嵌套、中断向量表以及中断服务程序的编写,这是实现实时响应的关键。 定时器/计数器:介绍不同类型的定时器(如SysTick, General-purpose timers, Advanced-control timers),它们在产生周期性事件、测量时间、PWM输出等方面的应用。 ADC(模数转换器):讲解ADC的采样原理、转换模式(单次转换、连续转换、DMA模式)、参考电压、分辨率等,以及如何采集模拟信号。 DAC(数模转换器):介绍DAC的工作原理和应用,如产生模拟电压输出。 通信接口:详细讲解常用的串行通信接口,包括UART(通用异步收发器)用于设备间的数据交换,SPI(串行外设接口)和I2C(集成电路总线)用于连接各种外围设备。我们会分析它们的通信协议、时序和编程要点。 DMA(直接内存访问):讲解DMA的原理,如何实现CPU无需参与数据传输,提高系统效率,特别是在数据量大的场景下。 开发工具链与环境搭建:指导读者如何选择和配置嵌入式开发环境,包括交叉编译工具链(如GCC for ARM)、集成开发环境(IDE,如Keil MDK, IAR Embedded Workbench, STM32CubeIDE),以及调试工具(如ST-Link, J-Link)的使用。我们将演示如何创建、编译、下载和调试一个简单的“Hello World”工程。 第二部分:μC/OS-III实时操作系统核心机制与应用 实时操作系统(RTOS)是构建复杂嵌入式系统的基石。本部分将深入剖析μC/OS-III这款经典且功能强大的RTOS,帮助读者掌握其核心概念和编程范式。 RTOS基本概念:介绍实时系统的定义、实时性要求(硬实时、软实时),以及RTOS在多任务管理、资源共享、时间约束等方面的作用。 μC/OS-III任务管理: 任务的创建与删除:讲解如何定义任务堆栈、任务控制块(TCB),以及如何使用`OSTaskCreateExt()`等API创建和管理任务。 任务状态与调度:详细阐述任务的五种状态(就绪、运行、阻塞、挂起、休眠)以及μC/OS-III的优先级调度算法(可抢占式)。我们将深入分析调度器的运行机制,理解任务切换的过程。 时间管理:介绍系统滴答(SysTick)的重要性,以及如何使用`OSTimeDly()`、`OSTimeDlyHMSM()`等API实现延时和任务定时。 μC/OS-III任务间通信与同步:这是实现模块化设计和可靠协作的关键。 信号量(Semaphores):讲解信号量的类型(二进制信号量、计数信号量),以及它们在资源互斥访问、事件通知等场景下的应用。API如`OSSemCreate()`、`OSSemPend()`、`OSSemPost()`。 互斥锁(Mutexes):介绍互斥锁与二进制信号量的区别,重点讲解其优先级继承机制,用于解决优先级反转问题。API如`OSMutexCreate()`、`OSMutexPend()`、`OSMutexPost()`。 事件标志组(Event Flags):讲解如何使用事件标志组实现多个任务之间的复杂同步,允许任务等待一个或多个特定事件的发生。API如`OSEventFlagCreate()`、`OSEventFlagPend()`、`OSEventFlagPost()`。 消息队列(Message Queues):介绍消息队列作为任务间传递数据的重要机制,支持先进先出(FIFO)或先进后出(LIFO)的传递方式。API如`OSQCreate()`、`OSQPost()`、`OSQPend()`。 邮箱(Mailboxes):讲解邮箱作为一种特殊的消息传递机制,一次只能传递一个数据项,适用于传递指针或短数据。API如`OSMboxCreate()`、`OSMboxPost()`、`OSMboxPend()`。 μC/OS-III内存管理: 动态内存管理:介绍μC/OS-III提供的动态内存分配和释放机制,以及如何通过内存分区(Memory Partitions)来管理不同大小的内存块,避免内存碎片。API如`OSMemCreate()`、`OSMemGet()`、`OSMemPut()`。 μC/OS-III中断管理:讲解如何将硬件中断集成到RTOS中,以及中断服务程序(ISR)和任务之间的交互方式,包括ISR如何唤醒被阻塞的任务。 μC/OS-III错误处理与调试:提供一套系统性的错误处理策略,并指导读者如何利用RTOS提供的调试钩子和工具来定位和解决多任务并发带来的复杂问题。 第三部分:嵌入式驱动与底层开发实践 本部分将聚焦于嵌入式系统中最具挑战性也最基础的驱动程序开发。我们将以STM32系列微控制器为例,结合μC/OS-III的操作,详细讲解常用硬件外设的驱动编写。 HAL库与LL库的使用:介绍STMicroelectronics提供的标准库(HAL库和LL库)的设计理念和使用方法。我们将重点演示如何使用HAL库快速配置和操作微控制器外设,以及在需要更高性能和更细粒度控制时,如何结合LL库。 UART驱动开发:实现串口通信,用于设备调试、数据传输与接收。我们将编写能够配置波特率、数据位、停止位、校验位,并支持中断接收和发送的UART驱动。 SPI/I2C驱动开发:演示如何为SPI和I2C总线编写驱动程序,以驱动外部传感器(如温度、湿度传感器)、存储器(如EEPROM, Flash)或显示屏。 定时器与PWM驱动:开发用于精确定时、产生PWM信号(用于电机控制、LED亮度调节等)的驱动程序。 ADC/DAC驱动:编写驱动程序采集模拟量数据,或输出模拟信号,并结合RTOS的任务进行数据处理。 外部中断驱动:实现对外部按键、传感器触发信号等事件的响应,并将其集成到RTOS的任务管理中。 DMA与外设结合:深入讲解如何配置DMA控制器,使其与UART、SPI、ADC等外设协同工作,实现高效的数据传输,减轻CPU负担。 第四部分:嵌入式应用开发与系统集成 在掌握了基础硬件和RTOS后,本部分将引导读者进行更复杂的应用开发和系统集成。 传感器数据采集与处理:结合之前开发的传感器驱动,编写任务来周期性地采集传感器数据,并进行滤波、校准等预处理。 通信协议栈应用:讲解如何集成和使用常见的通信协议,例如TCP/IP协议栈(如lwIP),实现嵌入式设备联网功能;或者MQTT等物联网通信协议,实现设备与云平台的连接。 人机交互界面(HMI)开发:如果项目需要,我们将探讨如何在嵌入式设备上实现简单的图形用户界面,可能涉及LCD驱动、触摸屏驱动以及UI框架的使用。 文件系统:介绍嵌入式文件系统(如FatFs)的应用,实现数据在SD卡或其他存储介质上的持久化存储。 系统稳定性与可靠性设计:讨论如何通过代码规范、异常处理、看门狗(Watchdog)机制等手段,提高嵌入式系统的稳定性和可靠性。 功耗优化:讲解低功耗模式的配置和使用,以及在设计中如何考虑功耗优化。 项目案例分析:通过一个或多个综合性的项目案例,将前面学到的知识融会贯通,例如一个简单的物联网传感器节点、一个嵌入式数据记录仪等。这些案例将展示如何从需求分析、系统设计、模块实现到最终集成和测试的全过程。 本书特色 理论与实践并重:不仅讲解理论知识,更注重实际操作,通过丰富的代码示例和工程实践,帮助读者将所学知识转化为实际技能。 体系化、循序渐进:从基础概念到高级应用,逐步深入,构建完整的嵌入式开发知识体系。 紧跟行业前沿:以ARM Cortex-M微控制器和μC/OS-III RTOS为技术核心,覆盖当前嵌入式领域最主流的技术栈。 工程化导向:强调良好的编程习惯、代码结构和系统设计原则,培养面向工程实践的能力。 丰富的代码示例:提供大量可运行、可调试的源代码,读者可以通过实践快速掌握相关技术。 目标读者 即将步入嵌入式开发领域的在校学生。 希望系统学习嵌入式系统开发的程序员。 寻求提升嵌入式开发技能的工程师。 对嵌入式硬件和软件感兴趣的技术爱好者。 通过本书的学习,读者将能够独立完成中小型嵌入式产品的软硬件开发,为深入探索更复杂的嵌入式系统应用打下坚实的基础。

用户评价

评分

这本《跟工程师学嵌入式开发 ――基于STM32和μC/OS-III》,对于我这个初入嵌入式行业的小白来说,简直就是一场及时雨。在茫茫的资料和教程中,我曾一度迷失方向,不知道从何下手。但自从读了这本书,我才找到了真正的“北极星”。作者的写作方式非常接地气,他并没有把我们这些新手当作完全不懂的“小白”,而是设身处地地站在我们的角度,去思考我们可能遇到的困惑和难点。书中的例子非常贴近实际项目,不是那种为了讲概念而讲概念的“玩具代码”。比如,当讲解到STM32的GPIO时,作者不仅仅是告诉你如何配置IO口,还结合实际的LED闪烁、按键输入等应用场景,让我们深刻理解GPIO的实际用途。更让我惊喜的是,书中对于μC/OS-III的讲解,完全打破了我之前对RTOS“高深莫测”的刻板印象。作者用非常通俗易懂的语言,将多任务、任务间通信、中断处理等概念讲得明明白白,每一个章节都配有详细的代码示例,让我可以跟着一步步敲代码,然后看到结果,这种成就感是无与伦比的。我特别喜欢书中的“实战案例”部分,作者会将几个小功能模块串联起来,形成一个更完整的系统,让我们在实践中学习如何将零散的知识点融会贯通,如何设计一个真正可用的嵌入式系统。这本书让我觉得,嵌入式开发并没有我想象中那么难,只要找对方法,跟对人,任何人都可以成为一名优秀的嵌入式工程师。

评分

这本书,与其说是“教”我嵌入式开发,不如说是“带”我一起探索嵌入式开发的奥秘。《跟工程师学嵌入式开发 ――基于STM32和μC/OS-III》的作者,显然不是一个只会纸上谈兵的书匠,而是一位真正行走在嵌入式开发一线多年的“老炮”。他的文字间,透露着一种脚踏实地的严谨和对技术的热爱。书中对于 STM32 的解读,不是那种干巴巴的寄存器手册搬运,而是将这些寄存器和指令,转化为一个个具体的功能,一个个可执行的程序,让我们能够直观地感受到硬件的生命力。比如,在讲解 ADC 采集时,作者不仅详细介绍了采样时序和转换过程,还结合实际应用,给出了如何进行滤波和数据处理的建议,这让我在学习理论的同时,也能快速将知识转化为解决实际问题的能力。而 μC/OS-III 的部分,则是本书的另一大亮点。作者在讲解 RTOS 的过程中,始终围绕着“实用”二字,他不会去纠结那些过于抽象的概念,而是专注于如何利用 RTOS 来构建一个稳定、高效、可维护的嵌入式系统。我尤其喜欢书中关于任务间通信机制的讲解,作者通过对消息队列、事件标志组等多种通信方式的详细对比和应用场景分析,让我能够根据具体需求,选择最合适的通信方式,从而提高系统的整体性能。读完这本书,我不仅掌握了 STM32 和 μC/OS-III 的开发技能,更重要的是,我从中学到了如何像一个真正的工程师一样去思考,去解决问题。

评分

当我翻开《跟工程师学嵌入式开发 ――基于STM32和μC/OS-III》时,我的第一感受是,这本书不仅仅是一本技术书籍,更像是一位经验丰富的老前辈,在向我传递他的“独门秘籍”。作者的知识储备毋庸置疑,他对STM32的理解之深,对μC/OS-III的运用之熟练,都让我由衷钦佩。但更难得的是,他并没有将这些“秘籍”藏着掖着,而是以一种极其开放和慷慨的态度,将自己多年的开发经验和独到的见解毫无保留地分享出来。书中对于STM32的讲解,绝不仅仅停留在 datasheet 的罗列,而是深入到了 MCU 的设计哲学和工作原理。例如,在讲解DMA控制器时,作者没有仅仅告诉我们如何配置寄存器,而是深入剖析了DMA在提高系统效率方面的关键作用,并给出了若干优化 DMA 传输的技巧,这对于我理解如何更高效地利用硬件资源,起到了至关重要的作用。而μC/OS-III的部分,作者更是将实时操作系统与具体应用场景紧密结合,通过大量的实际案例,阐释了如何利用 RTOS 的强大功能,来解决复杂系统的并发控制、资源共享和实时性要求等问题。我特别喜欢书中关于任务优先级设计和死锁避免的章节,这些都是在实际项目中经常遇到的难题,而作者给出的解决方案,既有理论依据,又有实践指导,让我受益匪浅。读这本书,我感觉不仅仅是在学习技术,更是在学习一种解决问题的方法论,一种精益求精的工程精神。

评分

从一个已经接触过一些嵌入式开发,但总觉得基础不牢固的开发者角度来看,《跟工程师学嵌入式开发 ――基于STM32和μC/OS-III》这本书,绝对是为数不多的能够触及我“痛点”的佳作。作者在书中没有过多地去强调“从零开始”,而是假设读者已经具备一定的 C 语言基础和基本的硬件知识,然后直奔主题,深入探讨 STM32 平台的开发细节和 μC/OS-III 操作系统的精髓。我非常欣赏书中对 STM32 体系结构的讲解,作者并没有泛泛而谈,而是通过对 Cortex-M 内核的深入剖析,让我对 STM32 的底层工作机制有了更清晰的认识。在讲解外设驱动开发时,书中提供了大量可以直接拿来主义的示例代码,这些代码不仅清晰易懂,而且考虑了实际应用中的各种边界条件和异常情况,这对于节省我的开发时间,提高代码质量,起到了极大的帮助。而 μC/OS-III 的部分,更是让我对实时操作系统的理解上升到了一个新的台阶。作者在书中对各种 RTOS 组件的讲解,都力求深入浅出,例如,在讲解信号量和互斥锁时,作者通过形象的比喻和生动的场景模拟,让我深刻理解了它们在并发控制中的核心作用,以及如何避免常见的死锁问题。最让我感到欣慰的是,书中针对实际项目开发的建议和技巧,比如代码组织、调试方法、以及如何进行性能优化等,这些都是在学校里难以学到的宝贵经验,让我在书中得到了全面的补充。

评分

作为一名在嵌入式领域摸爬滚打多年的开发者,手中翻过的书卷不计其数,但唯有这本《跟工程师学嵌入式开发 ――基于STM32和μC/OS-III》让我眼前一亮,爱不释手。初次拿到这本书,我便被其厚重的分量和扎实的排版所吸引,这预示着里面蕴含的知识定然是言之有物,绝非泛泛而谈。翻开第一页,扑面而来的便是作者那沉稳而亲切的叙述风格,仿佛一位经验丰富的导师,循循善诱地引导着我进入嵌入式开发的奇妙世界。书中没有那些枯燥乏味的理论堆砌,而是将复杂的概念一一拆解,通过生动形象的比喻和精妙绝伦的代码示例,让原本晦涩难懂的知识变得触手可及。我尤其欣赏作者在讲解STM32的各种外设时,那种庖丁解牛般的精辟分析,对每一个寄存器的作用,每一个时钟配置的细节,都娓娓道来,让我仿佛置身于硬件的源代码之中,清晰地把握住了底层工作的脉络。而μC/OS-III的部分,更是将实时操作系统的核心思想,以一种抽丝剥茧的方式展现出来,从任务调度到信号量、互斥锁,每一个概念的引入都恰到好处,让我这个曾经对RTOS望而却步的开发者,也能轻松理解其精髓,并能动手实践,搭建属于自己的RTOS应用。这本书不单单是理论的传授,更注重实战的锤炼,作者在书中设计的每一个实验,都紧密结合实际工程需求,引导读者一步步解决问题,培养独立解决复杂嵌入式系统开发问题的能力。

相关图书

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 book.cndgn.com All Rights Reserved. 新城书站 版权所有