手把手教你用FlyMCU串口烧录STM32程序:告别ST-LINK依赖
第一次接触STM32开发时,大多数教程都会告诉你使用ST-LINK调试器进行程序烧录。但当你手头没有这个专用工具,或者只是想快速验证一个小改动时,难道就只能干等着吗?其实,你抽屉里那根几块钱的USB转TTL串口线,配合FlyMCU这个轻量级软件,就能完成所有基础烧录工作——而且接线简单到令人发指。
1. 为什么你需要掌握串口烧录技术
在嵌入式开发领域,ST-LINK调试器确实是专业标配,它支持在线调试、断点设置等高级功能。但实际开发中,很多场景下串口烧录才是更实用的选择:
- 成本优势:专业调试器价格在百元以上,而CH340G等USB转TTL模块仅需9.9包邮
- 便携性:调试器需要专用接口,而串口模块可以兼容大多数开发板和电脑
- 应急价值:当调试器驱动异常或硬件故障时,串口烧录能成为救命方案
- 批量生产:量产烧录时,串口方案比调试器更经济高效
典型适用场景:
- 学生党在宿舍快速验证代码
- 硬件工程师在产线进行程序烧录
- 创客开发者制作原型机时的快速迭代
- 维修工程师对设备进行固件升级
注意:串口烧录虽然方便,但不支持在线调试功能。复杂BUG排查仍需配合ST-LINK使用。
2. 硬件准备:接线图解与BOOT模式设置
2.1 必备器材清单
| 器材 | 规格要求 | 备注 |
|---|---|---|
| USB转TTL模块 | 建议CH340G/CP2102 | 需支持3.3V电平 |
| 杜邦线 | 母对母 | 至少需要4根 |
| STM32开发板 | 任何型号 | 需留有UART1接口 |
| 电源 | 5V/3.3V | 开发板供电 |
2.2 关键接线步骤
- TXD-RX交叉连接:模块TXD接开发板UART1_RX(PA10)
- RXD-TX交叉连接:模块RXD接开发板UART1_TX(PA9)
- 共地连接:模块GND接开发板GND
- 电源选择:
- 如果模块有3.3V输出:可给开发板供电
- 否则:需单独给开发板供电
// 典型接线示意图 USB-TTL STM32 TXD -----> PA10(RX) RXD <----- PA9(TX) GND -----> GND 3.3V -----> VCC(可选)2.3 BOOT模式设置秘诀
串口下载需要芯片进入系统存储器启动模式:
- 将BOOT0跳帽接高电平(3.3V)
- BOOT1保持低电平(GND)
- 重新上电后芯片进入烧录模式
- 烧录完成后,将BOOT0恢复低电平
常见坑点:部分开发板没有引出BOOT1引脚,此时保持默认悬空即可。
3. FlyMCU软件实战:从零开始烧录
3.1 软件安装与配置
- 下载FlyMCU(建议0.188以上版本)
- 无需安装,直接运行exe文件
- 首次使用需设置:
- 串口号:设备管理器中查看
- 波特率:常用115200
- 校验位:None
- 数据位:8
- 停止位:1
关键配置项对比:
| 参数 | 推荐值 | 备选方案 |
|---|---|---|
| 波特率 | 115200 | 9600/57600 |
| 编程后执行 | 勾选 | - |
| 校验和 | 不勾选 | - |
| 芯片型号 | 自动识别 | 手动选择 |
3.2 生成HEX文件流程
在Keil中完成编译后:
- 点击"Options for Target"
- 选择"Output"选项卡
- 勾选"Create HEX File"
- 重新编译工程
# 如果使用Makefile编译,需添加以下参数 LDFLAGS += -Wl,--gc-sections -T$(LDSCRIPT) -Wl,-Map=$(TARGET).map OBJCOPYFLAGS += -O ihex $(TARGET).hex: $(TARGET).elf $(OBJCOPY) $(OBJCOPYFLAGS) $< $@3.3 完整烧录步骤
- 连接硬件并设置BOOT模式
- 打开FlyMCU,选择正确串口
- 点击"搜索串口"确认连接
- 载入生成的HEX文件
- 点击"开始编程"按钮
- 观察进度条至100%
- 复位BOOT0,重启设备
状态指示灯解读:
- 红色:通信异常(检查接线)
- 黄色:正在擦除Flash
- 绿色:编程进行中
- 蓝色:校验完成
4. ST-LINK与串口烧录深度对比
4.1 功能差异矩阵
| 特性 | FlyMCU串口 | ST-LINK Utility |
|---|---|---|
| 烧录速度 | 较慢(10KB/s) | 快(50KB/s+) |
| 调试功能 | 不支持 | 全功能调试 |
| 芯片擦除 | 支持 | 支持 |
| 选项字节 | 基础配置 | 完整配置 |
| 内存查看 | 不支持 | 支持 |
| 驱动复杂度 | 即插即用 | 需专用驱动 |
| 成本 | 极低(<10元) | 较高(>100元) |
4.2 实际应用场景选择
选择串口烧录当:
- 仅需程序下载功能
- 临时性代码验证
- 教学演示环境
- 量产烧录场景
选择ST-LINK当:
- 需要单步调试
- 开发复杂算法
- 排查硬件问题
- 修改选项字节
4.3 性能实测数据
对STM32F103C8T6进行16KB程序烧录测试:
串口模式(115200bps):
- 擦除时间:1.2s
- 编程时间:3.8s
- 校验时间:1.5s
- 总计:6.5s
ST-LINK(SWD模式):
- 擦除时间:0.3s
- 编程时间:0.9s
- 校验时间:0.4s
- 总计:1.6s
速度差异主要来自接口协议:串口是异步通信,而SWD是专用调试接口。
5. 高级技巧与故障排除
5.1 提升烧录成功率的秘诀
- 在FlyMCU设置中尝试降低波特率(如改为9600)
- 给CH340模块增加0.1uF的去耦电容
- 使用短线连接(建议<20cm)
- 关闭电脑上其他串口软件
- 在设备管理器中将串口缓冲区调至最低
5.2 常见错误代码解析
| 代码 | 含义 | 解决方案 |
|---|---|---|
| 0x01 | 通信超时 | 检查BOOT模式,重插USB |
| 0x02 | 校验失败 | 降低波特率,检查电源 |
| 0x03 | 擦除失败 | 尝试手动擦除芯片 |
| 0x04 | 编程失败 | 检查HEX文件是否有效 |
| 0x05 | 写保护 | 解除芯片保护后再试 |
5.3 自动化烧录脚本
对于需要频繁烧录的场景,可以使用Python脚本控制FlyMCU:
import serial import time def flash_hex(port, hex_file): ser = serial.Serial(port, 115200, timeout=1) with open(hex_file, 'rb') as f: data = f.read() # 发送魔术字进入烧录模式 ser.write(b'\x7F') time.sleep(0.1) # 分段发送数据 chunk_size = 128 for i in range(0, len(data), chunk_size): chunk = data[i:i+chunk_size] ser.write(chunk) while ser.in_waiting < 1: time.sleep(0.01) ack = ser.read(1) if ack != b'\x79': raise Exception("编程失败") ser.close()6. 扩展应用:FlyMCU的隐藏功能
除了基础烧录,FlyMCU还提供了一些实用功能:
Flash读取与保护:
- 可以读取已烧录的程序(需芯片未加密)
- 支持设置读保护选项字节
- 能够擦除特定扇区而非全片擦除
批量操作技巧:
- 保存当前配置为.ini文件
- 使用命令行参数启动:
FlyMcu.exe -port COM3 -hex test.hex -go - 结合批处理脚本实现自动化
芯片支持扩展: 虽然界面只显示常见型号,但通过修改Device.ini文件,可以添加对新款芯片的支持:
[STM32H750VB] RAM=128K Flash=128K PageSize=0x800 Timeout=10000在工作室环境中,我会为每类开发板制作专用烧录夹具,将BOOT模式切换和串口连接都做成按键式操作,把平均烧录时间压缩到30秒以内。这种小改进在批量生产时能节省大量时间——毕竟工程师最宝贵的就是注意力资源,不该浪费在重复接线这种机械操作上。