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: