STM32 嵌入式常见名词解释(入门版)

适合刚开始学习 STM32 时查阅。先理解名词在做什么,再结合实验反复理解;不需要一次记住全部。

1. 整体认识

  • 嵌入式系统(Embedded System):嵌入产品中、专门完成某项功能的计算机系统,例如电饭煲控制板、智能手环和无人机飞控。
  • 单片机(MCU):把处理器、存储器和常用外设集成到一颗芯片中的微型计算机。STM32 是一大类单片机。
  • STM32:意法半导体(ST)推出的 32 位 ARM 单片机系列。不同型号的引脚数、存储容量和外设数量不同。
  • 开发板:将 MCU、电源、下载接口、按键、LED 等连接好的电路板,用于学习和原型开发。
  • 芯片型号:芯片的完整名称,例如 STM32F103C8T6。其中通常包含系列、内核、Flash 容量和封装等信息。
  • 数据手册(Datasheet):说明芯片电气参数、封装、引脚功能和使用限制的文档。
  • 参考手册(Reference Manual):详细说明芯片内部外设、寄存器和工作机制的文档。

2. 电路基础

电压、电位和电流

  • 电位:某一点相对参考点的电势高低。单片机电路通常把 GND(地) 当作 0 V 参考点。
  • 电压(Voltage):两点之间的电位差,单位是伏特(V)。例如 3.3 V 表示该点比 GND 高 3.3 V。
  • 高电平 / 低电平:数字电路用一定范围的电压表示逻辑值。一般接近 3.3 V 为高电平(逻辑 1),接近 0 V 为低电平(逻辑 0)。具体阈值以数据手册为准。
  • 电流(Current):电荷流动的快慢,单位是安培(A)。电流必须有闭合回路才能流动。
  • 电阻(Resistor):限制电流或分压的元件,单位是欧姆(ohm,符号为 Ω)。LED 前常串联限流电阻,避免电流过大。
  • 功率(Power):电能消耗或转换的速度,常用关系式为 P = U x I,单位是瓦特(W)。
  • VCC / VDD:电源正端的常见标记。STM32 的数字电源通常标为 VDD。
  • GND / VSS:地线或电源负端的常见标记。模块通信时通常需要共地,即 GND 相连。
  • 3.3 V 与 5 V:常见供电电压。许多 STM32 GPIO 工作在 3.3 V 逻辑,是否允许 5 V 输入必须查对应型号的数据手册。

常见连接方式

  • 短路:本不应直接相连的两点被低阻连接。例如电源正负极直接相连,可能损坏电源或电路。
  • 断路:电路没有形成闭合通路,电流无法正常流动。
  • 上拉(Pull-up):通过电阻把信号线连接到高电平;无人驱动时,信号默认读为高电平。
  • 下拉(Pull-down):通过电阻把信号线连接到低电平;无人驱动时,信号默认读为低电平。
  • 悬空(Floating):引脚没有可靠接高电平或低电平。悬空输入容易受干扰,读数不确定。
  • 去耦电容:放在芯片电源脚附近的电容,用来稳定瞬间变化的供电电压、滤除干扰。常见值为 0.1 uF
  • 复位(Reset):让 MCU 回到初始状态并重新开始运行。STM32 常有专用的 NRST 复位引脚。

3. GPIO 与引脚模式

  • 引脚(Pin):芯片与外部电路连接的物理端点。一个引脚常可复用为多种功能。
  • 端口(Port):GPIO 的分组名称,例如 GPIOAGPIOBPA0 表示 A 端口的第 0 号引脚。
  • GPIO(General Purpose Input/Output):通用输入输出接口。它可以读取按键状态,也可以控制 LED、继电器等。
  • 输入(Input):MCU 读取外部电平的模式,例如读取按键是否按下。
  • 输出(Output):MCU 主动向外输出高、低电平的模式,例如控制 LED 点亮或熄灭。
  • 模拟输入(Analog Input):让引脚接收连续变化的电压,通常交给 ADC 测量,例如读取电位器电压。
  • 复用功能(Alternate Function,AF):把 GPIO 交给某个外设使用。例如把 PA9 配置为 USART1 的发送脚。
  • 推挽输出(Push-pull Output):引脚内部既能主动输出高电平,也能主动输出低电平。常用于 LED 和普通数字信号。
  • 开漏输出(Open-drain Output):引脚只能主动拉低,不能主动拉高;要得到高电平,需要外接或启用上拉电阻。常见于 I2C。
  • 开漏为什么要上拉:开漏输出高电平时相当于不驱动;没有上拉时线路会悬空,无法稳定读到逻辑 1
  • 输出速度(GPIO Speed):GPIO 电平翻转边沿的快慢,不是程序执行速度。边沿过快会带来更强的电磁干扰。
  • 输入上拉 / 输入下拉:GPIO 输入模式中可启用芯片内部电阻,避免按键等信号线悬空。

4. MCU 的核心资源

  • CPU 内核:负责执行指令的核心。许多 STM32 使用 ARM Cortex-M 系列内核,如 Cortex-M3、M4、M0+。
  • 32 位:CPU 一次可高效处理 32 位宽的数据和地址;不等于所有变量都必须是 32 位。
  • 寄存器(Register):芯片内部保存控制信息或状态的高速存储单元。配置 GPIO、定时器等外设,本质上就是读写相应寄存器。
  • Flash:非易失性程序存储器。编译后的程序下载到这里,断电后内容仍保留。
  • RAM / SRAM:运行时临时存储器,用于变量、数组和栈等;断电后内容丢失。
  • 栈(Stack):用于函数调用、局部变量和返回地址的一块 RAM 区域。栈太小可能导致程序异常。
  • 堆(Heap):用于动态内存分配的一块 RAM 区域,例如 C 语言的 malloc。初学阶段应谨慎使用动态分配。
  • 程序计数器(PC):保存 CPU 下一条要执行的指令地址。
  • 启动文件(Startup File):定义中断向量表、初始化栈并跳转到 main 函数的底层文件。
  • 固件(Firmware):运行在 MCU 内部的程序,通常就是编译并下载到 Flash 的代码。

5. 时钟与时间

  • 时钟(Clock):周期性变化的节拍信号,CPU 和外设依靠它同步工作。可以把它理解为 MCU 的节拍器。
  • 时钟频率:每秒产生多少个时钟周期,单位为赫兹(Hz)。72 MHz 表示每秒约 7200 万个周期。
  • 系统时钟(SYSCLK):MCU 的主时钟来源,是 CPU 和许多总线时钟配置的基础。
  • 外部高速时钟(HSE):来自芯片外部晶振或外部时钟源的高速时钟,通常更准确。
  • 内部高速时钟(HSI):芯片内部 RC 振荡器产生的高速时钟,使用方便但精度通常低于外部晶振。
  • 晶振(Crystal Oscillator):利用晶体振荡提供稳定频率的器件,例如 8 MHz 晶振。
  • PLL(锁相环):可将较低频率的时钟倍频,得到更高的系统时钟。例如将 8 MHz 倍频到 72 MHz。
  • 分频(Prescaler / Divider):把时钟频率按比例降低。例如 72 MHz 经 72 分频后得到 1 MHz。
  • AHB / APB 总线:连接 CPU、存储器和外设的内部数据通道。STM32 常将外设分在 APB1、APB2 等总线上。
  • 外设时钟使能:大多数外设默认不供时钟以节能。使用 GPIO、USART、TIM 等前,通常必须先开启对应时钟。
  • 滴答定时器(SysTick):Cortex-M 内核自带的定时器,常用于产生 1 ms 系统节拍和延时。
  • 延时(Delay):让程序等待一段时间。延时期间 CPU 可能无法处理其他任务;复杂项目更倾向使用定时器或 RTOS 调度。

6. 常见片上外设

  • 定时器(TIM,Timer):按时钟计数的外设,可用于定时、计数、测频和产生 PWM 等。
  • 计数器:定时器内部不断加或减的数值。达到设定值时可产生事件或中断。
  • 预分频器(PSC):定时器的分频设置,用于降低进入计数器的时钟频率。
  • 自动重装载值(ARR):定时器计数的上限。计数到该值后可重新从零开始。
  • PWM(脉冲宽度调制):周期不变、通过改变高电平持续时间来调节平均能量的信号。常用于调光、调速和舵机控制。
  • 占空比(Duty Cycle):一个 PWM 周期中高电平所占比例。例如 20% 占空比表示一个周期中 20% 时间为高电平。
  • ADC(模数转换器):将连续变化的模拟电压转换为数字值,例如读取电位器的电压。
  • 分辨率:ADC 可区分的等级数。12 位 ADC 的结果范围通常为 04095
  • DAC(数模转换器):把数字值转换为模拟电压。并非所有 STM32 型号都有 DAC。
  • DMA(直接存储器访问):在外设和内存之间搬运数据,减少 CPU 重复搬运数据的负担。
  • 看门狗(Watchdog):防止程序跑飞的硬件定时器。程序必须定期喂狗;若长时间未喂狗,芯片会自动复位。
  • RTC(实时时钟):用于保存日期和时间,通常可由后备电池持续供电。

7. 中断、异常与程序流程

  • 轮询(Polling):CPU 在循环中不断检查某个状态。例如反复读取按键引脚是否为低电平。实现简单,但会占用 CPU 时间。
  • 中断(Interrupt):事件发生时,硬件暂停当前程序,转去执行对应的中断服务函数;处理完后再返回原程序。
  • 中断服务函数(ISR):响应中断时执行的函数。在 STM32 工程中常见名称如 USART1_IRQHandler
  • 中断向量表:保存各种中断服务函数入口地址的表,由启动文件建立。
  • 中断优先级:多个中断同时到来时的处理顺序。配置时应参考当前芯片和工程的规则。
  • NVIC:Cortex-M 内核中负责管理中断使能和优先级的控制器。
  • 回调函数(Callback):库在某个事件发生后自动调用的用户函数,例如 HAL 的定时器周期回调函数。
  • 状态机:用有限个状态及其切换规则描述程序流程的方法,常用于按键、通信协议和设备控制。

8. 常见通信接口

  • 串口(UART / USART):常用的异步串行通信接口,至少使用 TX、RX 和共地 GND。常用于打印调试信息。
  • TX / RX:发送(Transmit)和接收(Receive)引脚。两个设备相连时通常 TX 接对方 RX,RX 接对方 TX。
  • 波特率(Baud Rate):串口通信速率,常见为 9600115200。通信双方必须设为一致。
  • I2C:两线同步通信总线,使用 SCL(时钟线)和 SDA(数据线),两条线一般都需要上拉电阻。适合连接多个低速传感器。
  • SPI:同步串行通信接口,常见信号有 SCK(时钟)、MOSI(主发从收)、MISO(主收从发)和 CS(片选)。速度通常比 I2C 高。
  • CAN:抗干扰能力较强的差分通信总线,常用于汽车和工业场景;通常需要 CAN 收发器才能连接总线。
  • USB:通用串行总线。STM32 可作为设备、主机或其他角色,配置相对复杂。
  • 协议(Protocol):通信双方共同遵守的数据格式、时序和规则。串口只是传输方式,数据如何组织仍需要协议规定。

9. 开发、下载与调试

  • IDE(集成开发环境):编写、编译、下载和调试代码的软件,例如 Keil MDK、STM32CubeIDE。
  • 编译(Compile):把 C/C++ 源代码转换为机器可执行代码的过程。
  • 链接(Link):把各个编译后的文件和库组合起来,生成最终程序文件的过程。
  • 工程(Project):源代码、配置、库文件和构建规则的集合。
  • 库(Library):厂商或他人提供的可复用代码。STM32 常见有标准外设库、HAL 库和 LL 库。
  • HAL:ST 提供的硬件抽象库,接口较易理解,适合入门和快速开发。
  • LL:比 HAL 更接近寄存器的底层库,代码更轻量,控制更直接。
  • 寄存器开发:直接读写外设寄存器的开发方式。学习硬件原理很有帮助,但需要更熟悉参考手册。
  • STM32CubeMX:ST 的图形化配置工具,可配置时钟、引脚和外设,并生成工程初始化代码。
  • 烧录 / 下载:把编译生成的程序写入 MCU 的 Flash。
  • ST-Link:ST 常用的下载和调试器,可通过 SWD 接口连接 STM32。
  • SWD:ARM 的两线调试接口,常用 SWDIO、SWCLK 和 GND;可下载程序、单步执行和查看变量。
  • 断点(Breakpoint):调试时让程序运行到某一行暂停,便于查看变量和执行流程。
  • 单步执行:暂停后按语句或按函数逐步运行程序的调试方式。
  • 串口打印:通过 printf 等方式把变量和运行信息输出到串口助手,是最常用的调试手段之一。

10. 一个 LED 实验会用到什么

以“每隔一秒闪烁一次 LED”为例,可以把上述概念串起来:

  1. MCU 配置系统时钟,让 CPU 和外设有统一的工作节拍。
  2. 开启 LED 所在 GPIO 端口的外设时钟
  3. 将 LED 引脚配置为推挽输出
  4. 输出高或低电平,改变 LED 两端的电压,使其点亮或熄灭。不同开发板的 LED 可能是低电平点亮,应以原理图为准。
  5. 用 SysTick、定时器或延时函数等待约 1 秒后翻转一次引脚电平。

11. 入门时的实用原则

  • 不确定引脚能否接 5 V 时,先查数据手册,不能只凭开发板丝印判断。
  • 两个模块通信不正常时,先检查是否共地,再检查电源电压、连线和波特率。
  • GPIO 输入不要悬空;按键常使用上拉或下拉配置。
  • 使用一个外设前,先确认时钟是否开启、引脚是否正确配置、对应中断是否使能。
  • 遇到看不懂的代码时,先问三个问题:它在配置哪个外设?写入的是什么状态?这个事件何时发生?

12. 推荐学习顺序

  1. LED、按键、蜂鸣器:认识 GPIO、电平、上拉下拉和推挽输出。
  2. 定时器与 PWM:认识时钟、计数、频率和占空比。
  3. 串口:认识 TX/RX、波特率和中断。
  4. ADC:认识模拟量、电压和采样。
  5. I2C / SPI:连接传感器,理解总线和通信协议。
  6. DMA、中断、RTOS:在已有基础上学习更高效的程序结构。