
与电子相关的专业,如电子工程、自动化、光电、机电、机器人、生物医学工程、医疗器械工程、康复工程等,都需要学习微控制器(微控制器也常常被称作单片机)。本书基于STM32核心板,以16个实验为主线。这些实验的编码规范均参见本书附录C《C语言软件设计规范(LY-STD001—2019)》。另外,所有的实验均基于模块化设计。这样读者就可以轻松地将这些模块应用在不同的项目和产品中。本书配套的资料包既包括STM32核心板原理图、例程、软件包,又包括软件和硬件资料,还包括配套的PPT讲义、视频等,且持续更新,最新下载链接可通过微信公众号“卓越工程师培养系列”获取。本书内容翔实,图文并茂,思路清晰,凡是涉及的知识点均会详细讲解,未涉及的知识点尽可能不予讲解。这样既能减轻读者的学习负担,又能促使读者快速掌握微控制器系统设计的各项必备技能。
本书是一本讲解STM32F1系列微控制器的书籍。无论电子工程、自动化、光电、机电、机器人专业,还是生物医学工程、医疗器械工程、康复工程专业,都要学习微控制器。然而,微控制器涉及面非常广,除了要掌握各种电路知识、C语言语法、计算机体系架构,还要熟悉微控制器的寄存器、固件库及各种集成开发环境、下载工具和串口调试工具。要想成为一名优秀的微控制器系统设计工程师,还需要进一步掌握软/硬件联合调试技能,具备模块化设计思想,并且能从宏观角度进行系统架构设计,能够灵活地将各种技术规范融入具体的项目中。 天津大学李刚教授有句名言,“勇于实践+深入思考=真才实学”,而当今的高等院校工科生,最缺乏的就是勇于实践,没有大量的实践,就很难对某一个问题进行深入剖析和思考,当然,也就谈不上真才实学。随着时代的进步和发展,技术更新速度也越来越快,很多陈旧的技术在不断被淘汰。然而,很多高校依然是参照20世纪七八十年代的课程体系,或在此基础上增加一些新课程。这样,就出现了一个严重的问题:学生需要修读的学分越来越多,而每门课程的课时越来越少。然而,卓越工程师的培养必须配以高强度的实训。 本书可以作为实训手册使用。16个实验都包括实验内容、实验原理、实验步骤、本章任务和本章习题5个环节。这些实验相对而言比较基础,而且每个实验都有详细的步骤和源代码,以确保读者能够顺利完成。另外,本书还对实验的内容、设计思路等进行了详细讲解,以保证读者能够深入理解这些实验涉及的知识点。每个实验的最后都有一个任务。这些任务是本章实验的延伸和拓展。因此,能够顺利完成并理解该章实验的读者,再加上深入思考,都能够完成这些任务。本章任务之后是本章习题,由若干小习题构成,用于检查读者是否真正掌握了本章的知识。 现在的微控制器功能比以往强大很多,想要掌握其知识点,就必须花费大量的时间和精力。比如,学习某一款STM32微控制器,至少要阅读三本手册,分别是ARM公司的《ARM Cortex-M3权威指南》、ST公司的《STM32中文参考手册》和《STM32固件库使用手册》。这些手册加起来一千多页。另外,初学者还要花费大量的时间和精力熟悉STM32的集成开发环境、程序下载工具、串口助手工具等。为了减轻查找资料和熟悉工具的负担,促使读者将更多的精力聚集在实践环节,争取快速入门,本书将每个实验涉及的《STM32中文参考手册》《ARM Cortex-M3权威指南》和《STM32固件库使用手册》上的知识点统一汇总在实验原理一节,STM32集成开发环境、程序下载工具、串口助手工具等的使用也穿插于各个章节中。这样,读者就可以通过本书和一套STM32核心板,结合书中的实验内容、实验原理、实验步骤、本章任务和本章习题,按照“勇于实践+深入思考”的思想,轻松踏上学习STM32之路,在实践过程中不知不觉掌握各种知识和技能。 简单总结一下本书的特点: (1)微控制器系统设计以一块STM32核心板作为实践载体。微控制器之所以选取STM32F103 RCT6,主要考虑到STM32是目前市面上使用最为广泛的微控制器。而且该系列的微控制器具有功耗低、外设多、基于库开发、配套资料多、开发板种类多等优势。 (2)书中16个实验涉及的所有知识点均详细讲解,未涉及的知识点几乎不予讲解。这样,初学者就可以快速掌握微控制器系统设计的绝大多数基本知识点。 (3)各种规范贯穿于整个微控制器系统设计的过程中,如Keil集成开发环境参数设置、工程和文件命名规范、版本规范、软件设计规范等。 (4)所有实验严格按照统一的工程架构设计,每个子模块按照统一的标准设计。 (5)配有完整的资料包,既包括STM32核心板原理图、例程、软件包,也包括软件和硬件资料,还包括配套的PPT讲义、视频等。这些资料会持续更新,下载链接通过微信公众号“卓越工程师培养系列”获取。 读者在使用本书开展实验时,建议先通过实验1和实验2快速熟悉整个开发流程,而对于实验3~6,务必花费大量的时间和精力,重点学习外设架构、寄存器、固件库函数、驱动设计和应用层设计等,并认真总结这4章的经验,最后,将这4章总结的经验灵活运用在后面的10个实验中,因为实验3~6基本涵盖了最后10个实验80%的知识点。学习过程中要学会抓重点,比如,实验3~6建议花费40%的时间和精力,而剩余的12个实验建议花费60%的时间和精力,切勿平均分配时间,而且学习过程中要不断总结和归纳。 另外,本书中的程序都严格按照《C语言软件设计规范(LY-STD001—2019)》编写。设计规范要求每个函数的实现必须有清晰的函数模块信息,包括函数名称、函数功能、输入参数、输出参数、返回值、创建日期和注意事项。由于本书篇幅有限,书中实验3~16中每个函数的实现均省略了函数模块信息,但是,读者在编写程序时,建议完善每个函数的模块信息,《函数实现及其模块信息》(位于本书配套资料包的“08.软件资料”文件夹)罗列了所有函数的实现及其模块信息,供读者开展实验时参考。 本书的编写得到了深圳市乐育科技有限公司的大力支持;深圳大学的覃进宇、刘宇林、陈旭萍和黄荣祯,以及杨钦铸、陈焕鑫、曹康养、王东琪和黄楷镔在教材编写、例程优化和文本校对中做了大量的工作;本书的出版得到了电子工业出版社的鼎力支持,张小乐编辑为本书的顺利出版做了大量工作,一并向他们表示衷心的感谢。本书获深圳大学教材出版资助。 由于作者水平有限,书中难免有错误和不足之处,敬请读者不吝赐教。 编 者 2019.10
第1章 STM32开发平台和工具 1 1.1 STM32芯片介绍 1 1.2 STM32核心板电路简介 2 1.3 STM32开发工具的安装与配置 8 1.3.1 安装Keil 5.20 8 1.3.2 配置Keil 5.20 10 1.4 STM32核心板可以开展的部分实验 10 1.5 本书配套的资料包 11 本章任务 11 本章习题 12 第2章 实验1—F103基准工程 13 2.1 实验内容 13 2.2 实验原理 13 2.2.1 寄存器与固件库 13 2.2.2 Keil编辑和编译及STM32下载过程 17 2.2.3 STM32工程模块名称及说明 18 2.2.4 STM32参考资料 19 2.3 实验步骤 20 本章任务 32 本章习题 33 第3章 实验2—串口电子钟 34 3.1 实验内容 34 3.2 实验原理 34 3.2.1 RunClock模块函数 34 3.2.2 函数调用框架 36 3.2.3 Proc2msTask与Proc1SecTask 37 3.3 实验步骤 38 本章任务 42 本章习题 42 第4章 实验3—GPIO与流水灯 43 4.1 实验内容 43 4.2 实验原理 43 4.2.1 LED电路原理图 43 4.2.2 STM32系统架构与存储器组织 43 4.2.3 GPIO功能框图 46 4.2.4 GPIO部分寄存器 48 4.2.5 GPIO部分固件库函数 53 4.2.6 RCC部分寄存器 56 4.2.7 RCC部分固件库函数 57 4.3 实验步骤 58 本章任务 63 本章习题 64 第5章 实验4—GPIO与独立按键输入 65 5.1 实验内容 65 5.2 实验原理 65 5.2.1 独立按键电路原理图 65 5.2.2 GPIO功能框图 65 5.2.3 GPIO部分寄存器 66 5.2.4 GPIO部分固件库函数 67 5.2.5 按键去抖原理 68 5.3 实验步骤 69 本章任务 76 本章习题 77 第6章 实验5—串口通信 78 6.1 实验内容 78 6.2 实验原理 78 6.2.1 UART电路原理图 78 6.2.2 UART通信协议 79 6.2.3 UART功能框图 80 6.2.4 UART部分寄存器 84 6.2.5 UART部分固件库函数 88 6.2.6 STM32异常和中断 94 6.2.7 NVIC中断控制器 98 6.2.8 NVIC部分寄存器 98 6.2.9 NVIC部分固件库函数 102 6.2.10 UART1模块驱动设计 105 6.3 实验步骤 110 本章任务 122 本章习题 122 第7章 实验6—定时器 123 7.1 实验内容 123 7.2 实验原理 123 7.2.1 通用定时器功能框图 123 7.2.2 通用定时器部分寄存器 127 7.2.3 通用定时器部分固件库函数 131 7.2.4 RCC部分寄存器 133 7.2.5 RCC部分固件库函数 134 7.3 实验步骤 134 本章任务 141 本章习题 141 第8章 实验7—SysTick 142 8.1 实验内容 142 8.2 实验原理 142 8.2.1 SysTick功能框图 142 8.2.2 SysTick实验流程图分析 143 8.2.3 SysTick部分寄存器 144 8.2.4 SysTick部分固件库函数 146 8.3 实验步骤 147 本章任务 151 本章习题 151 第9章 实验8—RCC 152 9.1 实验内容 152 9.2 实验原理 152 9.2.1 RCC功能框图 152 9.2.2 RCC部分寄存器 155 9.2.3 RCC部分固件库函数 158 9.2.4 Flash部分寄存器 163 9.2.5 Flash部分固件库函数 164 9.3 实验步骤 165 本章任务 169 本章习题 169 第10章 实验9—外部中断 170 10.1 实验内容 170 10.2 实验原理 170 10.2.1 EXTI功能框图 170 10.2.2 EXTI部分寄存器 172 10.2.3 EXTI部分固件库函数 175 10.2.4 AFIO部分寄存器 177 10.2.5 AFIO部分固件库函数 180 10.3 实验步骤 181 本章任务 186 本章习题 187 第11章 实验10—OLED显示 188 11.1 实验内容 188 11.2 实验原理 188 11.2.1 OLED显示模块 188 11.2.2 SSD1306的显存 189 11.2.3 SSD1306常用命令 191 11.2.4 字模选项 191 11.2.5 ASCⅡ码表与取模工具 192 11.2.6 STM32的GRAM与SSD1306的GRAM 193 11.2.7 OLED显示模块显示流程 194 11.3 实验步骤 194 本章任务 208 本章习题 208 第12章 实验11—独立看门狗 209 12.1 实验内容 209 12.2 实验原理 209 12.2.1 独立看门狗功能框图 209 12.2.2 独立看门狗最小喂狗时间 210 12.2.3 独立看门狗实验流程图分析 211 12.2.4 独立看门狗部分寄存器 211 12.2.5 独立看门狗部分固件库函数 214 12.3 实验步骤 216 本章任务 221 本章习题 221 第13章 实验12—读/写内部Flash 222 13.1 实验内容 222 13.2 实验原理 222 13.2.1 STM32的内部Flash和内部SRAM 222 13.2.2 STM32的内部Flash简介 223 13.2.3 STM32启动模式 224 13.2.4 Flash编程过程 224 13.2.5 Flash页擦除过程 225 13.2.6 Flash部分寄存器 226 13.2.7 Flash部分固件库函数 231 13.3 实验步骤 232 本章任务 241 本章习题 241 第14章 实验13—PWM输出 242 14.1 实验内容 242 14.2 实验原理 242 14.2.1 PWM输出实验流程图分析 242 14.2.2 通用定时器部分寄存器 244 14.2.3 通用定时器部分固件库函数 246 14.2.4 AFIO部分寄存器 247 14.2.5 AFIO部分固件库函数 248 14.3 实验步骤 249 本章任务 255 本章习题 255 第15章 实验14—输入捕获 256 15.1 实验内容 256 15.2 实验原理 256 15.2.1 输入捕获实验流程图分析 256 15.2.2 通用定时器部分寄存器 258 15.2.3 通用定时器部分固件库函数 260 15.3 实验步骤 262 本章任务 269 本章习题 269 第16章 实验15—DAC 270 16.1 实验内容 270 16.2 实验原理 270 16.2.1 DAC功能框图 270 16.2.2 DMA功能框图 274 16.2.3 DAC实验逻辑图分析 277 16.2.4 PCT通信协议 277 16.2.5 PCT通信协议应用 284 16.2.6 DAC部分寄存器 286 16.2.7 DAC部分固件库函数 289 16.2.8 DMA部分寄存器 292 16.2.9 DMA部分固件库函数 296 16.3 实验步骤 300 本章任务 313 本章习题 314 第17章 实验16—ADC 315 17.1 实验内容 315 17.2 实验原理 315 17.2.1 ADC功能框图 315 17.2.2 ADC实验逻辑框图分析 318 17.2.3 ADC实验中的ADC缓冲区 319 17.2.4 ADC部分寄存器 319 17.2.5 ADC部分固件库函数 324 17.3 实验步骤 330 本章任务 341 本章习题 341 附录A STM32核心板原理图 342 附录B STM32F103RCT6引脚定义 343 附录C C语言软件设计规范(LY-STD001—2019) 346 参考文献 354