用中文界面搞定STM32串口通信:从零开始的实战指南
你是不是也曾面对满屏英文的开发工具望而却步?
是不是每次配置串口都要翻手册、查寄存器、算波特率,折腾半天还收不到一个字节?
别急。今天我们就来彻底简化这个过程——不用啃英文文档,也不用手动写一堆底层代码。只需打开STM32CubeMX 的中文界面,点几下鼠标,就能让 STM32 芯片通过串口向电脑“打招呼”。
这不是理论课,而是一场手把手带你从新建项目到成功收发数据的全流程实战。无论你是刚入门的新手,还是想提升效率的老手,这篇文章都会让你对 STM32 的串口开发有全新的理解。
为什么我们非要用 CubeMX 配置串口?
在讲怎么做之前,先说清楚:为什么要这么干?
过去开发 STM32,很多人习惯直接操作寄存器,或者复制粘贴别人的初始化代码。但现实是:
- 忘开一个时钟,外设就罢工;
- 引脚复用没配对,TX/RX 白接线;
- 波特率算错一点,通信全是乱码;
- 时钟树一改,所有参数全崩。
这些问题,本质上都是“人为疏忽”导致的。而 STM32CubeMX 的出现,正是为了把这些低级错误扼杀在图形界面上。
更重要的是,现在它支持简体中文了!
这意味着:
- 不再被 “Alternate Function”、“Prescaler” 这类术语卡住;
- 所有配置项一目了然,小白也能看懂;
- 自动生成标准 HAL 库代码,安全可靠;
- 修改方便,.ioc文件一保存,下次还能接着调。
一句话总结:用 CubeMX + 中文界面,把复杂的硬件配置变成“可视化搭积木”。
我们要做什么?目标明确!
本案例使用最常见的STM32F103C8T6(蓝 pill 开发板),实现以下功能:
✅ 配置 USART1 实现串口发送
✅ 每隔一秒向 PC 发送一条消息:“Hello from STM32!”
✅ 使用 USB-TTL 模块连接电脑,在串口助手查看输出
✅ 全程使用STM32CubeMX 中文界面完成配置
后续还可以轻松扩展为接收命令、控制 LED、对接 GPS 或蓝牙模块等应用。
第一步:搭建环境与准备工具
硬件部分
- STM32F103C8T6 最小系统板(蓝 pill)
- CH340G / CP2102 USB转TTL模块(推荐带3.3V电平输出)
- 杜邦线若干(建议公对母)
- 电脑一台
⚠️ 注意事项:
- 确保 USB-TTL 模块输出为3.3V,否则可能烧毁 STM32 IO 口!
- TXD 接 RX,RXD 接 TX,别接反!
- GND 一定要共地!
软件部分
- STM32CubeMX (v6.0+ 支持官方中文)
- Keil MDK-ARM(或你熟悉的其他 IDE)
- 串口调试助手(如 XCOM、SSCOM、Tera Term)
💡 小技巧:
如果你的 CubeMX 还是英文界面,可在Help → Install New Language Pack安装中文语言包,重启后进入Preferences → General → Language选择“简体中文”。
第二步:CubeMX 图形化配置全过程(全程中文界面)
1. 创建新工程,选型芯片
打开 STM32CubeMX,点击【新建项目】→ 在搜索框输入 “STM32F103C8”,找到对应型号并双击。
系统会自动加载该芯片的引脚图和资源信息。
2. 配置时钟树(最关键一步!)
点击顶部菜单【时钟配置】标签页。
我们需要让USART1 工作在 72MHz APB2 总线下,这样才能获得高精度波特率。
操作如下:
- 外部高速时钟 HSE 选择 “Crystal/Ceramic Resonator”
- 在 PLL 倍频区设置:HSE 经 9 倍频得到 72MHz 系统主频
- 查看下方 APB2 总线频率是否显示为72MHz
✅ 此时 USART1 的输入时钟就是 72MHz,为后续波特率计算打下基础。
📌 提示:STM32F1 系列中,只有 USART1 接在 APB2 上,最高可达 72MHz;USART2/3 在 APB1,仅 36MHz。所以优先选 USART1 做高速通信。
3. 配置串口引脚(PA9 和 PA10)
切换回【引脚分配】视图。
找到 PA9 和 PA10 引脚:
- PA9 → 设置为USART1_TX
- PA10 → 设置为USART1_RX
你会看到这两个引脚颜色变为橙色,表示已启用复用功能。
🔍 CubeMX 的智能之处在于:一旦你设置了外设功能,它会自动提示需要开启哪些时钟,并检查是否存在引脚冲突。
4. 配置 USART1 参数
在左侧外设列表中找到【USART1】,点击进入配置面板。
关键参数设置如下:
| 参数项 | 设置值 | 说明 |
|------------------|--------------------|------|
| 模式 | 异步通信模式 | 最常用 |
| 波特率 | 115200 bps | 调试打印黄金速率 |
| 数据长度 | 8 位 | 标准格式 |
| 停止位 | 1 | 不加额外停止位 |
| 校验位 | 无 | 简单场景无需校验 |
| 硬件流控 | 无 | 一般不用 RTS/CTS |
| 过采样方式 | 16 倍采样 | 默认更稳定 |
这些就是常说的“8-N-1” 配置(8数据位、无校验、1停止位)。
5. 生成代码前的最后设置
点击顶部【项目管理】标签页,设置:
- 工程名称 & 路径
- 工具链 / IDE:选择MDK-ARM V5
- 代码生成选项:勾选 ✅“将外设初始化拆分为独立的 .c/.h 文件”
这样生成的代码结构更清晰,后期维护更容易。
全部设置完成后,点击【生成代码】按钮。
几秒钟后,工程文件夹就自动生成完毕,包括初始化代码、时钟配置、GPIO 设置等全套内容。
第三步:添加应用层代码,实现串口发送
用 Keil 打开生成的.uvprojx工程文件。
我们在main.c的while(1)循环中加入发送逻辑:
int main(void) { /* 初始化 */ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); uint8_t tx_data[] = "Hello from STM32!\r\n"; /* 主循环 */ while (1) { HAL_UART_Transmit(&huart1, tx_data, sizeof(tx_data)-1, 100); HAL_Delay(1000); // 每秒发一次 } }📌 关键说明:
-sizeof(tx_data)-1是因为字符串末尾\0不需要发送;
- 超时时间设为 100ms,防止阻塞太久;
-HAL_Delay()依赖 SysTick,已在HAL_Init()中启动。
编译、下载程序到开发板。
第四步:连接电脑,验证通信结果
接线方式
| STM32板 | USB-TTL模块 |
|---|---|
| PA9 (TX) | RXD |
| PA10 (RX) | TXD |
| GND | GND |
| 3.3V 或 5V | VCC(根据模块) |
❗ 再次强调:GND 必须共地!否则通信不可能成功!
插上 USB 后,设备管理器应识别出 COM 口(如 COM5)。如果没识别,请安装 CH340 驱动。
打开串口助手(以 XCOM 为例):
- 选择正确的 COM 口
- 波特率设为115200
- 数据位 8,停止位 1,无校验
- 点击【打开串口】
稍等片刻,你应该能看到终端每隔一秒打印一行:
Hello from STM32! Hello from STM32! ...🎉 成功了!你的 STM32 正在主动“说话”。
常见问题排查清单(亲测有效)
即使一切看起来都对,也可能会遇到问题。以下是我在教学中总结的Top 5 坑点与解决方案:
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 完全无输出 | RCC 时钟未使能 | 检查RCC配置页是否启用了 GPIOA 和 USART1 时钟 |
| 输出乱码 | 波特率不匹配或时钟不准 | 确认外部晶振已启用,APB2 是否真为 72MHz |
| 只能发不能收 | RX 引脚未正确配置 | 查看 GPIO 初始化函数中 PA10 是否参与配置 |
| 偶尔丢数据 | CPU 被中断打断太多 | 改用 IDLE 中断 + DMA 方式接收(进阶方案) |
| PC 不识别 USB 转串 | 驱动未装或模块损坏 | 更换模块测试,或使用 Device Manager 查看端口状态 |
💡 快速诊断技巧:
在 CubeMX 的【Pinout】视图中,悬停在 PA9/PA10 上,会显示当前功能状态。如果是灰色,说明没启用;如果是橙色且标着 TX/RX,才表示配置成功。
如何进一步升级?不止于“发 Hello”
现在已经实现了基本发送功能,接下来可以轻松扩展更多实用能力:
1. 实现串口接收(回声测试)
修改配置,启用中断接收:
// 在 main 函数中启动中断接收 HAL_UART_Receive_IT(&huart1, &rx_byte, 1); // 实现回调函数 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart == &huart1) { HAL_UART_Transmit(&huart1, &rx_byte, 1, 100); // 回传收到的字符 HAL_UART_Receive_IT(&huart1, &rx_byte, 1); // 重新开启中断 } }这样就能做简单的“回声测试”:你在串口助手里输入什么,STM32 就返回什么。
2. 重定向 printf 到串口
为了让调试更高效,我们可以把printf输出重定向到串口。
只需添加以下函数:
#ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif PUTCHAR_PROTOTYPE { HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 100); return ch; }然后就可以直接使用:
printf("当前温度: %.2f°C\r\n", temperature);极大提升日志输出效率。
3. 使用 DMA 提升性能(适合大数据量)
对于高频传感器数据上传(如 IMU、ADC 采样),建议开启 DMA 传输,避免频繁中断影响实时性。
CubeMX 中只需勾选:
- USART1 → Mode → Asynchronous → DMA Settings → Add 新增 TX/RX 通道
- 选择 Normal 模式或 Circular 模式(循环接收)
生成代码后调用HAL_UART_Transmit_DMA()即可。
写在最后:这不仅仅是一个串口案例
也许你会觉得:“不就是串口发个字符串吗?有什么难的?”
但请想想:
当你第一次面对陌生芯片时,是不是也被那些缩写搞晕过?
当你改了个时钟,发现串口突然不工作了,有没有怀疑人生过?
而今天我们做的,不只是“配个串口”,而是建立了一套现代化嵌入式开发范式:
- 可视化配置代替手动编码
- 中文界面降低认知负担
- 自动生成标准化代码
- 软硬件协同设计思维
这才是真正值得掌握的能力。
掌握了这套方法,下一步你可以:
- 对接 ESP8266 WiFi 模块,实现联网日志上传;
- 连接 HC-05 蓝牙模块,手机远程控制 LED;
- 读取 GPS 模块 NMEA 数据,解析经纬度;
- 构建多机通信协议,打造小型物联网节点。
一切,都始于这一次成功的串口通信。
如果你正在学习 STM32,不妨就从这个“Hello World”开始吧。
动手试试,你会发现:原来嵌入式开发,也可以如此简单、直观、高效。
💬你在配置串口时踩过哪些坑?欢迎在评论区分享你的经历!