1. 实验平台搭建
1.1 硬件设备
- STM32 面包板入门套件
- Windows 电脑
- 万用表、示波器、镊子、剪刀等
- 万用表:可以很方便的检查(测试)电路的连接情况,使用面包板搭建电路可能存在接错线或者接触不良的情况。
- 示波器:可以测出引脚的电压波形变化,在 PWM 实验或者通信协议的实验,能看到波形,对我们调试程序将会有很大的帮助。
- 镊子、剪刀:方便面包板插线。
1.2 软件设备
Keil5 MDK
软件安装步骤:
- 安装 Keil5 MDK
- 安装器件支持包(Keil5之后,芯片的器件支持包独立了出来,开发哪种芯片,就按照对应的支持包即可)
- 软件注册
- 安装 STLINK 驱动
- 安装 USB 转串口驱动
2. STM32 简介
2.1 STM 32 介绍
STM32 是 ST 公司基于(ARM公司开发的) ARM Cortex-M 内核开发的 32 位微控制器。常用在嵌入式领域,如智能车、无人机、机器人、无线通信、物联网、工业控制、娱乐电子产品等。
STM32 功能强大、性能优异、片上资源丰富、功耗低、是一款经典的嵌入式微控制器。
分为 高性能、主流、低功耗和无线四个系列。
2.2 ARM 介绍
ARM 既指 ARM 公司,也指 ARM 处理器内核。ARM 公司是全球领先的半导体知识产权(IP)提供商,全世界超过 95 % 的智能手表和平板电脑都采用 ARM 架构。
ARM 公司设计 ARM 内核,半导体产商完善内核周边电路并生产芯片。
分为 A、R、M三个系列,分别应用于不同的领域:
- A(Application):主要应用于手机领域,是 ARM 内核中性能最高,发展最快的系列。
- R(RealTime):主要应用于实时性很高的场景,比如硬盘控制器等,应用场景较小。
- M(Microcontroller):主要应用于单片机领域,如 STM32 等。
3 STM32F103C8T6
- 系列:主流系列 STM32F1
- 内核:ARM Cortex-M3
- 主频:72MHz
- RAM(运行内存):20K(实际存储介质:SRAM)
- ROM(程序存储器):64K(实际存储介质:Flash)
- 供电:2.0~3.6V(标准3.3V)
- 封装:LQFP48(共 48 个引脚)
注意:51 单片机使用的是 5V 供电,还有 USB 的输出电压也是 5V,不能直接给 STM32 供电,需要加一个稳压芯片,把电压降至 3.3V,再给 STM32 供电。
3.1 片上资源/外设(Peripheral)
STM32F1 整个系列的所有外设:(并不是所有型号都拥有全部外设,C8T6 没有最后四个外设)
英文缩写 | 名称 | 英文缩写 | 名称 |
---|---|---|---|
NVIC | 嵌套向量中断控制器 | CAN | CAN通信 |
SysTick | 系统滴答定时器 | USB | USB通信 |
RCC | 复位和时钟控制 | RTC | 实时时钟 |
GPIO | 通用IO口 | CRC | CRC校验 |
AFIO | 复用IO口 | PWR | 电源控制 |
EXTI | 外部中断 | BKP | 备份寄存器 |
TIM | 定时器 | IWDG | 独立看门狗 |
ADC | 模数转换器 | WWDG | 窗口看门狗 |
DMA | 直接内存访问 | DAC | 数模转换器 |
USART | 同步/异步串口通信 | SDIO | SD卡接口 |
I2C | I2C通信 | FSMC | 可变静态存储控制器 |
SPI | SPI通信 | USB OTG | USB主机接口 |
标记 是位于 Cortex-M3 内核里面的外设。剩下的是内核外的外设。
- NVIC:内核里面用于管理中断的设备,比如配置中断优先级等
- SysTick:给操作系统提供定时服务来进行任务切换功能,STM32 可以加入操作系统,如 FreeRTOS、UCOS 等。(我们用定时器完成 Delay 函数的功能做演示)
- RCC:对系统的时钟进行配置,使能各模块的时钟。
在 STM32 中,其他的这些外设在上电的情况下默认是没有时钟的。不给时钟的情况下,操作外设是无效的,外设也不会工作,这样的目的是降低功耗,所有在操作外设之前,必须要先使能它的时钟。
- GPIO:通用 IO 口,可以用 GPIO 来点灯,读取按键等,是单片机最基础的功能。
- AFIO:可以完成复用功能端口的重定义,还有中断端口的配置。
- EXTI:当引脚有电平变化时,就可以触发中断,让 CPU 来处理任务。
- TIM:整个 STM32 最常用,功能最多的外设。
TIM 分为高级定时器,通用定时器,基本定时器三种类型,其中高级定时器最为复杂,常用的是通用定时器,这个定时器不仅可以完成定时中断的任务,还可以完成测频率、生成 PWM 波形、配置成专用的编码器接口等功能,像 PWM 波形,就是我们电机驱动、舵机驱动最基本的要求了。
- ADC:STM32 内置了 12 位的 AD 转换器,可以直接读取 IO 口的模拟电压值,无需外部连接 AD 芯片,使用非常方便。
- DMA:可以帮助 CPU 完成搬用大量数据这样的繁杂任务。
- USART:UART 是异步串口,实际用 异步串口 比较多。
- I2C 与 SPI:STM32 内置了它们的控制器,可以用硬件来输出时序波形,使用起来更高效,当然用通用 IO 口来模拟时序波形也没问题。
- CAN:一般用于汽车领域。
- USB:利用 STM32 的 USB 外设,可以做一个模拟鼠标,模拟 U 盘等设备。
- RTC:在 STM32 内部完成年月日、时分秒的计时功能;可以接外部备用电池,即使掉电也能正常运行。
- CRC:一种数据检验方式,用于判断数据的正确性。
- PWR:可以让芯片进入睡眠模式等状态,来达到省电的目的。
- BKP:一段存储器,当系统掉电时,仍可由备用电池保持数据;根据需要,可以完成一些特殊功能。
- IWDG / WWDG:当单片机因为电磁干扰死机或者程序设计不合理出现死循环时,看门狗可以及时复位芯片,保证系统的稳定。
- DAC:可以在 IO 口直接输出模拟电压,是 ADC 模数转换的逆过程。
- SDIO:可以用来读取 SD 卡。
- FSMC:可以用于扩展内存或者配置成其他总线协议,用于某些硬件的操作。
- USB OTG:用 OTG 功能,可以让 STM32 作为 USB 主机去读取其他 USB 设备。
3.2 芯片的命名规则
6 代表温度范围:
- 6 = 工业级温度范围,-40℃~85℃
- 7 = 工业级温度范围,-40℃~105℃
3.3 芯片系统结构
- Cortex-M3 内核引出来三条总线:ICode指令总线,DCode数据总线,System系统总线。
- ICode 总线和 DCode 总线主要是用来连接 Flash 闪存的。Flash里面存储我们编写的程序。
- ICode 指令总线用来加载程序指令的。
- DCode数据总线用来加载数据的,比如常量和调试参数这些。
- System系统总线连接到了其他东西上面。
- 总线矩阵:
- SRAM:用于存储程序运行时的变量数据。
- FSMC:
- AHB系统总线(又称先进高性能总线):用于挂载最基本的或者性能比较高的外设的。比如复位和时钟控制这些最基本的电路,还有 SDIO。
- 两个桥接,接到了 APB2 和 APB1 两个外设总线上,包含了外设种类和分布。(由于 AHB 和 APB 的总线协议、总线速度、还有数据传送格式的差异,所以中间需要加两个桥接,来完成数据转换和缓存。)
- AHB 的整体性能比 APB 高一些,APB2的性能又比 APB1 高一些。(AHB 与 APB2 同频率,都是 72MHz,APB1 一般是 36MHz)
- APB:先进外设总线,用于连接一般的外设。
- APB2 连接的都是一般外设中稍微重要的部分,比如 GPIO 端口,还有外设的一号选手等,这里TIM8和TIM1一样也是高级定时器,所以也是重要的外设。还有 ADC、EXTI、AFIO。
- 其他的 2、3、4、5号外设,还有 DAC、PWR、BKP等,这些是次要一点的外设,都会分配到 APB1 上去。
- 在使用的时候,一般感觉不到 APB2 和 APB1 的性能差异。
- DMA:当作内核 CPU 的小秘书,主要就是干像数据搬运这样简单且反复要干的事情,DMA通过 DMA 总线连接到总线矩阵上,可以拥有和 CPU 一样的总线控制权,用于访问这些外设。
- 当需要DMA搬运数据时,外设就会通过请求线发送 DMA 请求,然后 DMA 获得总线控制权,访问并转运数据,整个过程不需要 CPU 参与。
3.4 引脚定义
标红色的是电源相关(S)的引脚,标蓝色的是最小系统相关的引脚,标绿色的是 IO 口、功能口这些引脚。
如果想要 STM32 正常工作,首先就需要把电源部分和最小系统部分的电路连接好。
- FT代表能容忍 5V 电压,没有只能容忍 3.3V 电压,没有 FT 需要接 5V 的电平需要加装电平转换电路了。
- 主功能,上电后默认的功能,一般与引脚名称相同,不同的话实际功能以主功能为准。
- 默认复用功能是 IO 口上同时连接的外设功能引脚。配置 IO 口时可以选择是通用 IO 口还是复用功能。
- 重定义功能:如果有两个功能同时复用在了一个 IO 口上,而确实用到这两个功能,可以把其中一个复用功能重映射到其他端口上。
- 1:备用电池供电的引脚,可以接一个 3V 的电池。当系统电源断电时,备用电池可以给内部的 RTC 时钟和备份寄存器提供电源。
- 2:IO 口(根据程序输出或读取高低电平,最基本最常用)或侵入检测(用来做安全保障的功能)或 RTC(输出 RTC校准时钟、RTC闹钟脉冲或者秒脉冲)
比如产品安全性比较高,可以在外壳加一些防拆的触点,然后接上电路到这个引脚;如果有人强拆设备,那触点断开,这个引脚电平变化,就会触发 STM32 的侵入信号,然后清空数据来保证安全。
- 3、4:IO 口 或 32.768KHz 的 RTC 晶振。
- 5、6:接系统的主晶振,一般是 8 MHz,芯片内有锁相环电路,可以对这个 8 MHz 的频率进行倍频。最终产生 72 MHz的频率,作为系统的主时钟。
- 7:系统复位引脚,N代表它是低电平复位的。
- 8、9:内部模拟部分电源,比如 ADC、RC 震荡器等。VSS是负极,接 GND,VDD是正极,接 3.3V。
- 10~19:IO口,PA0 还兼具 WKUP 的功能,可以用于唤醒处于待机模式的 STM32。推荐优先使用加粗的 IO 口。没有加粗可能需要配置/兼具其他功能。
- 20/44:IO口 或者 BOOT1/BOOT0 引脚,用于配置启动模式的。
- 21、22:IO口。
- 23、24:系统的主电源口。同样VSS是负极,VDD是正极。
- 35、36、47、48:都是主电源口,STM32 内部采用了分区供电的方式,所以供电口比较多,使用时,VSS都接 GND,VDD都接 3.3V 即可。
- 25~33:都是 IO 口。
- 34、37~40:IO口或者调试端口,默认主功能是 调试端口,用来调试程序和下载程序。
STM32 支持 SWD 和 JTAG 两种调试方式。
- SWD 需要两根线,分别是 SWDIO 和 SWCLK
- JTAG 需要五根线,分别是 JTMS、JTCK、JTDI、JTDO、NJTRST。
使用 STLINK 来下载调试程序,用的是 SWD 方式。其他 三个端口可以当作普通 IO 口使用,但在要程序中配置,不配置的话默认是不会用作 IO 口的。
- 41~43、45、46:都是 IO 口。
3.5 启动配置
作用:指定程序开始运行的位置。
一般情况下,程序都是在 Flash 程序存储器开始执行(配置1),这种模式是最常用的模式,一般情况下都是这个配置。但是在某些情况下,我们也可以让程序在别的地方开始执行,用以完成特殊的功能。
- 配置2:做串口下载用的。这个系统存储器存的是 STM32 中的一段 BootLoader 程序,BootLoader 程序的作用就是接收串口的数据,然后刷新到主闪存中,这样就可以使用串口下载程序了。
- 如果调试端口全部变成普通 IO 口,就下载不进行程序了,就需要用到串口的方式下载程序。
- 如果没有 STLINK,也没有 JLINK,就可以使用串口来进行下载程序。
- 配置3:主要用来进行程序调试的,现阶段用的比较少。
BOOT 引脚的值是在上电复位后的一瞬间有效的,之后就随便了;如 20 号引脚,BOOT1 和 PB2 在同一块引脚上,也就是在上电的瞬间,是 BOOT1 的功能,当第 4 个时钟过后,就是 PB2 的功能。
3.6 最小系统电路
- STM32 及供电
- 三个分区供电的主电源和模拟部分电源都连接了供电引脚。VSS 都连接了 GND,VDD 都连接了 3.3V。
- 3.3V 与 GND 之间连接一个滤波电容(非常必要),可以保证供电电压的稳定。我们在设计电路的时候,一般只要遇到供电,都会习惯上加上几个滤波电容。
- VBAT 接备用电池(接3.3V/悬空)。备用电池是给 RTC 和备份寄存器服务的。(不需要可以不接)
- 芯片四周都有供电引脚,自己画板子的话走线还是很头疼的。但还是要把供电都接好
- 晶振电路
- 接了一个 8 MHz 的主时钟晶振,STM32的主晶振一般都是 8 MHz。8 MHz 经过内部锁相环倍频,得到 72 MHz 的主频。
- 晶振的两个引脚分别通过这两个网络标号,接到 STM32 的 5、6 号引脚(PC14 + PC15)。
- 另外还需要接两个 20pF 的电容,作为启震电容,电容的另一端接地即可。
- 接了 1M 的电阻,有一些作用。(也可以不接)
- 如果需要 RTC 功能的话,还需要再接一个 32.768 KHz 的晶振(OCS32),电路跟这个一样,接在 3、4 号引脚(OSCIN + OSCOUT)。
32768 是 2 的 15 次方,内部 RTC 电路经过 2 的 15 次方分频,就可以生成 1 秒的时间信号了。
- 复位电路
- 一个 10k 的电阻 和 0.1μF 的电容组成的,用来给单片机提供复位信号。
- NRST 接在 STM32 的 7 号引脚,NRST 是低电平复位,当这个复位电路在上电的瞬间,电容是没有电的,电源通过电阻开始向电容充电,并且此时电容呈现的是短路状态,那 NRST 引脚就会产生低电平;当电容逐渐充满电时,电容就相当于断路,此时 NRST 就会被 R1 上拉为 高电平。
- 上电瞬间的波形就是先低电平,然后逐渐高电平,这个低电平就可以提供 STM32 的上电复位信号。
- 电容充电非常快,在我们看来,单片机就在上电一瞬间就复位了。
- 电容并联一个按键,这个可以提供一个手动复位的功能,当我们按下按键时,电容被放电,并且 NRST 引脚也通过按键被直接接地了。这就相当于手动产生了低电平复位信号。按键松手后,NRST 又回归高电平,此时单片机就从复位状态转为工作状态。
- 平时我们可以见到这种复位按键,一般在设备上有个小孔,当设备死机并且还不方便断电重启时,就可以拿一根针戳一下这个小孔里的按键,这样就会使设备复位了。
- 手动复位功能:按下按键,程序从头开始执行。
- 启动配置
- H1相当于开关的作用,拨动这个开关,就可以让 BOOT 引脚选择 3.3V 还是 GND 了,可以使用跳线帽来充当开关的功能(插在左边两个脚时,相当于接地,插在右边两个脚时,相当于 3.3 V,这样就可以配置 BOOT 高低电平了)
- 自己设计电路,接一个拨码开关也没问题。
- 下载端口
- 如果使用 STLINK 下载程序的话,需要把 SWDIO 和 SWCLK 这两个引脚引出来方便接线。
- 另外再把 3.3V 和 GND 引出来,这个 GND 是必须引出来的,3.3V 如果板子自己有供电的话,可以不引;建议都引出来,这样方便一些。
- 启动配置
- H1相当于开关的作用,拨动这个开关,就可以让 BOOT 引脚选择 3.3V 还是 GND 了,可以使用跳线帽来充当开关的功能(插在左边两个脚时,相当于接地,插在右边两个脚时,相当于 3.3 V,这样就可以配置 BOOT 高低电平了)
- 自己设计电路,接一个拨码开关也没问题。
- 供电也加了电源滤波,作用也是稳定供电的。
- 两个测试 LED
- 一个直接接到 VCC3V3 和 GND,是电源指示灯。
- 另一个接到了 PC13,这是一个 IO 口测试灯。
- 稳压芯片
- 给 5 V 的电降到 3.3 V,给 STM32 供电。
- 左边的输入是 USB 的 5V 电源,右边输出是 3.3V
- 两排引脚排针
- 把芯片的引脚都引出来,方便我们接线。
- USB 接口
- 接 PA11 和 PA12 是 STM32的 USB 引脚,可以进行 USB 通信。
- 另外这个 USB 还可以提供 5 V 的供电,这个电经过稳压芯片,降到 3.3V,其他电路都是 3.3V 供电。