
本文是"嵌入式基础学习"系列的第一篇,内容覆盖课件《初识 STM32F103ZET6》第 1~18 页,并结合 ST 官方数据手册和 RM0008 参考手册校正细节。目标不是背诵引脚名称,而是建立一条完整认识路线:芯片是什么 -> 型号怎样读 -> 实物怎样找 1 脚 -> 引脚怎样分类 -> 芯片为什么能够正确上电、复位和启动。
一、先建立整体认识:STM32 到底是什么
STM32 是意法半导体(STMicroelectronics)推出的一系列 32 位微控制器。这里的"微控制器(MCU)"可以先理解成一台被压缩到单颗芯片里的小型计算机,它通常同时包含:
- 处理器内核:执行程序指令;
- Flash:掉电后仍能保存程序;
- SRAM:保存程序运行期间的临时数据;
- GPIO:读取按键、控制 LED 等;
- 定时器、ADC、USART、SPI、I2C 等片上外设;
- 时钟、复位、供电和调试接口。
STM32F103 使用 Arm Cortex-M3 内核。与只会"执行计算"的处理器不同,MCU 的价值在于它能直接连接现实世界:读取传感器、控制电机、驱动屏幕、采集模拟电压,或者通过串口、SPI、I2C 与其他芯片通信。
典型应用包括工业控制、仪器仪表、智能家电、机器人控制、数据采集和各种嵌入式终端。学习 STM32F103 的意义并不是只会某一块开发板,而是借它掌握 MCU 项目的共同方法:看数据手册、接硬件、配置寄存器、烧录程序、观察真实信号并排查故障。
二、不要死记型号:把 STM32F103ZET6 拆开读

STM32F103ZET6 不是随机字符串,每个部分都在描述芯片规格。
| 字段 | 含义 | 对学习和选型的影响 |
|---|---|---|
STM32 |
基于 Arm 架构的 32 位微控制器系列 | 表明产品家族 |
F103 |
F 系列中的 103 性能线,使用 Cortex-M3 内核 | 决定内核、外设体系和参考手册范围 |
Z |
144 个物理引脚 | 决定封装引脚数量和可引出的资源 |
E |
512 KiB 内部 Flash | 决定程序与只读数据可用空间 |
T |
LQFP 封装 | 决定焊盘、PCB 封装和焊接方式 |
6 |
工业温度范围 -40~85 ℃ | 决定器件保证工作的环境温度等级 |
这里要注意两个容易混淆的概念:
- Flash 容量不是运行内存。 Flash 主要保存程序,SRAM 才保存栈、堆、局部变量和运行时数据。
- 144 个物理引脚不等于 144 个可随意编程的 GPIO。 其中还包含电源、地、复位、启动、时钟、模拟参考等引脚。
以后拿到一个陌生 STM32 型号,先去数据手册最后的 Ordering information scheme 查命名规则,比靠经验猜更可靠。
三、封装是什么:为什么同一颗芯片会长得不一样
封装描述的是芯片裸片如何被保护、引脚如何引出,以及 PCB 应该使用怎样的焊盘。STM32F103ZET6 中的 T 表示 LQFP(Low-profile Quad Flat Package,低轮廓四边扁平封装)。
LQFP 的特点是:
- 四条边都有向外伸出的引脚;
- 可以直接观察焊点,便于检查和返修;
- 引脚数量较多时占板面积也较大;
- PCB 封装必须与具体的引脚数和尺寸匹配,不能只看到"LQFP"就直接替换。
封装不是芯片功能本身,但它直接影响 PCB 设计、焊接难度、散热和引脚能否全部引出。同一产品线可能同时提供 LQFP、BGA 或其他封装,功能相近并不代表焊盘兼容。
四、怎样从实物找到 1 脚
观察 LQFP 芯片顶面,通常能看到一个圆点、缺口或其他方向标记。离方向标记最近的角对应 1 脚附近,然后按照数据手册的顶视图进行编号。
对于课件中的 LQFP144:
- 一共 144 个物理引脚;
- 每条边 36 个引脚;
- 从 1 脚开始,按顶视图逆时针递增;
- 原理图中的
PA0、VSS、NRST是功能名称,1~144是封装上的物理编号,两者不是一回事。
可以把它类比成教室:座位号是物理位置,坐在位置上的同学姓名是功能名称。看原理图和 PCB 时必须完成"物理编号 <-> 引脚名称 <-> 芯片功能"三者之间的对应。
五、144 个引脚应该怎样分类

为了学习,可以先把引脚分成两大类。
1. 专用或启动关键引脚
它们承担供电、复位、启动选择、时钟或模拟参考等基础任务。某些引脚的用途固定,某些引脚只在启动阶段具有特殊意义,但共同点是:接错以后,芯片可能根本无法稳定运行,软件也救不了错误的硬件连接。
2. 端口引脚
STM32F103ZET6 引出了 PA0~PA15、PB0~PB15,一直到 PG0~PG15 等端口信号。它们通常可以配置为:
- 普通输入:读取按键或数字传感器;
- 普通输出:控制 LED、继电器或片选信号;
- 复用功能:USART、SPI、I2C、定时器 PWM 等;
- 模拟功能:ADC 输入等。
端口名称存在,不代表该引脚在所有时刻都能自由使用。例如调试接口、晶振、启动配置可能与某些端口复用;实际项目必须查看数据手册的引脚定义表和复用功能表。
六、特殊功能引脚逐个理解
6.1 VDD、VSS、VDDA 与 VSSA:芯片运行的供电基础
VDD 是数字电源输入,VSS 是数字地。STM32F103xC/D/E 数据手册给出的 VDD 范围为 2.0~3.6 V,开发板通常使用 3.3 V。
LQFP144 上有多组 VDD/VSS。它们不是"任选一组连接",而是都应按照数据手册连接,并在电源引脚附近布置去耦电容。去耦电容的作用是为芯片快速变化的瞬时电流提供本地通路,降低电源噪声。
VDDA/VSSA 是模拟部分的电源和地,服务于 ADC、DAC、PLL、复位模块等。官方数据手册要求 VDDA/VSSA 分别连接到 VDD/VSS;真正设计 PCB 时还要按推荐电路处理滤波和去耦。
可以先记住:
text
VDD / VSS -> 数字部分供电与参考地
VDDA / VSSA -> 模拟部分供电与参考地
6.2 VREF+ 与 VREF-:ADC/DAC 判断电压的标尺
ADC 把模拟电压转换成数字量,需要知道"满量程电压是多少",VREF 就是这个参考标尺。参考电压不稳定,即使 ADC 程序完全正确,测量结果也会跟着抖动或偏移。
因此,VREF 不能简单当成普通电源脚理解。学习 ADC 时要把输入电压、参考电压和数字结果联系起来:
text
ADC 数字结果 ≈ 输入电压 / 参考电压 × 满量程数字值
6.3 NRST:决定"什么时候重新开始"
NRST 是低电平有效的复位引脚。名字里的 N 可以理解成 Negative 或 Not:
- NRST 为低电平:芯片保持在复位状态;
- NRST 释放为高电平:芯片退出复位并重新开始启动流程。
开发板上的复位按键通常在按下时把 NRST 拉低。复位会让处理器和相关外设回到确定状态,但复位本身并不决定从哪一块存储器启动,启动来源由 BOOT 配置决定。
6.4 VBAT:只维持备份域,不是整颗芯片的备用电源
当 VDD 消失时,VBAT 可以继续为备份域供电,其中包括 RTC、32 kHz 外部振荡器和备份寄存器。它的目的通常是:
- 断电后仍保留日期和时间;
- 保存少量需要跨掉电保留的数据;
- 主电源恢复后继续使用原来的时间上下文。
但这时 CPU 和大部分外设并不会继续运行。它更像 PC 主板电池维持 RTC,而不是一块能让整台电脑继续工作的 UPS。
6.5 BOOT0 与 BOOT1:决定"复位后从哪里取第一条指令"

高密度 STM32F103 的启动模式由 BOOT1、BOOT0 共同决定:
| BOOT1 | BOOT0 | 启动空间 | 常见用途 |
|---|---|---|---|
x |
0 |
主 Flash | 正常运行已经烧录的用户程序 |
0 |
1 |
系统存储器 | 运行 ST 固化的 Bootloader,通过 USART1 重新烧录 |
1 |
1 |
片上 SRAM | 调试或特殊启动场景 |
很多开发板把 BOOT1/PB2 固定下拉为 0,所以板上只保留 BOOT0 跳帽或拨码开关:
- BOOT0 = 0:正常从 Flash 启动;
- BOOT0 = 1:进入系统 Bootloader。
这只是开发板电路做出的简化,不代表芯片内部只有两种模式。
最容易记住的区别是:
text
NRST 解决"什么时候重新启动"
BOOT 解决"重新启动后从哪里执行"
BOOT 引脚不会因为电平变化就立即把正在运行的程序切走。芯片在复位启动过程中采样启动配置,所以修改 BOOT0 后通常还要复位或重新上电。
6.6 OSC_IN / OSC_OUT 与 OSC32_IN / OSC32_OUT:外部时钟入口
时钟决定数字电路按照什么节奏工作。STM32F103 既有内部振荡器,也可以连接外部晶振:
OSC_IN / OSC_OUT:连接高速外部时钟或晶振,常用于系统主时钟;OSC32_IN / OSC32_OUT:连接 32.768 kHz 低速晶振,常用于 RTC。
晶振引脚周围的走线、负载电容和布局会影响是否稳定起振,因此不能把它们当成普通 GPIO 随意连接。
6.7 NC:没有连接,不代表可以随便接
NC 表示 No Connect。除非最新数据手册明确给出其他说明,PCB 上通常应保持悬空,不能因为"空着浪费"就接到电源、地或其他信号。
七、把复位与启动串成一条完整流程
从按下复位键到用户程序运行,可以按下面的顺序理解:
- NRST 被拉低,芯片进入复位状态。
- NRST 释放,芯片开始退出复位。
- 芯片读取 BOOT0/BOOT1 的启动配置。
- 对应存储器被映射到启动地址。
- Cortex-M3 从向量表取得初始栈顶地址和复位处理函数地址。
- 启动代码设置运行环境,最后进入
main()。
这条链路解释了许多常见故障:
- 程序烧录成功但不上电运行:先检查 BOOT0 是否仍处于下载模式;
- 按复位键没有反应:检查 NRST 电平、按键和上拉网络;
- 芯片完全无法连接:先排查所有电源脚、地、时钟和复位,而不是一上来怀疑业务代码;
- RTC 断电后归零:检查 VBAT、LSE 和备份域配置。