一、什么是单片机
单片机(Single-Chip Microcomputer)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器 RAM、只读存储器 ROM、多种 I/O 口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D 转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统。
二、什么是STM32单片机
STM32,从字面上来理解,ST 是意法半导体,M 是 Microelectronics 的缩写,32 表示 32 位,合起来理解,STM32 就是指 ST 公司开发的 32 位微控制器。
STM32 是意法半导体公司以 ARM 内核为核心加上众多片上外设设计而成的 32 位单片机。
ARM 是英国的芯片设计公司,它主要提供 IP(Intellectual Property core 知识产权的核心)核,就是 CPU 的内核结构,只包括最核心的部分,并不是完整的处理器。ARM 把这个核卖给各大半导体公司,如 Philips,三星,ATMEL,甚至 Intel 等许多公司。
STM32 芯片正面是丝印,ARM 应该是表示该芯片使用的是 ARM 的内核,STM32F103ZET6 是芯片型号,后面的字应该是跟生产批次相关,最下面的是 ST 的 LOGO。芯片四周是引脚,左下角的小圆点表示 1 脚,然后从 1 脚起按照逆时针的顺序排列(所有芯片的引脚顺序都是逆时针排列的)。开发板中把芯片的引脚引出来,连接到其他各种芯片上(比如传感器),然后在 STM32 上编程(实际就是通过程序控制这些引脚输出高电平或者低电平)来控制其他芯片工作。
三、STM32分类
STM32 目前总共有 5 大类,18 个系列:
大类 | 系列 | 内核 | 特性 |
---|---|---|---|
主流级 MCU | GO | Cortex M0+ | 全新入门级 MCU |
G4 | Cortex M4 | 模数混合型 MCU | |
F0 | Cortex M0 | 入门级 MCU | |
F1 | Cortex M3 | 基础型 MCU | |
F3 | Cortex M4 | 混合信号 MCU | |
高性能 MCU | F2 | Cortex M4 | 高性能 MCU |
F4 | Cortex M4 | 高性能 MCU | |
F7 | Cortex M7 | 高性能 MCU | |
H7 | Cortex M7 | 高性能 MCU,部分型号有双核(M7+M4) | |
超低功耗 MCU | L0 | Cortex M0+ | 超低功耗 MCU |
L1 | Cortex M3 | 超低功耗 MCU | |
L4 | Cortex M4 | 超低功耗 MCU | |
L4+ | Cortex M4 | 超低功耗高性能 MCU | |
L5 | Cortex M33 | 超低功耗高性能安全 MCU | |
U5 | Cortex M33 | 超低功耗高性能大容量安全 MCU | |
无线 MCU | WB | Cortex M4 | 双核无线 MCU |
Cortex M0+ | |||
WL | Cortex M4 | 远程无线 MCU | |
微处理器 MPU | MP1 | Cortex M7 | 双核超高性能 MPU |
Cortex M4 |
可以看到,STM32 主要分两大块,MCU 和 MPU,MCU 就是我们常见的 STM32 微控制器,不能跑 Linux,而 MPU 则是 ST 在 19 年才推出的微处理器,可以跑 Linux。STM32 MCU 提供了包括:基础入门、混合信号、高性能、超低功耗和无线等 5 方面应用的产品型号,我们可以根据自己的实际需要选择合适的 STM32 来设计。
四、STM32的命名规则
STM32F103ZET6 命名解读:
参数 | 含义 |
---|---|
名称 | STM32F103ZET6 |
家族 | STM32,表示 32bit 的 MCU |
产品类型 | F 表示基础型 |
具体特性 | 基础型 |
引脚数目 | Z 表示 144pin,其他常用的为 C 表示 48,R 表示 64,V 表示 100,B 表示 208,N 表示 216 |
FLASH大小 | E 表示 512KB,其他常用的为 8 表示 64,C 表示 256,I 表示2048 |
封装 | T 表示 QFP 封装,这个是最常用的封装 |
温度 | 6 表示温度等级为 A:-40~85° |
五、STM32选型
由高到低原则:在不能评估项目所需性能的时候,可以考虑先选择高性能的 STM32 型号进行开发,比如选择 F4/F7/H7 等,在高性能 STM32 上面完成关键性能(即最需要性能的代码)开发验证,如果满足使用要求,则可以降档,如从 H7→F7→F4→F1,如不满足要求,则可以升档,如从 F4→F7→H7,通过此方法找到最佳性价比的 STM32 系列。
由大到小原则:在不能评估项目所需 FLASH 大小、SRAM 大小、GPIO 数量、定时器等资源需求的时候,可以考虑先选择容量较大的型号进行开发,比如选择 512K /甚至 1M FLASH 的型号进行开发,等到开发完成大部分功能之后,就对项目所需资源有了定论,从而可以根据实际情况进行降档选择(当然极少数情况可能还需要升档),通过此方法,找到最合适的 STM32 型号。
六、最小系统
最小系统就是保证 MCU 正常运行的最低要求,一般是指 MCU 的电源、复位、晶振、BOOT 等部分;
STM32 为最小系统预留的引脚接口:
类型 | 引脚名称 | 说明 |
---|---|---|
电源 | VDD/VSS | 电源正(VDD)/负(VSS)引脚,给 STM32 供电 |
VDDA/VSSA | 模拟部分电源正/负引脚,给 STM32 内部模拟部分供电 | |
VREF+/VREF- |
参考电压正/负引脚,给 STM32 内部 ADC/DAC 提供参考电压 100 脚及以上的 STM32F103 型号才有这两个脚 |
|
VBAT |
RTC 后备区域供电引脚,给 RTC 和后备区域供电。 一般 VBAT 接电池,用于断电维持 RTC 工作,如不需要,直接将 VBAT 接 VDD 即可 |
|
复位 | NRST | 复位引脚,用于复位 STM32,低电平复位 |
启动 | BOOT0/BOOT1 |
启动选择引脚,一般这两个脚各接一个下拉电阻即可 其他启动配置说明详见后续分析 |
晶振 | OSC_IN / OSC_OUT |
外部 HSE 晶振引脚,用于给 STM32 提供高精度系统时钟 如果使用内部 HSI 能满足使用需求,这两个脚可以不接晶振 |
OSC32_IN / OSC32_OUT |
外部 LSE 晶振引脚,用于给 STM32 内部 RTC 提供时钟 如果使用内部 LSI 能满足使用需求,这两个脚可以不接晶振 |
|
调试 | SWCLK/SWDIO |
SWD 调试引脚,用于调试 STM32 程序,同时 STM32 还支持 JTAG 调试 推荐使用 SWD 调试!因为 SWD 省 IO! |
6.1、电源模块
6.2、复位电路
STM32 复位引脚 NRST 保持 低电平 状态时间 1~4.5ms 即可复位。
6.3、BOOT启动电路
通过 BOOT0 和 BOOT1 引脚设置启动模式
启动模式选择引脚 | 启动模式 | 说明 | |
---|---|---|---|
BOOT1 | BOOT2 | ||
X | 0 | 主闪存存储器 | 主闪存存储器被选为启动区域 |
0 | 1 | 系统存储器 | 系统存储器被选为启动区域 |
1 | 1 | 内置SRAM | 内置SRAM被选为启动区域 |
6.4、晶振电路
6.5、USB转串口模块
6.6、调试电路
SWJ-DP端口引脚名称 | JTAG调试接口 | SW调试接口 | 引脚分配 | |||
---|---|---|---|---|---|---|
类型 | 描述 | 类型 | 调试功能 | |||
JTMS/SWDIO | 输入 | JTAG 模式选择 | 输入/输出 | 串行数据输入/输出 | PA13 | |
JTCK/SWCLK | 输入 | JTAG 时钟 | 输入 | 串行时钟 | PA14 | |
JTDI | 输入 | JTAG 数据输入 | PA15 | |||
JTDO/TRACESWO | 输出 | JTAG 数据输出 | 跟踪时为 TRACESWO 信号 | PB3 | ||
JNTRST | 输入 | JTAG 模块复位 | PB4 |
SWJ-DP 引脚分配:
SWJ-CFG[2:0] | 配置为调试专用的引脚 | SWJ 接口的 I/0 口分配 | ||||
---|---|---|---|---|---|---|
PA13/ JTMS/ SWDIO |
PA14/ JTCK/ SWCLK |
PA15/ JTDI |
PB3/ JTDO |
PB4/ JNTRST |
||
000 | 所有的 SWJ 引脚 (JTAG-DP + WD-DP) 复位状态 |
专用 | 专用 | 专用 | 专用 | 专用 |
001 | 所有的 SWJ 引脚 (JTAG-DP + WD-DP) 除了 JNTRST 引脚 |
专用 | 专用 | 专用 | 专用 | 释放 |
001 | JTAG-DP 接口禁止 SWD-DP 接口允许 |
专用 | 专用 | 释放 | ||
010 | JTAG-DP 接口和 SWD-DP 接口都禁止 |
释放 | ||||
其它 | 禁止 |
七、IO分配
IO 分配就是在完成最小系统设计以后,根据项目需要对 MCU 的 IO 口进行分配,连接不同的器件,从而实现整体功能。比如:GPIO、IIC、SPI、SDIO、FSMC、USB、中断等。遵循:先分配特定外设 IO,再分配通用 IO,最后微调的原则;
分配 | 外设 | 说明 |
---|---|---|
特定外设 | IIC |
IIC 一般用到 2 根线:IIC_SCL 和 IIC_SDA(ST 叫I2C) 数据手册有 I2C_SCL、I2C_SDA 复用功能的 GPIO 都可选用 |
SPI |
SPI 用到 4 根线:SPI_CS/MOSI/MISO/SCK 一般 SPI_CS 我们使用通用 GPIO 即可,方便挂多个 SPI 器件 数据手册有 SPI_MOSI/MISO/SCK 复用功能的 GPIO 都可选用 |
|
TIM |
根据需要可选:TIM_CH1/2/3/4/ETR/1N/2N/3N/BKIN 等 数据手册有 TIM_CH1/2/3/4/ETR/1N/2N/3N/BKIN 复用功能的 GPIO 都可选用 |
|
USART UART |
USART 有 USART_TX/RX/CTS/RTS/CK 信号 UART 仅有 UART_TX/RX 两个信号 一般用到 2 根线:U(S)ART_TX 和 U(S)ART_RX 数据手册有 U(S)ART_TX/RX 复用功能的 GPIO 都可选用 |
|
USB |
USB 用到 2 根线:USB_DP 和 USB_DM 数据手册有 USB_DP、USB_DM 复用功能的 GPIO 都可选用 |
|
CAN |
CAN 用到 2 根线:CAN_RX 和 CAN_TX 数据手册有 CAN_RX、CAN_TX 复用功能的 GPIO 都可选用 |
|
ADC |
ADC 根据需要可选:ADC_IN0 ~ADC_IN15 数据手册有 ADC_IN0 ~ADC_IN15 复用功能的 GPIO 都可选用 |
|
DAC |
DAC 根据需要可选:DAC_OUT1 / DAC_OUT2 DAC 固定为:DAC_OUT1 使用 PA4、DAC_OUT2 使用 PA5 |
|
SDIO |
SDIO 一般用到 6 根线:SDIO_D0/1/2/3/SCK/CMD 数据手册有 SDIO_D0/1/2/3/SCK/CMD 复用功能的 GPIO 都可选用 |
|
FSMC |
根据需要可选:FSMC_D0~15/A0~25/ NBL0~1/NE1~4/NCE2~3/NOE/NWE/NWAIT/CLK 等 数据手册有 FSMC_D0~15/A0~25/ NBL0~1/NE1~4/NCE2~3/NOE/NWE/NWAIT/CLK 复用功能的 GPIO 都可选用 |
|
通用 | GPIO |
在完成特定外设的 IO 分配以后,就可以进行 GPIO 分配了 比如将按键、LED、蜂鸣器等仅需要高低电平读取/输出的外设连接到空闲的普通 GPIO 即可 |
微调 | IO |
微调主要包括两部分: 1、当 IO 不够用的时候,通用 GPIO 和特定外设可能要共用 IO 口 2、为了方便布线,可能要调整某些 IO 口的位置 |
八、串口下载程序
通过 BOOT0 和 BOOT1 引脚设置启动模式
启动模式选择引脚 | 启动模式 | 说明 | |
---|---|---|---|
BOOT1 | BOOT2 | ||
X | 0 | 主闪存存储器 | 主闪存存储器被选为启动区域 |
0 | 1 | 系统存储器 | 系统存储器被选为启动区域 |
1 | 1 | 内置 SRAM | 内置 SRAM 被选为启动区域 |