STM32串口配置4步搞定
本文介绍了STM32串口(UART)配置的完整步骤:1)通过引脚图或Cubemx查询串口引脚,建议使用Cubemx同时完成引脚配置;2)正确连接USART-TTL模块,注意TX/RX交叉对接;3)在Cubemx中配置NVIC中断并生成代码;4)编写业务代码时需注意:需在初始化及回调函数中各调用一次HAL_UART_Receive_IT(),避免中断只触发一次。文中还对比了同步/异步通信的应用场景,
第一步——串口引脚查询
方法一:引脚图
选择自己使用的串口(如UART4、USART1等),通过查阅引脚图找到相应的RX与TX的引脚。

方法二:Cubemx查询
在左侧一栏中打开
Connectivity

这里面会显示当前芯片所支持的所有设备类型

这里我以UART4为例,进行说明。
模式选择为异步通信,下表总结了同步与异步的使用场景,按需选择即可。
| 应用场景 | 同步通信(USART/SPI/I2C) | 异步通信(UART/RS-232/RS-485) |
|---|---|---|
| 调试与日志输出 | ❌ 不适用 | ✅ 首选(STM32通过UART连接PC串口助手) |
| 高速数据采集 | ✅ 高频ADC数据传输(>1Mbps) | ❌ 速率不足 |
| 存储器接口 | ✅ SPI Flash、SD卡通信 | ❌ 不适用 |
| 传感器接口 | ✅ 高精度传感器(IMU、高速ADC) | ✅ 低速传感器(温湿度模块、GPS) |
| 工业控制 | ✅ PLC高速总线、电机控制 | ✅ Modbus RTU(RS-485长距离通信) |
| 消费电子产品 | ✅ 显示屏驱动(SPI)、触摸屏控制 | ✅ 蓝牙/Wi-Fi模组AT指令通信 |
| 汽车电子 | ✅ CAN总线(本质同步)、ECU通信 | ✅ OBD-II诊断接口(UART协议) |
| 多设备组网 | ✅ I2C总线连接多从设备(EEPROM、传感器集线器) | ✅ RS-485多节点通信(需地址寻址) |
| 实时性要求高系统 | ✅ 音频流传输、实时控制系统 | ❌ 时序抖动敏感场景不适用 |
| 引脚资源紧张设计 | ❌ 需CLK+数据线(至少3线) | ✅ 仅需TX/RX(2线) |
| 长距离通信(>10m) | ❌ 时钟同步困难 | ✅ RS-485(可达1200米) |
| 低功耗设备 | ❌ 时钟持续运行功耗高 | ✅ 可休眠+唤醒接收(如NB-IoT模块) |

在Configuration里选择GPIO Settings,就可以看见对应的引脚了。
在Cubemx里面查找是最快捷的,还能顺便配置一下串口,一石二鸟。
第二步——接线
由第一步可知,TX对应PC10,RX对应PC11。
将USB TO TTL的TXD接PC11,RXD接PC10。

第三步——配置中断
在NVIC Settings里面勾选UART4的中断。

点击生成代码,你会在stm32f1xx_it.c文件中找到相应的中断服务函数

右键点击可以跳转到函数的定义,然后下滑可以找到相应的回调函数。

这里以接受回调函数为例进行讲解。这里的__weak代表的是弱定义,用户可以在其他地方再次定义。

第四步——编写业务代码
根据第三步中找到的回调函数,在main.c中编写代码。

推荐写在此位置,比较常见一点。
注意事项
必须调用HAL_UART_Receive_IT两次(初始化+回调函数内)
使用了中断就必须在while循环前调用一下HAL_UART_Receive_IT()函数,并且在回调函数里头也需要再次调用,否则结果就是中断接收只会触发一次。

这里不推荐在while循环里进行中断接收,因为会占用GPU资源。
更多推荐



所有评论(0)