
本书介绍了意法半导体(STMicroelectronics,ST)公司的32位基于ARM Cortex-M3内核的STM32单片机原理与实践。本书以培养学生的动手能力和增强学生的工程素养为目的,按照项目驱动的思路展开教学与实践学习,以自制的开发板上的程序为实例,将STM32单片机的外围引脚特性、内部结构原理、片上外设资源、开发设计方法和应用软件编程、μC/OS-Ⅱ操作系统原理及应用等知识传授给读者。
第2版前言 1.本书定位 本书定位为有51单片机基础的读者学习STM32微控制器的“入门”教材,即本科电类专业,51单片机课程后的“嵌入式系统原理及应用”课程可选用的教材。本书的目的是深化强化嵌入式系统的基本概念,因此写法中侧重基本原理的阐述,侧重与51单片机对比(外设主要选择了GPIO、EXTI、USART、TIM,分别与51课程中的I/O接口、外部中断、串口、定时/计数器对应)。在51单片机的知识结构中,这4个重要外设是按照如下线索组织的:功能→硬件→寄存器,即某个具体的功能是通过硬件实现的,寄存器是硬件与程序员的接口,程序员利用汇编语言或C语言通过寄存器控制硬件。而对于STM32,线索增加了一层,即功能→硬件→寄存器→固件库,程序员调用固件库函数控制硬件。其实细读固件库函数代码后可以发现,还是通过寄存器控制硬件,只是经过固件库封装后,代码更加易读、易用。因此从寄存器到固件库的学习中,读者一定要清晰二者之间的联系。掌握好本书中这4个外设接口,就可以结合Cortex-M3权威指南、STM32技术参考手册和固件库手册、STM32具体型号的数据手册,进行嵌入式开发技能的进一步提升。 2.嵌入式系统层次模型 与OSI网络7层模型类似,嵌入式系统也有层次模型,并且在下述具体的知识点中有不同的体现。 第1页图1-1; 第83页图4-2和图4-4; 第85页图4-5; 第89页图4-8; 第263页图11-9和图11-10; 第269页图11-12; 第270页图11-13。 在上述结构中,第1页的图1-1所示的是一个抽象模型,其他都是它的具体实现。层次模型是研究复杂问题一个有效方法。 3.章节设置说明 本书篇章布局从理论体系上讲并不十分严。例如,第2章Cortex-M3体系结构中包含STM32存储器映射;NVIC的优先级,应属于第2章,但从应用角度来考虑放到第5章EXTI中;SysTick也应属于第2章,但从功能角度来考虑放到第8章定时器部分。这样设置的目的都是从应用的角度来考虑的,这也与嵌入式系统“用中学”的学习理念一致,但读者一定要清晰了解相关概念。 本书在第1版的基础上增加了第13章,这是一个以STM32为核心的嵌入式系统应用实例。本书第1~2章、第7~13章、附录A~D由燕山大学陈志旺编写,第3章由燕山大学刘宝华编写,第4章由燕山大学王荣彦编写,第5章由燕山大学程淑红编写,第6章由燕山大学吕宏诗编写,参加本书编写的还有李萌、薛佳伟、王敬、吴晨、李晓、李坤、赵春媛、刘砚、赵晓娟和李江艳。全书由陈志旺统稿。书中引用了一些网上文献,无法逐一注明出处,在此向原作者表示感谢! 由于笔者水平有限,书中难免存在错误与不妥之处,欢迎读者朋友不吝赐教!作者的E-mail地址:czwaaron@ysu.edu.cn。 编著者 第1版前言 嵌入式系统属于一个交叉学科,它涵盖了微电子技术、电子信息技术、计算机软件和硬件等多项技术领域,覆盖面广。目前嵌入式系统发展很快,很多软/硬件技术出现时间不长,掌握这些新技术的人相对较少。很多高校专业划分过细,难以跟上市场变化的步伐,与实际工程项目脱节严重,仍沿用应试教育的教学方式,理论知识讲授过多,动手环节薄弱,理论联系实际能力较差,学生参与社会实践较少,不了解社会需求。嵌入式教学需要相应的嵌入式开发板和软件,需要有经验的人进行开发流程指导,这在目前的高校中是很难实现的。针对上述问题,我们组织多年在一线授课的教师根据教学经验编写了此书。 1.对教师的建议 把握“三个统一学单片机”的教学理论。 1)一般与特殊的统一 目前电类课程中关于微机方面的课程很多,如《计算机应用基础》、《微机原理》、《单片机原理及应用》、《嵌入式系统原理及应用》、《可编程控制器PLC》等,这些课程间内容既有重复又有联系,因为以奔腾芯片为核心的PC、以8086为核心的第一代PC、51单片机、以ARM为核心的嵌入式系统、PLC都有相同的遗传基因(微机原理)。因此,任课老师应熟悉上述课程,在课堂讲授中将其融会贯通起来,深入挖掘课程的共性,即微机的基本原理,然后引导学生在学习中侧重其差异,这样不仅可以提高学习效率,还可以启发学生思考。 2)硬件与软件的统一 通过多年的教学实践我们发现,“软件通过控制字寄存器控制硬件”是学生理解的难点,其原因可能是平时同学操作PC直接通过Windows界面达到驱动硬件的目的,没有用软件驱动过底层硬件。因此在介绍嵌入式系统时,最好从硬件控制寄存器程序讲起,让学生对底层原理有个认识。对于STM32,本书在第5章也揭示了控制寄存器和库函数的相关性。另外,在参考文献[2]中,我们将汇编语言依赖硬件的特性深入挖掘,课堂效果较好,推荐采用。 3)内部结构与外部引脚的统一 将内部结构、外部引脚、系统功能、指令集统一起来,只有这样才能做到“庖丁解牛,游刃有余”。 2.对学生的建议 1)重视实践 工程师解决问题的能力只有从实践中才能获得。从实践经验中归纳出共性的知识,然后再将这些知识重新应用到新的实践中去,这也是当今的大学生要在未来的实际工作中必须采取的学习和工作方法。只有做到了这一点,才能真正实践以工作为导向的理念:实践、归纳、总结和再实践。学好嵌入式系统,实践必不可少,一定要选一块和微处理器型号对应的开发板,创建一个良好的平台和环境,边实践边学习,尽量弄清其内在原理。硬件开发板的价格不必太高,最好能有自己动手的空间。深入理解STM32的硬件最小系统,对I/O口、串行通信、键盘、LED、LCD、SPI、I2C、PWM、A/D(包括一些传感器)、D/A等实验逐个实践,逐步理解,再动手制做一个实际的小系统,底层硬件基础就有了。各个硬件模块驱动程序的编写是嵌入式系统的必备基础。在编程中,主要针对mainc和stm32f10x_itc两个文件,其他定义硬件控制寄存器的文件stm32f10x_maph、硬件初始化结构体的文件stm32f10x_xxxh和stm32f10x_xxxc也要仔细研读,将软件和硬件联系起来学习,会加深对硬件的理解。把书上的例程亲手输入到计算机中进行实践是很有必要的,一定要多上机操作。程序是抽象的,有时程序能看懂,但自己却不一定能编出来;而有时虽然程序没看懂,但若经常着手去编,就会非常熟悉该程序应该怎样去处理。要把在书中看到的有意义的例子举一反三;经常回顾自己以前写过的程序,并尝试重写,把自己学到的新知识运用进去,温故而知新;当程序写到一半时却发现自己用的方法烦琐,不要马上停手,应尽快将余下的部分粗略地完成,以保证设计的完整性,然后分析自己的错误并重新设计和编写;遇到问题时,不要马上向其他人求教,以免养成依赖性,要学会自己去解决问题。看到一个编程要求后,首先要在头脑中有一个大体的轮廓,独立构思,不要看参考提示,只有这样才可以达到真正的训练目的,才会逐步把思路培养出来;保存好写过的所有的程序——那是最好的积累之一。学习的过程中要经过思考加工,去粗取精,抓本质和精华,仔细研读并尝试修改别人的例程代码,真正将新知识应用到实践中,理解后融入到自己的知识体系中。本书每个知识点后都对应一个开发板实例,推荐以项目开发的方式进行学习,将学习成果变成自己的作品。 2)重视官方文档 学习时,应关注两个比较重要的文档:《STM32F103××× 参考手册》和《STM32固件库使用手册》。 阅读《STM32F103×××参考手册》时,不需要全部阅读,但是前几章必须重点阅读,包括存储器和总线架构,电源控制,备份寄存器,复位和时钟控制,通用和复用功能I/O,中断和定时器等。后续章节讲述的是具体的功能模块设计,如果要用到哪个模块,就可以去阅读相应的模块。 阅读《STM32 固件库使用手册》的主要目的是为了简化编程。STM32提供了一个非常好的固件函数库,只需调用即可。阅读《STM32 固件库使用手册》时,前面几章也是必须阅读的。比如,第1章文档和库规范中的命名规则,编码规则,这些都是需要注意的。第2章是最关键的,描述了固件库的架构,以及如何使用固件库等。有了这些基础,就可以借助固件库写出自己的代码了。第4章以后的章节都是描述某个模块有什么函数,每个函数如何使用等,可以根据需要来阅读。建议对GPIO 库函数、中断部分库函数、复位和时钟设置的库函数等内容要重点阅读。 无论何时,官方手册是最好的老师和帮手,千万不要因为它的枯燥乏味而将其束之高阁。使用任何外设前,都必须仔细看参考手册和使用手册。 3)重视交流 在网上建个交流平台,或者开博,或者社区交流,把自己解决的问题和经验与他人分享,这样通常会让读者个人的研究更具可行性和更深入地被了解;构建或参与技术圈子,一个好的圈子通常会给读者带来钻研和共同提高的激情,或者说是一个良性的竞争环境。 3.本书特点 在讲述具体内容时,本书各章节均以我们开发的STM32开发板为硬件教具,每章均会提供一个设计任务实例,以任务为驱动,通过“学中做、做中学”,即DIY(Do It Yourself)和LBD(Learning By Doing)的方式,介绍和讲解所需要用到的新知识、新技能,按照认识的规律学习和掌握基于ARM Cortex-M3内核的STM32嵌入式微控制器技术及其应用编程,尽量避免纯理论性描述带给读者的枯燥感。有别于数据手册式的教材,本书并没有面面俱到地谈及Cortex-M3的技术细节,各个章节也没有繁冗的寄存器说明(参见ST公司网页上的数据手册或本书配套资料),而且涉及微机原理的相关知识都在每章“本章前导知识”中给出(可阅读参考文献[2]),每章的例程只给出关键代码,这样做的目的旨在突出重点。本书写作过程中,也注意了软、硬件的结合,将STM32的内部结构、控制寄存器和库函数对应结构体,还有功能特点和初始化设置等结合起来,揭示软、硬件之间的联系,使读者能够对STM32应用“快速上手”。本书不仅是教给大家STM32基础知识,更重要的是介绍嵌入式系统的学习方法,启发读者的创意思维。 本书受全国教育科学规划2010年度教育部重点课题(课题批准号:GKA103004)的子课题(立项编号:GKA10105)资助。第1、2、7、8、9、10、11、12章及附录由燕山大学陈志旺编写,第3章由燕山大学刘宝华编写,第4章由燕山大学王荣彦编写,第5章由燕山大学程淑红编写,第6章由燕山大学吕宏诗编写。全书由陈志旺统稿。参加本书编写的还有李萌、薛佳伟、王敬、吴晨、李晓、李坤、赵春媛、刘砚、赵晓娟和李江艳。书中引用了一些网上文献,无法一一注明出处,在此向原作者表示感谢! 由于笔者水平有限,书中难免存在错误与不妥之处,欢迎读者朋友不吝赐教!来信可与如下邮箱联系:czwaaron@ysueducn。博客:http://blogsinacomcn/gksupermarket,本书的进一步资料会在博客上更新。 编著者
第1章嵌入式系统概述 1.1嵌入式系统简介 1.1.1嵌入式系统定义 1.1.2嵌入式系统特点 1.1.3嵌入式系统分类 1.1.4嵌入式系统发展 1.2ARM体系结构及微处理器系列 1.2.1ARM公司简介 1.2.2ARM体系结构简介 1.3Cortex-M系列处理器简介 1.4STM32系列微控制器简介 1.5STM32教学开发板 第2章Cortex-M3体系结构 2.1CM3微处理器核结构 2.2处理器的工作模式及状态 2.3寄存器 2.4总线接口 2.5存储器的组织与映射 2.5.1存储器格式 2.5.2存储器层次结构 2.5.3CM3存储器组织 2.5.4STM32存储器映射 2.5.5位绑定操作 2.6指令集 2.6.1ARM指令集 2.6.2Thumb指令集 2.6.3Thumb-2指令集 2.7流水线 2.8异常和中断 2.9存储器保护单元MPU 2.10STM32微控制器概述 2.10.1STM32命名 2.10.2STM32内部资源 第3章STM32最小系统 3.1电源电路 3.1.1供电方案 3.1.2电源管理器 3.1.3低功耗模式 3.2时钟电路 3.2.1HSE时钟和HSI时钟 3.2.2PLL 3.2.3LSE时钟和LSI时钟 3.2.4系统时钟SYSCLK 3.2.5RCC寄存器 3.3复位电路 3.4STM32启动 3.5程序下载电路 3.6STM32最小系统 第4章STM32程序设计 4.1嵌入式软件层次结构 4.2Cortex微控制器软件接口标准 4.3FWLib固件库 4.3.1STM32标准外设库 4.3.2固件库命名规则 4.3.3数据类型和结构 4.3.4固件库的应用 4.4嵌入式C程序特点 4.5开发环境简介 第5章GPIO原理及应用 5.1GPIO的硬件结构和功能 5.1.1GPIO硬件结构 5.1.2复用功能 5.1.3GPIO输入功能 5.1.4GPIO输出功能 5.1.5GPIO速度选择 5.1.6钳位功能 5.2GPIO寄存器 5.3GPIO库函数 5.4库函数和寄存器的关系 5.5应用实例 第6章EXTI原理及应用 6.1STM32中断通道 6.2STM32中断的过程 6.3NVIC硬件结构及软件配置 6.3.1NVIC硬件结构 6.3.2STM32中断优先级 6.3.3中断向量表 6.3.4NVIC寄存器 6.3.5NVIC库结构 6.4EXTI硬件结构及软件配置 6.4.1EXTI硬件结构 6.4.2中断及事件 6.4.3EXTI中断通道和中断源 6.4.4EXTI寄存器 6.4.5EXTI库函数 6.5应用实例 6.5.1按键中断 6.5.2中断嵌套案例1 6.5.3中断嵌套案例2 第7章USART原理及应用 7.1端口重映射 7.2USART功能和结构 7.2.1USART功能 7.2.2USART结构 7.3USART帧格式 7.4波特率设置 7.5硬件流控制 7.6USART中断请求 7.7USART寄存器 7.8USART库函数 7.9USART应用实例 7.9.1直接传送方式 7.9.2中断传送方式 7.9.3串口Echo回应程序 7.9.4利用printf()的串口编程 第8章定时器原理及应用 8.1STM32定时器概述 8.2通用定时器TIMx功能 8.3通用定时器TIMx结构 8.3.1时钟源选择 8.3.2时基单元 8.3.3捕获和比较通道 8.3.4计数器模式 8.3.5定时时间的计算 8.3.6定时器中断 8.4通用定时器TIMx寄存器 8.5通用定时器TIMx库函数 8.6TIM2应用实例 8.6.1秒表 8.6.2输出比较案例1 8.6.3输出比较案例2 8.6.4PWM输出 8.6.5PWM输入捕获 8.7RTC的功能及结构 8.7.1RTC的基本功能 8.7.2RTC的内部结构 8.8RTC控制寄存器 8.9备份寄存器 8.10电源控制寄存器 8.11RTC相关的RCC寄存器 8.12RTC应用实例 8.13系统时钟SysTick简介 8.14SysTick寄存器 8.14.1控制及状态寄存器(SYSTICKCSR) 8.14.2重载寄存器(SYSTICKRVR) 8.14.3当前值寄存器(SYSTICKCVR) 8.14.4校准值寄存器(SYSTICKCALVR) 8.15SysTick应用实例 第9章DMA原理及应用 9.1DMA简介 9.2DMA的功能及结构 9.2.1DMA的功能 9.2.2DMA结构 9.3DMA寄存器 9.4DMA库函数 第10章ADC原理及应用 10.1ADC的功能及结构 10.2ADC的工作模式 10.3数据对齐 10.4ADC中断 10.5ADC寄存器 10.6ADC库函数 10.7应用实例 第11章μC/OS-II嵌入式操作系统基础 11.1操作系统的功能 11.2操作系统的基本概念 11.2.1进程和线程 11.2.2实时操作系统RTOS 11.2.3其他概念 11.2.4应用程序在操作系统上的执行过程 11.3操作系统的分类 11.3.1单体结构 11.3.2层次结构 11.3.3微内核结构 11.4μC/OS-II简介 11.4.1μC/OS-II的主要特点 11.4.2μC/OS-II工作原理 11.4.3μC/OS-II的程序设计模式 11.5μC/OS-II移植 11.5.1移植条件 11.5.2移植步骤 11.5.3内核头文件(OS_CPUH) 11.5.4与处理器相关的汇编代码(OS_CPU_AASM) 11.5.5与CPU相关的C函数和钩子函数(OS_CPU_CC) 第12章μC/OS-Ⅱ的内核机制 12.1μC/OS-II内核结构 12.1.1μC/OS-II的任务 12.1.2临界代码 12.1.3任务控制块 12.1.4就绪表 12.1.5任务的调度 12.1.6中断处理 12.1.7时钟节拍 12.1.8任务的初始化 12.1.9任务的启动 12.2μC/OS-II的任务管理 12.2.1创建任务 12.2.2删除任务 12.2.3请求删除任务 12.2.4改变任务优先级 12.2.5挂起任务 12.2.6恢复任务 12.2.7任务调度实例 12.3μC/OS-II的时间管理 12.3.1延时函数 12.3.2恢复延时任务 12.3.3系统时间 12.4任务间的通信与同步 12.4.1事件控制块 12.4.2信号量 12.4.3信号量实例 第13章嵌入式系统综合设计实例 13.1嵌入式系统开发过程 13.2自平衡小车基本功能 13.3硬件结构 13.3.1电气控制系统整体结构 13.3.2加速度计 13.3.3陀螺仪 13.4控制算法设计 13.4.1角度检测算法设计 13.4.2运动控制算法设计 附录A嵌入式系统常用缩写和关于端口读/写的缩写表示 附录BCortex-M3指令清单 附录C51单片机与STM32微控制器的比较 C.1硬件:寄存器 C.2硬件:存储器空间 C.3硬件:堆栈 C.4硬件:外设 C.5硬件:异常和中断 C.6软件:数据类型 C.7软件:浮点 C.8软件:中断服务程序 C.9软件:非对齐数据 C.10软件:故障异常 C.11软件:设备驱动程序和CMSIS C.12软件:混用C语言和汇编程序 C.13其他比较 附录DSTM32实验板原理图 参考文献
http://www.hxedu.com.cn/hxedu/fg/book/bookinfo.html?code=TN229560