❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。
☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋。
专栏目标:实现从零基础入门51单片机和STM32单片机,力求在玩好单片机的同时,能够了解一些计算机的基本概念,了解电路及其元器件的基本理论等。⭐️ 专栏主要内容: 主要学习STM32单片机的功能、各个模块、单片机的外设、驱动等,最终玩好单片机和单片机的外设,全程手敲代码,实现我们所要实现的功能。
专栏说明 :如果文章知识点有错误的地方,欢迎大家随时在文章下面评论,我会第一时间改正。让我们一起学习,一起进步。
专栏主页:http://t.csdn.cn/HCD8v
本学习过程参考:https://space.bilibili.com/383400717
STM3单片机安装软件、各种资料以及源码的路径:
链接:https://pan.baidu.com/s/1snD0uuTfMhchFqOMWvAiHA?pwd=asdf#list/path=%2F
提取码:asdf
链接里压缩包的解压密码:32
本节是STM32单片机部分的第一节,主要对STM32部分课程进行简单介绍,以及对STM32单片机进行简单介绍;其中包括STM32介绍、ARM介绍、片上资源/外设、命名规则、系统结构、引脚定义、启动配置、最小系统电路等。
在STM32的学习过程中,将使用stm32最小系统板+面包板硬件平台进行学习和练习,硬件平台如上图所示,将STM32最小系统板(上图蓝色板子)插在面包板上,作为基本的硬件单元,下面插上一块0.96寸的OLED(右下角黑色板子)作为调试和显示的屏幕,在调试程序时,可以把程序中的变量显示在这个屏幕上,这样调试起来就会比较方便;右边的STLINK(紫色部分)插在电脑上用于下载程序和供电;最上面的是蜂鸣器模块;
使用面包板可以完成任意电路的连接,接线和修改都是非常方便的;相比较成品的开发板方式,使用面包板更有利于我们对硬件电路的学习,而且也可以避免开发板的一些问题,比如引脚冲突、引脚无法更改等;
当然使用面包板也会带来一些问题,比如如果程序现场跑不出来,不仅有可能是程序的问题,也有可能是接线的问题等;这就需要我们在连线的时候要更加细心;关注软件程序的同时,也要关注硬件电路;
硬件设备:
软件设备:
这次学习STM32使用的是Keil5 MDK这个软件,Keil5 SDK是用来给ARM系列的单片机编程的。
套件介绍
中间白色部分是面包板,左边这一盒是面包板专用的跳线,这种跳线比较短,可以贴在面包板上插线,比较适合长时间插线的情况;上面那一扎是面包板的飞线,这种线比较长,也方便挪动,比较适合经常挪动的接线情况;飞线下面两排是杜邦线,分别是公对母和母对母的,可以用于插接一些电路模块;
蓝色部分是STM32最小系统板,该板上中间的黑色小模块就是STM32芯片,我们就是主要学习这个小芯片;STM32最小系统板的右边是0.96寸的OLED显示屏模块,用于显示参数和变量,这个显示屏是一个4引脚版本的,现在网上卖的由4引脚和7引脚的,主要不要弄错了;
图中右上角的是电位器,主要用来进行AD转换试验的;电位器下面是按键,两引脚的小按键,它可以正好跨接在面包板的引脚插孔和电源插孔之间,插接非常方便整洁,如下图所示:
五颜六色的是LED灯;左边紫色部分的是STLINK,用来下载程序和供电的;STLINK下面是USB转串口模块,使用这个模块就可以使STM32和电脑进行串口通信了;
有源蜂鸣器模块,内置震荡源,接上电就可以响;相比较无源蜂鸣器模块需要不断反转IO口的操作方式,有源蜂鸣器模块就方便多了,基本和点灯一样简单;
右边四个是传感器模块,第一个是光敏电阻模块,下面的四个引脚有两个是用来供电的,还有两个是光敏电阻信号的模拟输出和数字输出,可以用来进行IO口读取实验或者AD试验;第二个是热敏电阻模块,也是有模拟输出和数字输出的;第三个是对射式红外模块,这个模块配合遮光片可以用来计次,或者配合编码盘用来测速;第四个是反射式红外模块,它可以向地面发射红外光,然后再用红外接收管接收地面反射的红外光,通过判断接收光的强度,就可以大体地识别出地面的颜色变化了;
W25Q64 Flash存储模块,它可以存储数据,并且是用SPI总线进行通信的,我们主要用它来学习SPI通信;
MPU6050陀螺仪和加速度计,它可以测量芯片自身的姿态,像四轴飞行器上,一般都会配有陀螺仪和加速度计,他是用I2C总线通信的,我们主要用它来学习I2C通信;
旋转编码器,它可以输出两路正交的方波信号,用于指示旋转的方向和速度,STM32里有专用的编码器电路,可以很方便的识别这种信号,这个模块可以当做一个快读的按键来使用,当然本节主要还是用它来模拟编码器的测速,现在的编码电机一般配备活儿传感器或光电传感器,这些传感器的输出和这种旋转编码器是一样的,所以学习一下旋转编码器就可以了;而且这种旋转编码器还比较方便插在面包板上,而且比较便宜;
直流电机和TB6612电机驱动模块,可以用来进行直流电机的PWM调速实验;
SG90舵机,也是用PWM来控制的,它的输出端可以像船舵一样,根据我们给定的PWM信号的占空比固定在某一个角度上,可以用来做一些机器人或者机械臂的关节;
ST的意思是ST公司,M是微控制器Microcontroller
的首字母;微控制器就是MCU,就是我们常说的单片机,所以STM32也是一款单片机;32的意思是这是一款32位的单片机,相比较8位的51单片机,STM32的性能还是非常强的,当然ST也推出过8位的单片机,名字叫STM8,这个了解一下就行;
这个ARM Cortex-M
内核就是STM32内部的核心部分;这个内核是ARM公司设计的,它在STM32中占据极为重要的地位;比如我们程序指令的执行,加减乘除的运算,都是在内核中完成的;它相当于整个芯片的CPU;
如图中所示,目前STM32主要有四个系列,分别是高性能系列(High Performance)、主流系列(Mainstream)、超低功耗系列(Ultra-low-power系列)和无线系列(Wireless);每个系列对应着不同的产品;
例如:
以上这些就是目前STM家族中的所有系列了;可以看出来这个系列还是比较全的;我们学习的事主流系列;当然如果觉得性能不够也可以继续进阶学习高性能的系列;如果对功耗比较敏感,也可以学习一下低功耗系列;如果想做无线通信的产品,可以了解一下无线的系列;因为他们都是一个家族的,所以换一个系列再学习的话也会比换别的芯片轻松很多;
在本学习过程中我们使用的STM32的型号是STM32F103C8T6,如上图中右侧的图片所示;根据他的型号再对应前面的介绍,我们就已经知道了它是主流系列的STM32F1,他的内核是ARM Cortex-M3,主频是72MHz,它的RAM大小是20K,ROM大小是64K,这里的RAM就是运行内存,实际的存储介质是SRAM;这里的ROM就是程序存储器,实际的存储介质是Flash闪存;它的供电电压是2.0~3.6V,标准是3.3V供电;这里需要注意下,我们以前学的51单片机使用的是5V供电,还有USB输出的电压也是5V,5V不在STM32的供电范围内,因此不能直接给STM32供电;如果是5V电压给STM32供电,需要在中间加一个稳压芯片,把电压降到3.3V,再给STM32供电;它的封装是L QFP48,也就是上图这种比较小的封装,总共有48个引脚。
下面看一下这款芯片上的片上资源,片上资源又叫外设,英文是Peripheral;上图的表里列出了STM32F1系列的外设资源;我们主要学习的就是STM32的外设;通过程序配置外设,来实现我们想要的功能。
在上表中,前两个颜色深绿色的,是位于Cortex-M3内核里面的外设,剩下的都是内核外的外设。
接下来我们一一看一下这些外设都是干啥的:
以上就是STM32F1系列所有外设的大致介绍了,在后面的学习中,经常会和这些字母缩写打交道,所以我们应该提前熟悉这些字母的意思,至于具体的功能后面会慢慢介绍;另外还要注意,这是STM32F1整个系列的所有外设,并不是所有型号都拥有全部的外设;比如我们这款C8T6的芯片,就没有后面这四个外设;具体的型号都包含具体哪些外设,还需要看一下对应的数据手册;比如打开C8T6的数据手册,看一下外设资源表:
可以看到,这个C8T6是64K的闪存,20K的SRAM,有三个通用定时器,1个高级定时器,没有基本定时器;2个SPI,2个I2C,3个UART,1个USB,1个CAN总线,37个IO口,2个10通道的12为ADC;那在这个表里没有出现的外设,你就要确认一下它是不是存在;要是操作了不存在的外设,那它是不会工作的;
下面我们来看一下这个芯片的命名规则,看一下这个型号每一位字母和数字代表的意义;STM32
代表的是基于ARM核心的32为微控制器;F
代表的是通用类型;103
代表的是增强型,当然除了增强型也还有一些基本型(101),USB型(102),互联型(105或107)等;C
代表它的引脚数目是48脚(T表示36脚,R表示64脚,V表示100脚,Z表示144脚),一般来说引脚越多,它的外设就会越多;8
代表它的Flash闪存的容量是64K,当然还有其它的一些容量大家可以看一下;T
代表它的封装类型是LQFP的;6
表示的是温度范围是-40~85摄氏度;
这些就是这个STM32的命名规则;现在还有一种比较常用的型号,叫STM32F103RCT6,对照以上命名规则可以知道,这个RCT6的芯片是64脚,256K的Flash,LQFP封装,-40~85摄氏度这样的参数;以后看到其他型号的STM32,也都可以对照这个命名规则;了解它的大致参数。
下面看一下这个芯片的系统结构,这个结构看起来比较复杂,现在这个阶段不需要每个部分都弄懂,大致的了解一下即可;了解这个系统结构有利于我们加深对STM32的认识,便于今后的学习;我们可以把这个图分为四部分,如下图所示:
左上角的是Cortex-M3的内核,内核引出来了三条总线,分别是ICode指令总线
,DCode数据总线
,System系统总线
;
这个ICode总线
和DCode总线
主要是用来连接Flash闪存的,Flash里面存储的就是我们编写的程序;ICode指令总线就是加载程序指令的;DCode数据总线是用来加载数据的,比如常量和调试数据这些;
除了ICode总线和DCode总线,内核还引出了System系统总线
,如上图所示,System总线就连接到了这些其他的东西上面,比如SRAM,用于存储程序运行时的变量数据;还有FSMC,这个本课程的芯片不会用到;
下面这个AHB系统总线
就是用于挂在主要外设的,AHB的意思是先进高性能总线;挂载的一般时最基本的或者性能比较高的外设,比如复位和时钟控制这些最基本的电路,还有SDIO也是挂载在AHB上的;
AHB后面时两个桥接,接到了APB2和APB1两个外设总线
上;APB的意思是先进外设总线,用于连接一般的外设,因为AHB和的APB的总线协议,总线速度,还有数据传送格式的差异,所以中间需要加两个桥接,来完成数据的转换和缓存;AHB的整体性能比APB高一些;其中APB2的性能又比APB1高一些,APB2一般是和AHB同频率,都是72MHz,APB1一般是36MHz;所以APB2连接的都是一般外设中稍微重要的部分,比如GPIO端口,还有一些外设的1号选手等;比如USART1,SPI1,TIM1,TIM8等;TIM8和TIM1一样,也是高级定时器,所以也是重要的外设,还有ADC,EXTI,AFIO,也是接在APB2上面的;而其他的像2,3,4,5号外设,还有DAC/PWR/BKP等 ,这些是次要一些的外设,都会分配到APB1上去;当然在使用的时候,个人一般感觉不到APB2和APB1的性能差异;只需要知道这个外设是挂载到哪个系统总线上的就可以了。
右下角的一大部分主要就是刚刚我们介绍的外设种类和分布;
剩下最后左下角的这一部分,就是DMA
了,这个DMA可以把它当作内核CPU的小秘书,比如有一些大量的数据搬运的活儿,让CPU来干的话就太浪费时间了;比如说我有个外设ADC模数转换,这个模数转换可以配置成连续模式,比如1ms转换一次,转换完的数据必须得转运出来,否则数据就会被覆盖丢失,如果直接让CPU来干这活儿的话,那么CPU每过1ms就得来转运一下数据,这样会费时费力,影响CPU的正常工作;而且这个活儿就是简单的数据搬运,也没必要让CPU来干;于是DMA这个小秘书就出现了,它主要就是干这些像数据搬运这样,简单且反复要干的事情,那DMA通过DMA总线连接到总线矩阵上,它可以拥有和CPU一样的总线控制权,用于访问这些外设小弟,当需要DMA搬运数据时,外设小弟就会通过请求线发送DMA请求,然后DMA就会获得总线控制权,访问并转运数据;整个过程不需要CPU的参与,省下了CPU的时间用来干其他事情;这就是DMA的用途。
到这里,我们这整个系统结构图就已经大概清楚了;
引脚定义对于我们使用这个芯片而言还是非常重要的,一般我们拿到一个新的芯片时,需要着重地看一下它的引脚定义,有的时候这个引脚定义看完了,我们就可以大概知道这个芯片时怎么使用的了,那上图就是江科大老师做出来的STM32F103C8T6的引脚定义表;以后我们开发STM32会经常用到这个表;大家可以把这个图片存下来方便以后查看;
图的最上方白色部分就是C8T6这个芯片的引脚序号和引脚名称的示意图;在左上角有个小黑点,代表它左边的引脚是1号引脚,然后逆时针依次排列,直到48号引脚;下面绿色表格里就是每个引脚的名称和功能;在这里,作者都做了颜色标记,标橙色的是电源相关的引脚,标蓝色的是最小系统相关的引脚,标绿色的是IO口,功能口这些引脚;
首先表头,前两列是引脚号
和引脚名称
,和上面的芯片引脚一一对应;接着是类型
,S代表电源,I代表输入,O代表输出,IO代表输入输出;然后IO口电平
代表IO口所能容忍的电压;在这一列里面,有FT的,表示该引脚能容忍5V的电压,没有FT的,则表示只能容忍3.3V的电压;如果没有FT的需要接5V的电平,就需要加装电平转换电路了; 主功能
就是上电后默认的功能,一般和引脚名称相同,如果不同的话,引脚的实际功能是主功能而不是引脚名称的功能;默认复用功能
是IO口上同时连接的外设功能引脚,这个配置IO口的时候可以选择通用IO口还是复用功能;最后一个是重定义功能
,这个的作用是,如果有两个功能同时复用在了一个IO口上,而你却是需要用到这两个功能,那你可以把其中一个复用功能映射到其他端口上,当然前提是,这个重定义功能的表里有对应的端口;
接着我们来一次看一下引脚定义:
刚刚在2.6节中介绍过BOOT0和BOOT1两根引脚的功能,这个启动配置的作用就是指定程序开始运行的位置,一般情况下,程序都是在Flash程序存储器开始执行; 但是在某些情况下,我们也可以让程序在别的地方开始执行,用以完成特殊的功能;
在STM32F10xxx里,可以通过配置BOOT0和BOOT1引脚,来选择三种不同的启动模式;
最后,下面还有一段话,是在系统复位后,SYSCLK的第四个上升沿,BOOT引脚的值将被锁定,用户可以通过设置BOOT1和BOOT0引脚的状态,来选择复位后的启动模式;这个意思是,BOOT引脚的值实在上电复位后的一瞬间有效的,之后就随便了;在上一节的引脚定义中,我们可以看到,这个BOOT1和PB2是在同一个引脚上的,也就是在上电的瞬间,是BOOT1的功能,当第四个时钟过之后,就是PB2的功能了;
以上这些计时关于BOOT引脚的部分;看完了引脚定义和BOOT引脚的配置,我们对这个芯片是怎么用的,大概就有思路了。
总结:在引脚定义表里,要想让STM32正常工作,那么首先就需要把电源部分和最小系统部分的电路连接好,也就是引脚定义表中的橙色和蓝色的部分;
一般来说,我们单片机只有一个芯片是无法工作的,我们需要为他连接最基本的电路,那这些最基本的电路就叫做最小系统电路。
1、STM32及供电的部分
如上图,右边部分是STM32及供电的部分
;其中我们可以看到,这三个分区供电的主电源和模拟部分电源都连接了供电引脚,VSS都连接了GND,VDD都接在了3V3,也就是3.3V;在这个3.3V和GND之间,一般都会连接一个滤波电容,这个电容可以保证供电电压的稳定,像我们在设计电路的时候,一般只要遇到供电,都会习惯上的加上几个滤波电容;当然加这个滤波电容也是非常有必要的,大家在自己设计电路的时候可以注意一下。
剩下还有一个VBAT,是接备用电池的,如果需要接备用电池,那就可以选择一个3V的纽扣电池,正极接BVAT,负极接GND就可以了;备用电池是给RTC和备份寄存器服务的;如果不需要这些功能,就不需要接备用电池,那这个VBAT直接接3.3V即可,或者悬空也是没问题的;
以上就是整个供电的部分,可以说STM32的供电还是比较多的,而且芯片四周都有供电引脚,这个要是自己画板子的话,就会深有体会;
2、晶振部分
接着我们再来看一下晶振部分电路,上图中就是一个典型的晶振电路,在中间接了一个8MHz的主时钟晶振,STM32的主晶振一般都是8MHz,8MHz经过内部锁相环倍频,得到72MHZ的主频,这个晶振的两个引脚分别通过这两个网络标号(OSC IN和OSC OUT),接到STM32的5、6号引脚,另外还需要接两个20pF的电容,作为启震电容,电容的另一端接地即可。
这就是晶振电路,如果你需要RTC功能的话,还需要再接一个32.768KHz的晶振,电路和这个一样,接在3、4号引脚,3、4号引脚上标的OSC32就是32.768KHz晶振的意思;为什么要用32.768KHz呢?因为32768是2的15次方,内部RTC电路经过2的15次方分频,就可以生成1秒的时间信号了。
3、复位电路部分
这个复位电路是一个10K的电阻和0.1uF的电容组成,它用来给单片机提供复位信号;
其中间的NRST接在STM32的7号引脚,NRST是低电平复位的;当这个复位电路在上电的瞬间,电容是没有电的,电源通过电阻开始向电容充电,并且此时电容呈现的是短路状态,那NRST引脚就会产生低电平;当电容逐渐充满电时,电容就相当于断路,此时NRST就会被R1上拉为高电平,那上电瞬间的波形就是先低电平,然后逐渐高电平,这个低电平就可以提供STM32的上电复位信号;当然电容充电还是非常快的,所以在我们看来,单片机就在上电的一瞬间完成复位了,这就是复位电路的作用;
手动复位:
电容左边还并联了一个按键,这个按键可以提供一个手动复位的功能,当我们按下按键时,电容被放电,并且NRST引脚也通过按键被直接接地了,这就相当于手动产生了低电平复位信号;按键松手后,NRST又回归了高电平,此时单片机就从复位状态转为工作状态;平时我们也可以见到这种复位按键,一般在设备上有个小孔,当设备死机并且还不方便断电重启时,我们就可以拿个针戳一下这个小孔里的按键,看这样就会使设备复位了。这就是手动复位的功能,按下按键,程序就从头开始运行的意思。
4、启动配置
上图是启动配置,H1相当于开关的作用,拨动这个开关,就可以让BOOT引脚选择接3.3V还是GND了。
在我们这个最小系统板上,使用的是如下图所示的跳线帽来充当开关的功能,当跳线帽插在左边两个引脚时,就相当于接地;插在右边两个脚时,就相当于接3.3V;这样就可以配置BOOT的高低电平了;
5、下载端口
如果我们使用STLINK下载程序的话,那需要把SWDIO和SWCLK这两个引脚引出来方便接线,另外再把3.3V和GND引出来,这个GND是必须引出来的,3.3V如果你板子自己有供电的话,可以不引,不过建议还是都引出来,这样方便一些;
以上就是关于最小系统电路的内容了。
在资料STM32入门教程资料\模块资料\1-STM32F103C8T6核心板\STM32F103C8T6核心板原理图.pdf
中,就是我们这个最小系统板的原理图,可以比较一下跟我们上面所说的最小系统板电路图有何不同。