新書推薦:
《
形而上学与存在论之间:费希特知识学研究(守望者)(德国古典哲学研究译丛)
》
售價:NT$
504.0
《
卫宫家今天的饭9 附画集特装版(含漫画1本+画集1本+卫宫士郎购物清单2张+特制相卡1张)
》
售價:NT$
602.0
《
化妆品学原理
》
售價:NT$
254.0
《
万千教育学前·与幼儿一起解决问题:捕捉幼儿园一日生活中的教育契机
》
售價:NT$
214.0
《
爱你,是我做过最好的事
》
售價:NT$
254.0
《
史铁生:听风八百遍,才知是人间(2)
》
售價:NT$
254.0
《
量子网络的构建与应用
》
售價:NT$
500.0
《
拍电影的热知识:126部影片里的创作技巧(全彩插图版)
》
售價:NT$
500.0
|
內容簡介: |
本书选用的STM32芯片基于ARM Cortex-M3体系结构,根据基于MCU的嵌入式技术实际应用需求,合理地选择了多种常用的重要外设接口,如USART、SPI、I2C、FSCM、SDIO总线、以太网等,结合丰富的实例及工程源代码,由浅入深、系统全面地介绍嵌入式系统的底层工作原理。在此过程中,通过穿插多个综合示例的讲解,如命令行外壳程序Shell、eFat文件系统、Telnet远程控制、?COS-III实时操作系统的移植过程,无论是嵌入式的初学者,还是有一定开发经验的工程师都能从中获益,使读者既能系统全面地掌握嵌入式开发所需的软硬件知识,又能锻炼他们的综合开发能力,为将来从事嵌入式开发方面的工作奠定坚实的基础。
|
關於作者: |
谭贵,男,北京大学计算机科学与技术学士毕业,现供职于富士康科技集团,热爱嵌入式开发技术,精通C、Java语言,Tcl和bash脚本应用;熟悉从MCU裸板外设驱动开发和uCosII实时操作系统的移植,以及基于Linux系统的嵌入式应用开发。
|
目錄:
|
第1章开发利器:STM32库和MDK Keil1
1.1学习启航:闪烁的跑马灯1
1.1.1实验结果呈现1
1.1.2实验分析2
1.1.3配置GPIO引脚5
1.1.4实验控制逻辑6
1.2STM32库结构和CMSIS标准8
1.2.1STM32库层次结构9
1.2.2CMSIS层次结构9
1.2.3STM32库结构中的文件关系10
1.2.4STM32库函数命名规则13
1.2.5STM32库常见的几个状态类型13
1.3工程开发环境设置14
1.3.1有关MDK14
1.3.2使用MDK建立工程的步骤15
第2章STM32体系结构25
2.1总线与通信接口25
2.1.1总线组成25
2.1.2重要的总线术语26
2.2STM32功能框架27
2.2.1系统组成27
2.2.2总线单元及挂接设备28
2.3STM32存储器映射29
2.3.1独立编址30
2.3.2统一编址(存储器映像编址)31
2.3.3CM3外设地址空间映射32
2.3.4地址空间映射详解34
2.4STM32时钟结构39
2.4.1STM32F103ZET6的时钟树39
2.4.2时钟树二级框架40
2.4.3时钟启用过程41
2.5系统时钟树与地址空间映射的关系43
第3章STM32系统启动过程分析44
3.1CM3的复位序列44
3.1.1堆栈45
3.1.2向量表47
3.2STM32启动代码分析49
3.3STM32系统时钟初始化52
3.3.1时钟源的选择52
3.3.2系统时钟设置56
3.4程序运行环境初始化函数__main60
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.2GPIO基本知识68
4.2.1GPIO分组管理及其引脚69
4.2.2GPIO工作模式及其配置69
4.2.3GPIO引脚的写入和读出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.1Cortex-M3的异常向量91
5.2.2异常向量表92
5.3NVIC与中断控制93
5.3.1NVIC简述93
5.3.2NVIC与外部中断93
5.3.3NVIC中断的优先级94
5.3.4NVIC初始化95
5.4EXTI基本知识97
5.4.1EXTI简介97
5.4.2EXTI控制器组成结构97
5.4.3GPIO引脚到EXTI_Line的映射100
5.4.4EXTI_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.2USART基本知识117
6.2.1串行异步通信协议117
6.2.2USART与接口标准RS-232118
6.3STM32 USART结构119
6.3.1USART工作模式119
6.3.2精简的USART结构119
6.3.3USART单字节收发过程120
6.4USART寄存器位功能定义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_BRR124
6.4.7USART模块寄存器组125
6.4.8USART模块初始化函数126
6.4.9USART常用函数功能说明127
6.5USART实验代码分析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综合应用:命令行外壳程序Shell138
7.1实验结果预览138
7.2基于USART的IO函数139
7.2.1字符及字符串获取函数:xgetc和xgets139
7.2.2字符及字符串打印函数:xputc和xputs141
7.3可变参数输出函数xprintf142
7.3.1可变参数142
7.3.2可变参数宏的使用与作用143
7.3.3用可变参数宏实现自己的格式化输出函数xprintf144
7.4Shell外壳145
7.4.1Shell命令管理结构146
7.4.2Shell命令解析过程147
7.4.3命令函数之参数解析150
7.5建立工程,编译和运行151
7.5.1创建和配置工程151
7.5.2编译执行153
第8章I2C接口154
8.1实验结果预览:轮询写入读出EEPROM数据154
8.2I2C总线协议155
8.2.1总线特点155
8.2.2I2C应用结构155
8.2.3总线信号时序分析156
8.3STM32 I2C模块158
8.3.1I2C组成框图158
8.3.2I2C主模式工作流程159
8.3.3I2C中断及DMA请求161
8.4I2C EEPROM读写示例及分析162
8.4.1示例电路连接162
8.4.2app.c文件中的main函数163
8.4.3eeprom.h文件166
8.4.4eeprom.c文件167
8.4.5shell.c文件174
8.5建立工程,编译及运行175
8.5.1创建和配置工程175
8.5.2编译执行176
第9章DMA接口177
9.1实验结果预览177
9.2通用DMA的作用及特征178
9.3STM32 DMA基本知识178
9.3.1DMA与系统其他模块关系图178
9.3.2STM32 DMA组成179
9.4实验示例分析183
9.4.1main.c文件中的main函数184
9.4.2USART1的初始化184
9.4.3DMA通道中断处理函数189
9.4.4sysTick中断处理函数190
9.4.5DMA通道配置的其他寄存器191
9.4.6DMA用户测试命令及其执行函数192
9.5建立工程,编译和执行193
9.5.1建立以下工程文件夹194
9.5.2创建文件组和导入源文件194
9.5.3编译运行194
第10章实时时钟RTC195
10.1实验结果预览195
10.2STM32 RTC模块196
10.2.1STM32后备供电区域196
10.2.2RTC组成199
10.3RTC实验设计与源码分析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章系统定时器SysTick214
11.1SysTick简述214
11.2SysTick工作过程214
11.3SysTick寄存器位功能定义215
11.3.1控制和状态寄存器:STK_CTRL215
11.3.2重载寄存器:STK_LOAD216
11.3.3当前计数值寄存器:STK_VAL217
11.3.4校正寄存器:STK_CALIB217
11.3.5SysTick模块寄存器组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.2SPI总线协议228
12.2.1总线信号及其应用结构228
12.2.2SPI内部结构与工作原理229
12.3STM32 SPI模块231
12.3.1SPI组成框图231
12.3.2STM32 SPI主模式数据收发过程232
12.3.3SPI中断及DMA请求234
12.4W25Q128FV规格说明234
12.4.1W25Q128FV状态和控制管理235
12.4.2W25Q128FV常用指令236
12.5程序入口与SPI初始化代码237
12.5.1实验硬件资源237
12.5.2工程入口文件main.c238
12.5.3spiflash.c文件中的spiFlash_Init函数239
12.6SPI Flash测试代码分析243
12.6.1spiflash.c文件中的SPI Flash测试函数spiTest244
12.6.2SPI Flash ID读取函数sFLASH_readID245
12.6.3扇区擦除函数sFLASH_eraseSector246
12.6.4Flash页写函数sFLASH_writePage246
12.6.5Flash读函数sFLASH_readBuffer247
12.6.6Flash字节发送函数sFLASH_SendByte248
12.7向Shell添加SPI测试指令spitest249
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.2ENC28J60知识257
13.2.1ENC28J60概述257
13.2.2控制寄存器259
13.2.3以太网缓冲器260
13.2.4PHY寄存器261
13.2.5ENC28J60 SPI指令集261
13.2.6ENC28J60初始化263
13.2.7使用ENC28J60收发数据268
13.2.8ENC28J60驱动代码总结272
13.3uIP协议栈简介274
13.3.1uIP特性274
13.3.2uIP应用接口275
13.3.3uIP的初始化及配置函数277
13.3.4uIP的主程序循环277
13.4uIP移植分析279
13.4.1下载uIP1.0版源码文件279
|
內容試閱:
|
进入21世纪以来,随着微电子技术、计算机技术及网络通信等技术的深入发展,整个社会信息化的程度越来越高,不用说智能手机,各种信息设备,如应用于医疗健康领域的智能心电仪、智能血糖仪,工业生产领域的自动测试装置、机器人手臂,安防领域的指纹识别、人脸识别技术,智能家居里的智能空调、冰箱、电表,甚至军事领域中的精确制导武器、红外热成像眼镜、自动跟踪都无一例外地具有智慧的大脑,它们的应用已深入我们生活的每个角落,改变着我们的生活方式。
在上面所提及的应用中,其智慧的大脑,实质就是一套套嵌入式系统,它们由不同的硬件和软件组成。这里所说的不同,一是指构成嵌入式系统的硬件核心,可能是由基于不同厂商的SoC芯片所拓展设计的实用电路,如ST公司的STM8、STM32系列SoC、NXP公司的LPC系列SoC;二是指嵌入式系统的软件构成,除去SoC片上外设的必要驱动外,还有管理这些驱动和应用的操作系统,如Embedded Linux、COS-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 COS-III结构的嵌入式开发。
在章节的安排上,遵循先总体,后细节的原则。第1章以一个跑马灯实验作为引子,为读者介绍了嵌入式开发所涉及的基本概念和流程,如GPIO配置、事件的轮询和中断处理机制等,以及基于STM32库开发所涉及的库文件组织和CMSIS标准、开发工具。建立了嵌入式开发的基本过程等轮廓性认识之后,第2章自然地切入STM32系列芯片的框架结构,包括总线、外设地址空间映射和时钟树。只有清楚了这三者之间的关系,才有可能对后面章节所讲解的外设工作过程和相关操作有深刻的理解。在此基础上,第3章开启了嵌入式系统的启动之旅,透彻地分析了基于CM3核的芯片系统之启动过程。有了前面三章的基础,随后的章节则以先简单,后复杂的原则逐一介绍GPIO、外部中断线、USART、DMA、I2C、SDIO等外设的结构原理及相应的驱动代码。
其次,对每一种外设的讲解,除了遵循先总体,后细节的原则之外,采用以实验现象为驱动(每章的第一节首先呈现给读者一个最终的实验结果画面)的思路,一步步进入外设的内部世界。这样的安排有利于激起读者对未知世界的强烈兴趣,随着对外设先总后细的逐层深入,最终使读者彻底理解并掌握每种外设实验现象背后的逻辑。
最后,本书除了讲解每种外设的工作原理和驱动代码之外,还穿插了三个有实用价值的综合案例,以拓展读者对外设应用的认识和理解,以及必要的知识面。第一个综合实例是基于USART接口的Shell(俗称外壳,类似于Linux的bash)程序,通过它可以将对外设的操作封装为一个个Shell命令,以随时执行。因此,Shell程序贯穿本书的始末。第二个综合实例是Telnet远程登录服务程序,该程序底层硬件是基于SPI总线的以太网芯片ENC2860,上层使用uIP协议栈来完成常用的TCPIP功能,如ping、ICMP、IP、TCP等。麻雀虽小,五脏俱全,通过实现这样的服务程序,不但可以使读者理解和掌握Telnet协议的工作原理及过程,而且有利于进一步学习理解TCPIP协议栈代码实现。最后一个综合示例实现了使用COS-III操作系统来管理前面所讲解的硬件,充分利用操作系统的任务通信、消息传递等机制来提升硬件系统的运行效能。COS-III系统结构紧凑,代码量小,容易理解掌握,通过移植和应用COS-III,使读者在掌握系统应用场景的同时,加深理解操作系统内部的工作机理,为后续进一步学习基于Linux的嵌入式开发打下基础。
由于社会信息化日趋明显,必定导致包括STM32在内的MCU的应用越来越多。希望本书能为渴望进入嵌入式开发领域的人员提供一个好的入门指引,为后续深入嵌入式开发的高级应用奠定基础。作为学习教材,本书每一章的实验代码都由笔者在Keil MDK开发环境中调试通过,读者可以放心学习使用。同时,由于笔者水平有限,书中难免会存在对相关知识点理解不够准确之处,敬请读者批评指正。
参与编写本书的人员还有我的同事易确,他负责本书所有的实验电路设计;熊立宇,负责完成最后三章的初稿编写及全书的校验工作。十分感谢他们的辛勤付出!
在本书的编写过程中,得到了电子工业出版社的田宏峰老师的悉心支持,在此表示衷心感谢,同时感谢他为我提供了一个这样施展自己特长机会;十分感谢我的同事彭丽兰,是她在我工作忙碌的时候,分担了我的工作,使我能够安心写作;最后想表达对我的家人,特别是朋友熊姬珠的谢意,是她们给予我精神上的鼓励,才使我得以完成这马拉松式的写作。
谭 贵
2017年8月于深圳
|
|