# STM32 简介
STM32 是 ST 公司基于 ARM Cortex-M 内核开发的 32 位微控制器
STM32 常应用在嵌入式领域,如智能车、无人机、机器人、无线通信、物联网、工业控制、娱乐电子产品等
STM32 功能强大、性能优异、片上资源丰富、功耗低,是一款经典的嵌入式微控制器
# ARM
ARM 既指 ARM 公司,也指 ARM 处理器内核
ARM 公司是全球领先的半导体知识产权(IP)提供商,全世界超过 95% 的智能手机和平板电脑都采用 ARM 架构
ARM 公司设计 ARM 内核,半导体厂商完善内核周边电路并生产芯片
# STM32F103C8T6
# 参数
系列:主流系列 STM32F1
内核:ARM Cortex-M3
主频:72MHz
RAM:20K(SRAM)
ROM:64K(Flash)
供电:2.0~3.6V(标准 3.3V)
封装:LQFP48
# 外设
英文缩写 | 名称 | 英文缩写 | 名称 |
---|---|---|---|
NVIC | 嵌套向量中断控制器 | CAN | CAN |
SysTick | 系统滴答定时器 | USB | USB |
RCC | 复位和时钟控制 | RTC | 实时时钟 |
GPIO | 通用 | CRC | CRC |
AFIO | 复用 | PWR | 电源控制 |
EXTI | 外部中断 | BKP | 备份寄存器 |
TIM | 定时器 | IWDG | 独立看门狗 |
ADC | 模数转换器 | WWDG | 窗口看门狗 |
DMA | 直接内存访问 | DAC | 数模转换器 |
USART | 同步 | SDIO | SD |
I2C | I2C | FSMC | 可变静态存储控制器 |
SPI | SPI | USB OTG | USB |
# 命名规则
# 系统结构
三条总线:ICode 指令总线(加载程序指令)、DCode 数据总线(加载数据,比如常量和调试数据)、System 系统总线。
ICode 与 DCode 总线主要用来连接 flash 闪存(flasH 存储的是编写的程序),SRAM 用于存储程序运行时的变量数据
AHB(先进高性能总线)系统总线用于挂载主要的外设(挂载最基本或者性能比较高的外设,比如复位和时钟控制这些基本的电路,SDIO 也是挂载在 AHB 上的。
中间有两个桥接,接到了 APB1(先进外设总线)和 APB2 两个外设总线上(用来连接一般的外设)。由于 AHB 和 APB 的总线协议、总线速度还有数据传输格式的差异,所以中间需要加两个桥接来完成数据的转换和缓存。AHB 的整体性能比 APB 高一些,APB2 的性能比 APB1 高一些。
APB2 一般和 AHB 同频率都是 72MHz,APB1 一般是 36MHz,所以 APB2 连接的一般是外设中稍微重要的部分(例如 GPIO 端口,还有一些外设的一号选手,比如 USART1、SPI1、TIM1、TIM8(高级定时器)、ADC、EXTI、AFIO),APB1 连接次要一点的外设 2、3、4 号外设,还有 DAC、PWR、BKP 等。实际上基本感知不到两条总线的差异。
DMA 是 CPU 的小秘书,比如一些大量的数据搬运这样简单且重复干的事情,让 CPU 来干会浪费时间。DMA 通过 DMA 总线连接到总线矩阵上,可以拥有和 CPU 一样的总线控制权,用于访问外设小弟,当需要 DMA 搬运数据时,外设就会通过请求线发送 DMA 请求,然后 DMA 就会获的总线控制权,访问并转运数据,整个过程不需要 CPU 的参与,省下了 CPU 的时间来干其他事情。
# 引脚定义
# STM32F103C8T6 引脚定义表
引脚号 | 引脚名称 | 类型 | I/O 口电平 | 主功能 | 默认复用功能 | 重定义功能 | 引脚类型 |
---|---|---|---|---|---|---|---|
1 | VBAT | S | VBAT | 电源相关引脚 | |||
2 | PC13-TAMPER-RTC | I/O | PC13 | TAMPER-RTC | IO 口 | ||
3 | PC14-OSC32_IN | I/O | PC14 | OSC32_IN | IO 口 | ||
4 | PC15-OSC32_OUT | I/O | PC15 | OSC32_OUT | IO 口 | ||
5 | OSC_IN | I | OSC_IN | 最小系统相关引脚 | |||
6 | OSC_OUT | O | OSC_OUT | 最小系统相关引脚 | |||
7 | NRST | I/O | NRST | 最小系统相关引脚 | |||
8 | VSSA | S | VSSA | 电源相关引脚 | |||
9 | VDDA | S | VDDA | 电源相关引脚 | |||
10 | PA0-WKUP | I/O | PA0 | WKUP/USART2_CTS/ADC12_IN0/TIM2_CH1_ETR | IO 口 | ||
11 | PA1 | I/O | PA1 | USART2_RTS/ADC12_IN1/TIM2_CH2 | IO 口 | ||
12 | PA2 | I/O | PA2 | USART2_TX/ADC12_IN2/TIM2_CH3 | IO 口 | ||
13 | PA3 | I/O | PA3 | USART2_RX/ADC12_IN3/TIM2_CH4 | IO 口 | ||
14 | PA4 | I/O | PA4 | SPI1_NSS/USART2_CK/ADC12_IN4 | IO 口 | ||
15 | PA5 | I/O | PA5 | SPI1_SCK/ADC12_IN5 | IO 口 | ||
16 | PA6 | I/O | PA6 | SPI1_MISO/ADC12_IN6/TIM3_CH1 | TIM1_BKIN | IO 口 | |
17 | PA7 | I/O | PA7 | SPI1_MOSI/ADC12_IN7/TIM3_CH2 | TIM1_CH1N | IO 口 | |
18 | PB0 | I/O | PB0 | ADC12_IN8/TIM3_CH3 | TIM1_CH2N | IO 口 | |
19 | PB1 | I/O | PB1 | ADC12_IN9/TIM3_CH4 | TIM1_CH3N | IO 口 | |
20 | PB2 | I/O | FT | PB2/BOOT1 | 最小系统相关引脚 | ||
21 | PB10 | I/O | FT | PB10 | I2C2_SCL/USART3_TX | TIM2_CH3 | IO 口 |
22 | PB11 | I/O | FT | PB11 | I2C2_SDA/USART3_RX | TIM2_CH4 | IO 口 |
23 | VSS_1 | S | VSS_1 | 电源相关引脚 | |||
24 | VDD_1 | S | VDD_1 | 电源相关引脚 | |||
25 | PB12 | I/O | FT | PB12 | SPI2_NSS/I2C2_SMBAI/USART3_CK/TIM1_BKIN | IO 口 | |
26 | PB13 | I/O | FT | PB13 | SPI2_SCK/USART3_CTS/TIM1_CH1N | IO 口 | |
27 | PB14 | I/O | FT | PB14 | SPI2_MISO/USART3_RTS/TIM1_CH2N | IO 口 | |
28 | PB15 | I/O | FT | PB15 | SPI2_MOSI/TIM1_CH3N | IO 口 | |
29 | PA8 | I/O | FT | PA8 | USART1_CK/TIM1_CH1/MCO | IO 口 | |
30 | PA9 | I/O | FT | PA9 | USART1_TX/TIM1_CH2 | IO 口 | |
31 | PA10 | I/O | FT | PA10 | USART1_RX/TIM1_CH3 | IO 口 | |
32 | PA11 | I/O | FT | PA11 | USART1_CTS/USBDM/CAN_RX/TIM1_CH4 | IO 口 | |
33 | PA12 | I/O | FT | PA12 | USART1_RTS/USBDP/CAN_TX/TIM1_ETR | IO 口 | |
34 | PA13 | I/O | FT | JTMS/SWDIO | PA13 | 最小系统相关引脚 | |
35 | VSS_2 | S | VSS_2 | 电源相关引脚 | |||
36 | VDD_2 | S | VDD_2 | 电源相关引脚 | |||
37 | PA14 | I/O | FT | JTCK/SWCLK | PA14 | 最小系统相关引脚 | |
38 | PA15 | I/O | FT | JTDI | TIM2_CH1_ETR/PA15/SPI1_NSS | IO 口 | |
39 | PB3 | I/O | FT | JTDO | PB3/TRACESWO/TIM2_CH2/SPI1_SCK | IO 口 | |
40 | PB4 | I/O | FT | NJTRST | PB4/TIM3_CH1/SPI1_MISO | IO 口 | |
41 | PB5 | I/O | PB5 | I2C1_SMBAI | TIM3_CH2/SPI1_MOSI | IO 口 | |
42 | PB6 | I/O | FT | PB6 | I2C1_SCL/TIM4_CH1 | USART1_TX | IO 口 |
43 | PB7 | I/O | FT | PB7 | I2C1_SDA/TIM4_CH2 | USART1_RX | IO 口 |
44 | BOOT0 | I | BOOT0 | 最小系统相关引脚 | |||
45 | PB8 | I/O | FT | PB8 | TIM4_CH3 | I2C1_SCL/CAN_RX | IO 口 |
46 | PB9 | I/O | FT | PB9 | TIM4_CH4 | I2C1_SDA/CAN_TX | IO 口 |
47 | VSS_3 | S | VSS_3 | 电源相关引脚 | |||
48 | VDD_3 | S | VDD_3 | 电源相关引脚 |
拿到一个芯片时,需要着重的看一下它的引脚定义
让 STM32 正常工作,首先将电源部分和最小系统部分的电路连接好。
S 代表电源、I 代表输入、O 代表输出,IO 代表输入输出。
IO 口电平代表 IO 口所能容忍的电压,FT 代表容忍 5V 的电压,没有 FT 的智能容忍 3.3V 电压(如果没有 FT,需要接 5V 的电平,需要加装电平转换电路)。
主功能就是上电后默认的功能,一般和引脚名称相同。如果不同的话引脚的实际功能是主功能而不是引脚名称的功能。
默认复用功能是 IO 口上同时连接的外设功能引脚,配置 IO 口时可以选择是通用 IO 口还是复用功能。
重定义功能作用是如果有两个功能同时复用在了一个 IO 口上,而且确实需要用到这两个功能,可以将其中一个复用功能重映射到其他端口上(前提是,这个重定义功能的表里有对应的端口)。
优先使用加粗的 IO 口,没有加粗的 IO 口可能需要进行配置或者兼具其他功能。
1 引脚 VBAT 是备用电池供电引脚,可接 3V 电池,当系统电源断电时,备用电池可给内部的 RTC 时钟和备份寄存器提供电源。
2 引脚是 IO 口或侵入检测或 RTC,IO 口可以根据程序输出或读取高低电平。侵入检测可以用来做安全保障的功能(比如你的产品安全性比较高,可以在外壳加一些防拆的触电,然后接上电路到这个引脚上,若有人强行拆开设备,则触电断开,这个引脚的电平变化就会触发 STM32 的侵入信号,然后就会清空数据来保证安全)。RTC 的引脚可以用来输出 RTC 校准时钟、RTC 闹钟脉冲或者秒脉冲。
3、4 引脚是 IO 口或者接 32.768KHz 的 RTC 晶振。
5、6 号引脚接系统的主晶振,一般是 8MHz,然后芯片内有锁相环电路,可以对这个 8MHz 的频率进行倍频,最终产生 72Mhz 的频率作为系统的主时钟。
7 引脚 NRST 是系统复位引脚,N 代表是低电平复位。
8、9 引脚是内部模拟部分的电源,比如 ADC、RC 振荡器等。VSS 是负极,接 GND,VDD 是正级,接 3.3V。
10~19 号引脚都是 IO 口,其中 PA0 还兼具了 WKUP 功能(可以用于唤醒处于待机模式的 STM32)。
20 号引脚是 IO 口或 BOOT1 引脚,BOOT 引脚是用来配置启动模式的。
21、22 引脚是 IO 口。
23、24 引脚是 VSS_1 和 VDD_1 是系统的主电源口,同样的 VSS 是负极,VDD 是正级。
下面的 VSS_2 和 VDD_2 以及 VSS_3 和 VDD_3 都是系统的主电源口,这里 STM32 内部采用分区供电的方式,所以供电口比较多,在使用时,把 VSS 都接 GND,VDD 都接 3.3V 即可。
25~33 引脚都是 IO 口。
34~40 引脚再加 27 号引脚,都是 IO 口或者调试端口,默认功能是调试端口(用来调试程序和下载数据),这个 STM32 支持 SWD(需要两根线,分别是 SWDIO 和 SEDLK)和 JTAG (需要五根线,分别是 JTMS、JTCK、JTDL、JTDO、NJTRST)两种调试方式。
STLINK 调试程序用的是 SWD 方式(只需占用 PA13 和 PA14 这两个 IO 口,剩下的 PA15、PB3、PB4 可以切换为普通的 IO 口使用(需在程序中配置,不配置的话默认是不会用作 IO 口的)。
41、42、43、45、46 引脚都是 IO 口。
44 引脚 BOOT0 和 BOOT1 一样用来做启动配置。
# 启动配置
启动配置的作用是指定程序开始运行的位置,一般情况下,程序都是在 FLASH(主闪存存储器)程序存储器开始执行。
接 0 表示接地,接 1 表示接到 3.3V 电源正的意思。
系统存储器这个模式就是用来做串口下载的,这个系统存储器存的就是 STM32 中的一段 BootLoader 程序(BootLoader 程序作用就是接受串口的数据,然后刷新到主闪存中,这样就可以使用串口下载程序)。
一般需要串口下载程序时(当没有调试接口时,这时需要用到串口的方式下载程序)需要配置到系统存储器启动模式
内置 SRAM 模式主要用来进行程序的调试。 BOOT 引脚的值是在上电复位后的一瞬间有效的,之后就随便了。例如 20 引脚在上电瞬间是 BOOT1 的功能,当第四个时钟过之后就是 PB2 的功能了。
# 最小系统电路
一般来说,单片机只有一个芯片是无法正常工作的,需要连接最基本的电路(最小系统电路)。
供电部分,VSS 都连接了 GND,VDD 都连接了 3.3V。在这个 3.3V 和 GND 之间,一般会连接一个滤波电容(这个电容可以保证电压的稳定),一般只要遇到供电,都会习惯上加上几个滤波电容。VBAT 是接备用电池的。可以选择一个 3V 的纽扣电池,正极接 VBAT,负极接 GND。备用电池是给 RTC 和备份寄存器服务的
晶振部分,接一个 8MHz 的主时钟晶振(8MHz 经过内部锁相环倍频,得到 72Mhz 的主频)。这个晶振的两根引脚分别通过两个网络标号接到 STM32 的 5、6 号引脚,还需接两个 20PF 的电容,作为启震电容,电容的另一端接地即可。若需 RTC 功能还需再接一个 32.768KHz 的晶振,电路和这个一样,接在 3、4 号引脚,OSC32 就是 32.768KHz 晶振的意思。(因为 32.768 是 2 的 15 次方,内部 RTC 经过 2 的 15 次方分频就可以生成 1 秒的时间信号)。
复位电路部分是一个 10k 的电阻和 0.1uf 的电容组成,用来给单片机提供复位信号,NRST 接在 STM32 的 7 号引脚。复位电路上电瞬间的波形是先低电平,然后逐渐高电平。NRST 是低电平复位的(当复位电路上电的瞬间,电容是没有电的),电源通过电阻开始向电容充电,并且此时电容呈现的是短路状态(NRST 引脚就会产生低电平)。当电容逐渐充满电时,电容就相当于断路,此时 NRST 就会被 R1 上拉为高电平。(低电平提供 STM32 的上电复位信号)。
按键提供一个手动复位的功能,当按下按键,电容放电,并且 NRST 引脚也通过按键直接接地了,这就相当于手动产生了低电平复位信号,按键松手后,NRST 又回归高电平,此时单片机从复位状态转为工作状态。复位,程序就从头开始运行。
启动配置部分,H1 相当于开关的作用(拨码开关 / 插跳线帽),拨动开关就可以让 BOOT 引脚选择接 3.3V 还是 GND 了。
下载端口部分,若使用 STLINK 下载程序,需将 SWDIO 和 SWDLK 这两个引脚引出来方便接线,另外将 3.3V 和 GND 引出来。