2.1 STM32通识
导语
学习STM32,必须使用实物进行调试,可以是开发板,也可以是套件,要把自己的程序在硬件上实现出来,这样才能进行一个有效的学习。
入门推荐使用套件(非必须,也不是广告):
STM32是ST公司基于ARM Cortex-M内核开发的32位微控制器。这个内核时ARM公司设计的,它在STM32中占据极为重要的地位(程序指令的执行,加减乘除的运算都在内核中完成),它相当于整个芯片的CPU。
在本章节的前半部分我们是使用的STM32F103C8T6:
这里的RAM就是运行内存,实际存储介质时SRAM。
这里的ROM就是程序存储器,实际存储介质时Flash闪存。
注意:如果是5V电压是不能够直接给STM32进行供电, 需要加一个稳压芯片把电压降到3.3V再给芯片供电。
外设/片上资源
STM32的外设/片上资源(Peripheral):
通过程序配置外设,来实现我们的功能。
NVIC,嵌套向量中断控制器,这个是内核里面用于管理中断的设备,比如配置中断优先级这些东西。
SysTick,系统滴答定时器,这个是内核里面的一个定时器,主要用来给操作系统提供定时服务的,STM32是可以加入操作系统的,比如FreeRTOS、UCOS等。如果用到这些操作系统,就需要SysTick提供定时来进行任务切换的功能。
RCC,复位和时钟控制,这个可以对系统的时钟进行配置,还有就是使能各模块的时钟。在STM32中,其它的这些外设在上电的情况下默认是没有时钟的,不给时钟的情况下,操作外设是无效的,外设也不会工作,这样的目的是降低功耗,所以,在操作外设之前,必须要先使能它的时钟,这就需要我们用RCC来完成时钟的使能。
GPIO,通用的IO口,我们可以用GPIO来点灯,读取按键等。
AFIO,复用IO口,它可以完成复用功能端口的重定义,还有中断端口的配置。
EXTI,外部中断,配置好外部中断后,当引脚有电平变化时,就可以触发中断,让CPU来处理任务。
TIM,定时器,这也是整个STM32最常用、功能最多的外设。TIM分为高级定时器、通用定时器、基本定时器三种类型,其中高级定时器最为复杂,常用的是通用定时器,这个定时器不仅可以完成定时中断的任务,还可以完成测频率、生成PWM波形、配置成专用的编码器接口等功能。例如PWM波形就是电机驱动、舵机驱动最基本的要求了。
ADC,模数转换器,这个STM32内置了12位的AD转换器,可以直接读取IO口的模拟电压值,无需外部连接AD芯片,使用非常方便。
DMA,直接内存访问,这个可以帮助CPU完成搬运大量数据这样的繁杂任务。
USART,同步/异步串口通信,我们平常用的UART是异步串口的意思,这里的USART是即支持异步串口,也支持同步串口,当然我们实际使用异步串口是比较多的。
I2C、SPI是非常常用的两种通讯协议,STM32也内置了它们的控制器,可以用来硬件输出时序波形,使用起来更高效,当然用通用IO口来模拟时序波形也是没有问题的。
CAN、USB,通讯协议,CAN一般用于汽车领域,USB生活中已经较为常见。利用STM32的USB外设,可以做一个模拟鼠标、模拟U盘等设备。
RTC,实时时钟,在STM32内部完成年月日、时分秒的计时功能,而且可以接外部备用电池,即使掉电也能正常运行。
CRC,CRC校验,是一种数据的校验方式,用于判断数据的正确性,有了这个外设的支持,进行CRC校验就会更加方便一些。
PWR,电源控制,可以让芯片进入睡眠模式等状态,来达到省电的目的。
BKP,备份寄存器,这是一段存储器,当系统掉电时,仍可由备用电池保持数据,这个根据需要,可以完成一些特殊功能。
IWDG、WWDG,独立看门狗和串口看门狗,当单片机因为电磁干扰死机或者程序设计不合理出现死循环时,看门狗可以及时复位芯片,保证系统的稳定。
DAC,数模转换器,它可以在IO口直接输出模拟电压,是ADC模数转换的逆过程。
SDIO,SD卡接口,可以用来读取SD卡。
FSMC,可变静态存储控制器,可以用于扩展内存,还可以配置成其他总线协议,用于某些硬件的操作。
USB OTG,USB主机接口,用OTG功能,可以让STM32作为USB主机去读取其他USB设备。
这些是STM32F1系列全部的外设,但具体到某个单独的型号有哪些外设,每个外设有几个?需要对应的数据手册进行查看,比如STM32F1C8T6的数据手册:STM32F103x8B数据手册(中文)。
芯片的命名规则
以下是以STM32F103C8T6为例:
芯片的系统结构
内核
如图所示,左上角Cortex-M3就是内核,内核引出来了三条总线,分别是ICode指令总线,DCode数据总线,System系统总线,这个ICode总线和DCode总线主要是用来连接Flash闪存的,Flash里面存储的就是我们编写的程序,ICode指令总线就是用来加载程序指令的,DCode数据总线是用来加载数据的,比如常量和调试数据这些,除了ICode总线和DCode总线,内核还引出了System系统总线,System总线就连接到了这些其他的东西上面,比如SRAM、FSMC,SRAM是用于存储程序运行时的变量数据,而FSMC现在不会用到。
AHB总线
左下角是AHB总线,AHB系统总线就是用于挂载主要的外设的,AHB的意思是先进高性能总线,挂载的一般是最基本的或者性能比较高的外设,比如复位和时钟控制这些最基本的电路和SDIO。AHB系统总线通过两个桥接,接到了APB1和APB2两个外设总线上,这个APB的意思是先进外设总线,用于连接一般的外设,因为AHB和APB的总线协议、总线速度、还有数据传送格式的差异,所以中间需要加两个桥接,来完成数据的转换和缓存。
AHB的整理性能比APB高一些,其中APB2的性能又比APB1高一些。APB2一般是和AHB用频率的,都是72MHz,APB1一般是36MHz,所以APB2连接的都是一般外设中稍微重要的部分比如GPIO端口和外设的一号选手,比如UASRT1、SPI1、TIM1、TIM8......
DMA
DMA可以看作内核CPU的小秘书,一些大量数据搬运的活,让CPU来干就太浪费时间了,比如有一个外设ADC模数转换,这个模数转换可以配置成连续模式,比如1ms转换一次,转换完的数据必须转运出来,否则数据就会被覆盖丢失,如果直接让CPU来干这个活,那CPU每过1ms就得来转运一下数据,这样会费时费力,影响CPU的正常工作,而且这个活就是简单的数据搬运,也没必要让CPU来,于是DMA这个小秘书就有用了,DMA主要就是干这些像数据搬运这样的,简单且反复要干的事情,那DMA通过DMA总线连接到总线矩阵上,他可以拥有和CPU一样的总线控制权,用于访问这些外设小弟,当需要DMA搬运数据时,外设小弟就会通过请求线发送DMA请求,然后DMA就会获得总线控制权,访问并转运数据,整个过程不需要CPU的参与,省下了CPU的时间用来干其他的事情,这就是DMA的用途。
芯片的引脚定义
标红色的是电源相关的引脚,标蓝色的是最小系统相关的引脚,标绿色的是IO口、功能口这些引脚。
类型:S代表电源,I代表输入,O代表输出,IO代表输入输出。
IO口电平:代表IO口所能容忍的电压。FT代表它能容忍5V的电压。没有FT的只能容忍3.3V的电压。如果没有FT的需要接5V的电平,就需要加装电平转换电路了。
STM32启动配置
启动配置便是BOOT0和BOOT1两根引脚的功能,启动配置的作用就是指定程序开始运行的位置,一般情况下,程序都是在Flash程序存储器开始执行,但是在某些形况下,我们也可以让程序在别的地方开始执行,用以完成特殊的功能。
例如,在STM32F10XXX里,可以通过BOOT0\BOOT1引脚来选择三种不同的启动模式,当BOOT0引脚为0,也就是接地的意思,这个时候BOOT1接X,就是无论接什么,启动模式都是在主闪存存储器的模式,这时候主闪存存储器被选为启动区域,也就是正常的执行Flash闪存里面的程序,这个模式是最常用的模式,一般情况下都是这个配置。
BOOT1接0,BOOT0接1,接1就是接到3.3V电源正的意思,那启动模式就是系统存储器,说明系统存储器被选为启动区域,其实这个模式就是用来做串口下载用的,这个系统存储器存的就是STM32中的一段BootLoder程序,BootLoder程序的作用就是接收串口的数据,然后刷新到主闪存中,这样就可以使用串口下载程序了,一般我们需要串口下载程序的时候会配置到这个模式上。
BOOT1接1,BOOT0接1,这时配置的是内置SRAM启动,这个模式主要是用来进行程序调试的。
BOOT引脚的值是在上电复位后的一瞬间有效,之后就随便了,也就是在上电的瞬间,PB2是BOOT1的功能,当第4个时钟后就是Pb2的功能了。
STM32最小系统电路
一般来说,我们单片机只有一个芯片是无法进行工作的,我们需要为它连接最基本的电路,这些最基本的电路就叫做最小系统电路。
供电电路
可以看到在3.3V和GND之间会连接一个滤波电容,这个电容可以保证供电电压的稳定,像我们在设计电路的时候,一般只要遇到供电,就会习惯的加上几个滤波电容。
VBAT是用来接备用电池的,3V的纽扣电池正极接VBAT,负极接GND就可以了,备用电池是给RTC和备份寄存器服务的,如果不需要这些功能,就不用接备用电池,那VBAT直接接3.3V即可,或者悬空也是没问题的。
晶振电路
晶振电路在这里接了一个8Mhz的主时钟晶振,STM32的主晶振一般都是8MHz,8MHz经过内部的锁相环倍频,得到72MHz的主频。这个晶振的两根引脚分别通过OSC IN、OSC OUT这两个网络编号,接到STM32的5、6号引脚,另外还需要接两个20pF的电容,作为启震电容,电容的另一端接地即可。
如果你需要RTC功能的话,还需要再接一个32.768KHz的晶振,电路和这个一样,接在3、4号引脚上,OSC32就是32.768KHz晶振的意思,为什么要用32.768KHz的晶振呢?因为32768是2的15次方,内部RTC电路经过2的15次方分频,就可以生成1秒的时间信号了
复位电路
复位电路是一个10k的电阻和0.1uF的电容组成的,它用来给单片机提供复位信号,这中间的NRST接在STM32的7号引脚上,NRST是低电平复位的,当这个复位电路在上电的瞬间,电容是没有电的,电源通过电阻开始向电容充电,并且此时电容呈现的是短路状态,那NRST引脚就会产生低电平,当电容逐渐充满电时,电容就相当于断路,此时NRST就会被R1上拉为高电平。
所以,上电的瞬间的波形就是先低电平,然后逐渐高电平,这个低电平就可以提供STM32的上电复位信号,当然电容充电还是非常快的,所以在我们看来,单片机就在上电的一瞬间就复位了。
电容的左边还提供一个复位按键,提供一个手动的复位功能,当我们按下按键时,电容被放电,并且NRST引脚也通过按键被直接接地了,这就相当于手动产生了低电平复位信号,按键松下后,NRST又回归高电平,此时单片机就从复位状态转为工作状态。
启动配置
H1相当于开关的作用,拨动这个开关,就可以让BOOT引脚选择接3.3V还是GND了,在最小系统板上,使用的是跳线帽来充当开关的。
当跳线帽插在左边两个脚时,就相当于接地:
当跳线帽插在右边两个脚时,就相当于接3.3V:
这样就可以配置BOOT的高低电平了。
下载端口
如果你是STLINK下载程序的话,那需要把SWDIO和SWCLK这两个引脚引出来方便接线,另外再把3.3V和GND引出来,这个GND是必须引出来的,3.3V如果自己的板子有供电的话可以不引。




