STM32 入门阶段:从 GPIO 到 I²C、UART 与中断

这组笔记形成于 2025 年 6—7 月。当时我正在为电子设计竞赛补齐 STM32 基础,学习目标并不是记住所有 HAL 函数,而是理解单片机怎样感知外部信号、怎样控制执行器,以及不同模块之间怎样传递数据。

GPIO:先理解引脚的工作方式

GPIO 是我接触 STM32 外设的起点。输出模式中,推挽输出可以主动输出高、低电平,适合 LED 和普通数字控制;开漏输出在输出高电平时呈高阻态,通常需要上拉电阻,便于多个器件共享信号线。

输入模式则需要根据电路状态选择上拉、下拉或浮空输入。学习过程中我逐渐意识到,CubeMX 里每个配置选项都对应真实的电路行为:如果输入端没有稳定的默认电平,程序读到的状态就可能随机变化。

HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
GPIO_PinState state = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9);

中断:从轮询转向事件驱动

轮询适合最初验证功能,但 CPU 会不断检查状态。外部中断则让主程序继续执行其他任务,只有触发条件到来时才进入中断服务流程。

我在这一阶段重点理解了两组概念:

  • EXTI 负责检测外部引脚事件;
  • NVIC 负责管理中断使能和优先级。

抢占优先级决定一个中断能否打断另一个中断,响应优先级用于安排同一抢占级别下的执行顺序。优先级数值越小,代表优先级越高。

UART:适合点对点异步通信

UART 不需要额外时钟线,通信双方需要约定波特率、数据位、停止位和校验方式。硬件连接时 TX 与 RX 交叉,且两端必须共地。

HAL_UART_Transmit(&huart1, &tx_byte, 1, HAL_MAX_DELAY);
HAL_UART_Receive(&huart1, &rx_byte, 1, HAL_MAX_DELAY);

阻塞式收发适合调通链路,但在需要实时控制时,应进一步学习中断或 DMA 收发、数据帧设计、超时处理与校验机制。

I²C:用两根信号线连接多个器件

I²C 使用 SDA 和 SCL,两条线通常采用开漏结构并通过上拉电阻保持高电平。一次典型通信由起始条件、地址与读写位、应答、数据传输和停止条件组成。需要特别注意:地址后的读写位中,0 表示写,1 表示读。

与 UART 相比,I²C 更适合在同一电路板上连接多个低速外设,例如 OLED、传感器和存储器;UART 则更适合控制器之间或控制器与计算机之间的点对点通信。

阶段总结

这段学习让我建立了一个基本框架:GPIO 负责直接读写引脚,中断负责及时响应事件,UART 负责点对点通信,I²C 负责总线式外设连接。之后再接触编码器、电机驱动、摄像头或上位机时,我可以先判断它属于输入、输出、事件还是通信问题,再选择对应的外设和程序结构。




Enjoy Reading This Article?

Here are some more articles you might like to read next: